Як я можу використовувати регістри vim?


925

Мені відомо лише про один примірник використання регістрів, через який CtrlR*я вставляю текст із буфера обміну.

Які ще існують регістри? Як ними користуватися?

Все, що ви знаєте про VI регістри (зосередимось на vi 7.2) - поділіться з нами.


22
Я дав довгу відповідь там щодо використання регістрів
Бенуа

Відповіді:


1185

Реєстри в Vim дозволяють виконувати дії або команди над текстом, що зберігається в них. Щоб отримати доступ до реєстру, ви вводите "aперед командою, де aназва імені. Якщо ви хочете скопіювати поточний рядок в регістр k, ви можете ввести

"kyy

Або ви можете додати до реєстру за допомогою великої літери

"Kyy

Потім можна перемістити документ і вставити його в інше місце, використовуючи

"kp

Щоб вставити з системного буфера обміну в Linux

"+p

Щоб вставити з системного буфера обміну в Windows (або з буфера обміну "миша" в Linux)

"*p

Для доступу до всіх визначених на даний момент типів регістрів

:reg

165
І "+це спеціальний реєстр, який посилається на буфер обміну системи.
Аарон Макдейд

17
У Windows можна отримати доступ до буфера обміну "*; тому команда копіювати до кінця файлу стає "*yG.
Адітя МП

44
У X (Linux, можливо, також і OS-X) *- буфер обміну "виділення миші" і буфер обміну +Ctrl-XCV.
dotancohen

20
Чи є спосіб додати до реєстру буфера обміну (оскільки капіталу немає +)?
naitsirhc

8
@dotancohen Технічно це називається ПРИМІТНИЙ вибір, але я думаю, що "миша підсвічування" людям легше отримати :)
kyrias

783

Я був задоволений, коли відкрив 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.


17
pабо Pвставляє з регістру за замовчуванням. Довгий еквівалент буде ""p(або ""P).
nelstrom

186
До речі, таким же чином "0 тримає останню янку", 1 тримає останнє видалення або зміну.
FireAphis

6
"це команда використання регістра для наступної команди. Таким чином ""p, використовував би "регістр для команди paste і "0pвикористовував 0регістр.
Рамон Марко Л. Наварро

