Мені відомо лише про один примірник використання регістрів, через який CtrlR*я вставляю текст із буфера обміну.
Які ще існують регістри? Як ними користуватися?
Все, що ви знаєте про VI регістри (зосередимось на vi 7.2) - поділіться з нами.
Мені відомо лише про один примірник використання регістрів, через який CtrlR*я вставляю текст із буфера обміну.
Які ще існують регістри? Як ними користуватися?
Все, що ви знаєте про VI регістри (зосередимось на vi 7.2) - поділіться з нами.
Відповіді:
Реєстри в Vim дозволяють виконувати дії або команди над текстом, що зберігається в них. Щоб отримати доступ до реєстру, ви вводите "a
перед командою, де a
назва імені. Якщо ви хочете скопіювати поточний рядок в регістр k
, ви можете ввести
"kyy
Або ви можете додати до реєстру за допомогою великої літери
"Kyy
Потім можна перемістити документ і вставити його в інше місце, використовуючи
"kp
Щоб вставити з системного буфера обміну в Linux
"+p
Щоб вставити з системного буфера обміну в Windows (або з буфера обміну "миша" в Linux)
"*p
Для доступу до всіх визначених на даний момент типів регістрів
:reg
"+
це спеціальний реєстр, який посилається на буфер обміну системи.
"*
; тому команда копіювати до кінця файлу стає "*yG
.
*
- буфер обміну "виділення миші" і буфер обміну +
Ctrl-XCV.
+
)?
Я був задоволений, коли відкрив 0
реєстр. Якщо ви витягуєте текст, не призначаючи його до певного реєстру, він буде присвоєний 0
реєстру, а також збережений у "
регістрі за замовчуванням . Різниця між регістрами 0
та "
регістрами полягає в тому, що 0
він заповнюється лише текстом, який перетягується, тоді як регістр за замовчуванням також заповнюється текстом, видаленим за допомогою команд d
/ D
/ x
/ X
/ c
/ C
/ s
/ S
.
Я вважаю це корисним, коли хочу скопіювати якийсь текст, видалити щось і замінити його скопійованим текстом. Наступні кроки ілюструють приклад:
y[motion]
- цей текст зберігається у "
та0
реєструєтьсяd[motion]
- цей текст зберігається в "
регістрі"0p
де "
команда використовувати регістр для наступної команди.
На останньому кроці, якщо ви повинні вставити з реєстру за замовчуванням (з p
), він буде використовувати текст, який ви тільки що видалили (можливо, не те, що ви задумали).
Зауважте, що p
або P
вставляє з регістру за замовчуванням. Довгий еквівалент буде ""p
(або ""P
) та"0
містить останню янку,"1
містить останнє видалення або зміна.
Більше інформації див :help registers
.
p
або P
вставляє з регістру за замовчуванням. Довгий еквівалент буде ""p
(або ""P
).
"
це команда використання регістра для наступної команди. Таким чином ""p
, використовував би "
регістр для команди paste і "0p
використовував 0
регістр.
0p
означало б перейти до першого символу поточного рядка та вставити зі вмісту регістру за замовчуванням ( "
). "p
буде неповною командою, оскільки вам потрібно вказати, для якої команди використовувати реєстр p
.
Одна з моїх улюблених частин про регістри - це використання їх як макросів!
Скажімо, ви маєте справу з файлом значень з обмеженими вкладками як таким:
ID Df %Dev Lambda
1 0 0.000000 0.313682
2 1 0.023113 0.304332
3 1 0.044869 0.295261
4 1 0.065347 0.286460
5 1 0.084623 0.277922
6 1 0.102767 0.269638
7 1 0.119845 0.261601
Тепер ви вирішите, що вам потрібно додати знак відсотка в кінці поля% Dev (починаючи з 2-го рядка). Ми зробимо простий макрос у (довільно вибраному) m
реєстрі наступним чином:
Натисніть:: qm
Щоб почати запис макросу під m
регістром.
EE
: Перейдіть до кінця 3 стовпця.
a
: Вставте режим для додавання до кінця цього стовпця.
%
: Введіть знак відсотка, який ми хочемо додати.
<ESC>
: Повернення в командний режим.
j0
: Перехід до початку наступного рядка.
q
: Зупинення запису макросу
Тепер ми можемо просто ввести @m
для запуску цього макросу поточний рядок. Крім того, ми можемо набрати @@
повторення або 100@m
зробити це 100 разів! Життя виглядає досить добре.
У цей момент ви повинні сказати: " АЛЕ ЗАЧЕКАЙТЕ, ЩО ХЕКЦЬ ЦЕ МАЄ ЗРОБИТИ З РЕЄСТРАМИ ?"
Відмінний момент. Давайте дослідимо, що є у вмісті m
реєстру, набравши текст "mp
. Потім ми отримуємо наступне:
EEa%<ESC>j0
Спочатку це виглядає так, що ви випадково відкрили двійковий файл у блокноті, але з другого погляду - це точна послідовність символів у нашому макросі!
Ви допитлива людина, тож давайте зробимо щось цікаве та відредагуйте цей рядок тексту, щоб вставити !
замість нудного старого %
.
EEa!<ESC>j0
Тоді давайте внесемо це до n
реєстру, набравши B"nyE
. Тоді, тільки для ударів, давайте запустимо n
макрос у рядку наших даних, використовуючи @n
....
OMG, ДОДАТО А !
По суті, запуск макросу - це як натискання точної послідовності клавіш у регістрі цього макросу. Якщо це не крутий реєстраційний трюк, я з'їм свою шапку.
+
замість, j0
щоб перейти до першого непорожнього символу у наступному рядку.
Інші корисні регістри:
"*
або "+
- вміст буфера обміну системи
"/
- остання команда пошуку
":
- остання команда.
Зверніть увагу на макроси vim, ви можете їх редагувати, оскільки вони є лише списком натискань клавіш, які використовуються під час запису макросу. Таким чином, ви можете написати в текстовий файл макрос (використовуючи "ap
для написання макроса a ) і відредагувати їх і завантажити в реєстр "ay$
. Хороший спосіб зберігання корисних макросів.
vim --version
- -clipboard
означає, що у вас її немає, +clipboard
значить, у вас є."
"*
і "+
ще крутіше: "+
вставляє останній текст, скопійований ctrl+c
(буфер копіювання), або будь-який ярлик, який ви використовуєте (або right-click>copy
). "*
вставляє останній текст, виділений мишею (буфер вибору). Тож якщо ви скопіюєте щось ctrl+c
, а потім виділіть щось інше за допомогою миші, ви можете вибрати, яку саме вставити. Це не працює в Windows, де ці два регістри є синонімами.
"*
і "+
роками! Я подумав, що лише gvim має доступ до буферних системних буферів, але, мабуть, звичайний vim також робить!
-xterm_clipboard
увімкнено vim --version
. Будь-який простий пакет для встановлення? (debian / apt-get). Дякую.
Регістр чорної діри _
є/dev/null
регістри.
Я використовую його у своєму vimrc, щоб дозволити видалення одиночних символів без оновлення реєстру за замовчуванням:
noremap x "_x
і вставити у візуальному режимі без оновлення регістра за замовчуванням:
vnoremap p "_dP
x
стає менш зручним для переміщення символів.
x
відображення ви більше не можете виконувати xp
"команду" для перемикання струму з наступним символом. Досить корисний для виправлень помилок. Ми також повинні Xp
переключити струм з попереднім символом.
Якщо ви хочете коли-небудь вставити вміст регістра в команду колишнього режиму, натисніть <C-r><registerletter>
.
Навіщо ти це використовуєш? Мені хотілося зробити пошук і замінити довгу рядок, тому я вибрав його у візуальному режимі, почав набирати вираз пошуку / заміни :%s/[PASTE YANKED PHRASE]//g
і пішов у свій день.
Якщо ви хочете вставити одне слово лише в колишній режим, переконайтесь, що курсор знаходиться на ньому перед входом у колишній режим, а потім натисніть, <C-r><C-w>
коли в колишньому режимі вставити слово.
:
командному рядку - це найкраще, що я сьогодні дізнався
/[write out your regex]<cr>
а потім замінити тільки s/<C-R>//replacement/
. Таким чином ви отримуєте перевагу живих відгуків про ваш регулярний вираз перед запуском заміни.
Я думаю, що секретним реєстром гуру є вираз = регістр. Його можна використовувати для творчих відображень.
:inoremap \d The current date <c-r>=system("date")<cr>
Ви можете використовувати його разом із вашою системою, як описано вище, або отримувати відповіді від користувацьких функцій VimL тощо.
або просто спеціальні речі на кшталт
<c-r>=35+7<cr>
Класна хитрість - використовувати "1p
для вставки останнього видалення / зміни (а потім використовувати .
кілька разів, щоб вставити наступні видалення. Іншими словами, "1p...
в основному еквівалентний "1p"2p"3p"4p
.
Ви можете скористатися цим способом, щоб замовити кілька рядків у зворотному порядку:
dddddddddd"1p....
На сторінці довідки Vim:
CTRL-R {0-9a-z"%#:-=.} *c_CTRL-R* *c_<C-R>*
Insert the contents of a numbered or named register. Between
typing CTRL-R and the second character '"' will be displayed
<...snip...>
Special registers:
'"' the unnamed register, containing the text of
the last delete or yank
'%' the current file name
'#' the alternate file name
'*' the clipboard contents (X11: primary selection)
'+' the clipboard contents
'/' the last search pattern
':' the last command-line
'-' the last small (less than a line) delete
'.' the last inserted text
*c_CTRL-R_=*
'=' the expression register: you are prompted to
enter an expression (see |expression|)
(doesn't work at the expression prompt; some
things such as changing the buffer or current
window are not allowed to avoid side effects)
When the result is a |List| the items are used
as lines. They can have line breaks inside
too.
When the result is a Float it's automatically
converted to a String.
See |registers| about registers. {not in Vi}
<...snip...>
nmap <F2> @q
я використовую регістр q, тому що тоді для збереження макросу для F2 для відтворення я просто натиснув qq
. швидке збереження та повторення макросу.
Я використовую регістр за замовчуванням, щоб grep для тексту у вікні vim, не маючи потреби до миші.
:!grep "<CTRL-R>0"<CR>
Використовуйте регістри в командах з @
. Наприклад:
echo @a
echo @0
echo @+
Встановіть їх у команді:
let @a = 'abc'
Тепер "ap
приклеюємо abc
.
Великим джерелом плутанини є регістр за замовчуванням "
. Важливо знати, як це працює. Набагато краще, якщо більшість випадків уникати реєстру за замовчуванням. Пояснення з документації Vim:
Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g. "xdd). This is like the unnamed register is pointing
to the last used register.
Отже, регістр за замовчуванням насправді є вказівником на останній використаний регістр. Коли ви видаляєте або відбираєте щось, цей реєстр буде вказувати на інші регістри. Ви можете перевірити це, перевіривши регістри. Завжди є ще один реєстр, який точно такий же, як і регістр за замовчуванням: регістр yank ( "0
), перший регістр видалення ( "1
), малий регістр видалення ( "-
) або будь-який інший регістр, який використовувався для видалення або вибивання.
Єдиним винятком є регістр чорних дір. Vim doc каже:
An exception is the '_' register: "_dd does not store the deleted text in any
register.
Як правило , ви набагато краще, використовуючи безпосередньо: "0
, "-
і "1-"9
регістри по замовчуванням або іменовані регістри.
Один занедбаний реєстр - "." точковий реєстр, який містить останній вставлений текст незалежно від того, як він був вставлений, наприклад, ct] (змінити до]). Тоді ви розумієте, що вам потрібно вставити його деінде, але не можете використовувати метод крапки.
:reg .
:%s/fred/<C-R>./
Мій друг Брайан написав про це вичерпну статтю. Я думаю, що це чудовий вступ до використання тем. https://www.brianstorti.com/vim-registers/