Как остановить запись в командной строке?

19

Когда я записываю макрос с помощью qи все готово, я могу набрать:

  • q остановить запись, если я нахожусь в нормальном или визуальном режиме.
  • <c-o>q остановить запись, если я в режиме вставки.
  • ..

    Как остановить запись, если мой макрос заканчивается в командном режиме?

Яго-лито
источник
Какой у вас вариант использования для этого? Мне действительно просто любопытно :)
PhilippFrank
2
@PhilippFrank Я буду часто искать и заменять один и тот же шаблон на разные в разных блоках текста. С помощью такого макроса выбор блока, написание фактического шаблона поиска и установка курсора в правильное положение для ввода цепочки замены могут выполняться автоматически. Когда я играю, он выбирает блок, входит в командный режим, печатает, :'<,'>s/toBeReplaced//gзатем помещает курсор между ними, //так что все, что мне нужно сделать, это набрать, newString<cr>и я готов. :)
Яго-Лито
Так что это как макрос с параметром. Очень хорошая идея, спасибо!
PhilippFrank
@PhilippFrank вроде как, да. Я рада что тебе нравиться. :)
Яго-Лито

Ответы:

12

Другое решение - в режиме командной строки используйте Ctrl-fи нажмите, qчтобы остановить запись.

Ctrl-fпозволяет открыть окно командной строки, в котором вы можете редактировать команду в обычном режиме. Чтобы подтвердить команду, просто используйте ввод.


Поэтому после добавления что-то вроде:

cnoremap <c-q> <c-f>i<c-o>q

в вашем .vimrc, вы можете использовать, <c-q>чтобы остановить запись макроса, находясь в командном режиме.


Флоран

fflorent
источник
Вам все еще нужно удалить символ <Cf> ( ^F) из конца макроса, верно? По крайней мере, это то, что я вижу.
VanLaser
Почти готово! Действительно полезно (я не знал об окне командной строки, но это здорово), но .. аааа! Кажется, что вход в эти окна из режима вставки теряет выбранную область. Есть ли способ заставить команду, которую вы запускаете из окна командной строки, работать в выбранной области?
Яго-Лито
@VanLaser Нет, так как вы можете продолжить вводить команду в окне командной строки. Ваш макрос будет похож, qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qи поэтому запись фактически остановилась, пока вы печатали командную часть. Чтобы использовать макрос: @qFINISHYOURCOMMAND<cr>и все готово: не нужно его редактировать. К сожалению, это не работает в визуальном режиме (или теряет выделение) .. или я что-то пропустил?
Яго-Лито
Ах, да :) Кстати, я мог выбрать визуальный диапазон, а затем сделать @qи диапазон был добавлен при запуске команды '<,'>- до тех пор, пока макрос начинался с :....
VanLaser
@ lago-lito На самом деле, похоже, что даже если вы не видите свой выбор, указанный диапазон (т. е. '<,'>) все еще совпадает с выбором при проверке команды.
fflorent
17

Один из способов сделать это:

  • начните свой макрос как обычно (например qq... другие символы)
  • когда вы достигнете cmdline-режима, напишите все символы, которые вы хотите
  • Вы хотите закончить макрос здесь. Нажмите, ESCчтобы выйти из cmdline-mode, qчтобы завершить макрос.
  • удалите ESCиз своего qрегистра (*): вы можете вставить его в буфер, удалить ^[символ, снова выбрать весь материал (символьно) и вернуть его обратно для регистрации q.
  • это так: запустить макрос: @q.

По сути, вы немного «пост-обрабатываете» свой макрос, так как он хранится в регистре :)

(*) Быстрый способ удалить последний символ из макроса, хранящегося в регистре q:

:let @q = @q[:-2]
VanLaser
источник
Ха - ха! До сих пор это был мой взлом = D. Разве нет «канонического» способа сделать это? (также быстрее )
Яго-Лито
Я не знаю ни одного, но я не слишком часто использую макросы (вместо этого я предпочитаю писать небольшие функции). Макросы кажутся мне загадочными, когда я смотрю на них потом.
VanLaser
@VanLaser: не могли бы вы рассказать немного подробнее о линии :let @q = @q[:-2]? Особенно, как [:-2]работает? :-)
statox
Это «нарезка» и работает со списками и строками (вот как я получаю доступ / установлен @qвыше). Некоторые примеры здесь
VanLaser
@VanLaser, они действительно выглядят загадочно. Однако есть полезные для повторения, изощренные мелочи, которые вам нужно делать в очень специфических случаях ... вы знаете такие проблемы, которые появляются только один раз и длятся всего несколько минут. Возможность иметь дело с ними, создавая макросы на лету и без необходимости писать и отлаживать выделенную функцию, это просто ... так здорово! ^ ^
Яго-Лито
3

Прочитав ваш комментарий о сценарии использования, похоже, что вы можете использовать сопоставление клавиш вместо макроса.

У меня есть эта строка в моем .vimrc (не помню, где я ее нашел):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Он имеет эффект, аналогичный описанному выше варианту использования, помещая вас в командную строку, поэтому единственное, что вам нужно сделать, это ввести замену и нажать клавишу ввода, но в этом случае заменить все вхождения слова, которое было под вашим курсором. ,

Чтобы просто заменить внутри текущего блока, я думаю, что что-то вроде следующего должно работать:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Конечно, вы можете сопоставить его с любым ключом, который вы хотите.

Что делает выше: отметьте текущую позицию с помощью неназванного маркера, визуально выберите текущий блок, выйдите из визуального режима и верните курсор в сохраненную позицию (маркеры визуального выбора все еще установлены), войдите в командный режим и введите команду замены вставив слово, которое было под курсором <C-r><C-w>, и поместив курсор, чтобы напечатать замену.

dhakimian
источник
Да, у меня тоже есть этот. Однако в моем конкретном случае использования toBeReplacedшаблон не так прост, как «слово под курсором», поэтому мне нужен небольшой, специфический макрос, который я мог бы создать на ходу. И еще раз: слишком много информации для карты: \ В любом случае, спасибо :)
iago-lito
2
Возможно, поместите шаблон в регистр, а затем адаптируйте приведенное выше отображение, чтобы автоматически получать содержимое регистра как toBeReplacedчасть (вместо текущего слова под курсором, что является более ограничивающим).
VanLaser
1
@VanLaser Правильно, это позволило бы сделать общее сопоставление, а также сделало бы его намного проще: va{:s/<C-r>0//g<Left><Left>с этим вы можете восстановить любой шаблон, который вам нужен, и затем просто нажать отображенную клавишу, чтобы заменить этот шаблон чем-то в текущем блок.
Дакимян