5
0pозначало б перейти до першого символу поточного рядка та вставити зі вмісту регістру за замовчуванням ( "). "pбуде неповною командою, оскільки вам потрібно вказати, для якої команди використовувати реєстр p.
Рамон Марко Л. Наварро

15
Точно так само "1 тримає останнє видалення", 2 тримає друге останнє видалення ", 3 тримає третє останнє і т.д. до" 9
Джеймс

330

Одна з моїх улюблених частин про регістри - це використання їх як макросів!

Скажімо, ви маєте справу з файлом значень з обмеженими вкладками як таким:

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реєстрі наступним чином:

  1. Натисніть:: qmЩоб почати запис макросу під mрегістром.

  2. EE: Перейдіть до кінця 3 стовпця.

  3. a: Вставте режим для додавання до кінця цього стовпця.

  4. %: Введіть знак відсотка, який ми хочемо додати.

  5. <ESC>: Повернення в командний режим.

  6. j0: Перехід до початку наступного рядка.

  7. q: Зупинення запису макросу

Тепер ми можемо просто ввести @mдля запуску цього макросу поточний рядок. Крім того, ми можемо набрати @@повторення або 100@mзробити це 100 разів! Життя виглядає досить добре.

У цей момент ви повинні сказати: " АЛЕ ЗАЧЕКАЙТЕ, ЩО ХЕКЦЬ ЦЕ МАЄ ЗРОБИТИ З РЕЄСТРАМИ ?"

Відмінний момент. Давайте дослідимо, що є у вмісті mреєстру, набравши текст "mp. Потім ми отримуємо наступне:

EEa%<ESC>j0

Спочатку це виглядає так, що ви випадково відкрили двійковий файл у блокноті, але з другого погляду - це точна послідовність символів у нашому макросі!

Ви допитлива людина, тож давайте зробимо щось цікаве та відредагуйте цей рядок тексту, щоб вставити !замість нудного старого %.

EEa!<ESC>j0

Тоді давайте внесемо це до nреєстру, набравши B"nyE. Тоді, тільки для ударів, давайте запустимо nмакрос у рядку наших даних, використовуючи @n....

OMG, ДОДАТО А !

По суті, запуск макросу - це як натискання точної послідовності клавіш у регістрі цього макросу. Якщо це не крутий реєстраційний трюк, я з'їм свою шапку.


65
Це абсолютно ключово. Я досі не помічав, що регістри такі ж, як макро буфери. Це означає, що ви можете просто зберігати всі свої макроси в тексті, витягувати їх та запускати їх. Досить круто і трохи дивно. Дуже Вим.
naught101

1
Це незначна редакційна примітка, але цей заголовок із жирним шрифтом ... Це можна було виправити. Наразі це досить неприємно.
ашрасун

1
Ви можете використовувати +замість, j0щоб перейти до першого непорожнього символу у наступному рядку.
Гокуль

100

Інші корисні регістри:

"* або "+ - вміст буфера обміну системи

"/ - остання команда пошуку

": - остання команда.

Зверніть увагу на макроси vim, ви можете їх редагувати, оскільки вони є лише списком натискань клавіш, які використовуються під час запису макросу. Таким чином, ви можете написати в текстовий файл макрос (використовуючи "apдля написання макроса a ) і відредагувати їх і завантажити в реєстр "ay$. Хороший спосіб зберігання корисних макросів.


6
Вимкнення vim для OSX не включає інтеграцію "*. Ви можете встановити версію від homebrew-alt, яка це робить. Перевірте vim --version- -clipboardозначає, що у вас її немає, +clipboardзначить, у вас є."
Xavier Shay

15
У X11 "*і "+ще крутіше: "+вставляє останній текст, скопійований ctrl+c(буфер копіювання), або будь-який ярлик, який ви використовуєте (або right-click>copy). "*вставляє останній текст, виділений мишею (буфер вибору). Тож якщо ви скопіюєте щось ctrl+c, а потім виділіть щось інше за допомогою миші, ви можете вибрати, яку саме вставити. Це не працює в Windows, де ці два регістри є синонімами.
naught101

1
Благослови, я шукав "*і "+роками! Я подумав, що лише gvim має доступ до буферних системних буферів, але, мабуть, звичайний vim також робить!
Тарраш

@Tarrasch Якщо ви використовуєте консоль vim замість gvim, ви відкриєте для себе ще багато речей. Я думаю. відвідайте також #vim на freenode!
trusktr

1
Як увімкнути, якщо він -xterm_clipboardувімкнено vim --version. Будь-який простий пакет для встановлення? (debian / apt-get). Дякую.
Доктор Беко,

77

Регістр чорної діри _ є/dev/null регістри.

Я використовую його у своєму vimrc, щоб дозволити видалення одиночних символів без оновлення реєстру за замовчуванням:

noremap x "_x

і вставити у візуальному режимі без оновлення регістра за замовчуванням:

vnoremap p "_dP

Друге відображення також дуже корисно. Дивіться тут для пояснення: marcorucci.com/blog/#visualModePaste
mrucci

21
картографування xстає менш зручним для переміщення символів.
skeept

Натискання кнопки x не стирає останнього, що ви зіткнули, і ви знайдете це в реєстрі 0. Натисніть xa кілька разів, а потім "0p, щоб вставити те, що ви
постригли

2
Щоб розширити вище зауваження скептика: за допомогою цього xвідображення ви більше не можете виконувати xp"команду" для перемикання струму з наступним символом. Досить корисний для виправлень помилок. Ми також повинні Xpпереключити струм з попереднім символом.
Даніель Андерссон

56

Якщо ви хочете коли-небудь вставити вміст регістра в команду колишнього режиму, натисніть <C-r><registerletter>.

Навіщо ти це використовуєш? Мені хотілося зробити пошук і замінити довгу рядок, тому я вибрав його у візуальному режимі, почав набирати вираз пошуку / заміни :%s/[PASTE YANKED PHRASE]//gі пішов у свій день.

Якщо ви хочете вставити одне слово лише в колишній режим, переконайтесь, що курсор знаходиться на ньому перед входом у колишній режим, а потім натисніть, <C-r><C-w>коли в колишньому режимі вставити слово.


6
Вставка тексту в :командному рядку - це найкраще, що я сьогодні дізнався
Шахбаз

1
Ви також можете використовувати <CR> <registerletter> у режимі вставки
Floegipoky

1
Мені подобається писати знахідку / перший замінити регулярні вирази тільки з , /[write out your regex]<cr>а потім замінити тільки s/<C-R>//replacement/. Таким чином ви отримуєте перевагу живих відгуків про ваш регулярний вираз перед запуском заміни.
GabeIsman

44

Я думаю, що секретним реєстром гуру є вираз = регістр. Його можна використовувати для творчих відображень.

:inoremap  \d The current date <c-r>=system("date")<cr>

Ви можете використовувати його разом із вашою системою, як описано вище, або отримувати відповіді від користувацьких функцій VimL тощо.

або просто спеціальні речі на кшталт

<c-r>=35+7<cr>

3
Ознайомтесь із [відео про використання реєстру виразів] Derek Wyatt ( derekwyatt.org/vim/vim-tutorial-videos/… )
Джеромі Англім

1
Посилання від @JeromyAnglim тепер тут: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

Класна хитрість - використовувати "1pдля вставки останнього видалення / зміни (а потім використовувати .кілька разів, щоб вставити наступні видалення. Іншими словами, "1p...в основному еквівалентний "1p"2p"3p"4p.

Ви можете скористатися цим способом, щоб замовити кілька рядків у зворотному порядку: dddddddddd"1p....


ага це фантастично. Мені дуже хочеться однакової поведінки у
янців

18

На сторінці довідки 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...>

17
  • q5 записує зміни в регістр 5 (наступний q припиняє запис)
  • : reg показує всі регістри та будь-який вміст у них
  • @ 5 виконати реєстр 5 макросів (записані зміни)

15
Мені не подобається клавіша @ запускати макроси (три натискання клавіш). Тому я склав F2 для запуску макросу, що зберігається в регістрі q: nmap <F2> @q я використовую регістр q, тому що тоді для збереження макросу для F2 для відтворення я просто натиснув qq. швидке збереження та повторення макросу.
Андрій Пандков

16

Я використовую регістр за замовчуванням, щоб grep для тексту у вікні vim, не маючи потреби до миші.

  1. текст
  2. :!grep "<CTRL-R>0"<CR>

12

Використовуйте регістри в командах з @. Наприклад:

echo @a
echo @0
echo @+

Встановіть їх у команді:

let @a = 'abc'

Тепер "apприклеюємо abc.


8

Великим джерелом плутанини є регістр за замовчуванням ". Важливо знати, як це працює. Набагато краще, якщо більшість випадків уникати реєстру за замовчуванням. Пояснення з документації 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регістри по замовчуванням або іменовані регістри.


8

Один занедбаний реєстр - "." точковий реєстр, який містить останній вставлений текст незалежно від того, як він був вставлений, наприклад, ct] (змінити до]). Тоді ви розумієте, що вам потрібно вставити його деінде, але не можете використовувати метод крапки.

 :reg .
 :%s/fred/<C-R>./

7

Мій улюблений реєстр - це ':'реєстр. Запуск @:у звичайному режимі дозволяє мені повторити попередньо виконану колишню команду.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.