Як зупинити запис, перебуваючи в командному рядку?


19

Коли я записую макрос qі закінчую, я можу набрати:

  • q припинити запис, якщо я перебуваю у звичайному або візуальному режимі.
  • <c-o>q припинити запис, якщо я перебуваю у режимі вставки.
  • ..

    Як зупинити запис, якщо мій макрос закінчується в командному режимі?


Який ваш випадок використання для цього? Мені дуже цікаво :)
PhilippFrank

2
@PhilippFrank Я часто шукаю та замінюю один і той же візерунок різними в різних текстових блоках. За допомогою такого макросу вибір блоку, написання фактичної схеми пошуку та розміщення курсору на хорошій позиції для введення ланцюга заміни можна зробити автоматично. Коли я відтворюю його, він вибере блок, увійде в командний режим, наберемо :'<,'>s/toBeReplaced//gпотім курсор між двома, //так що все, що мені потрібно зробити, - це набрати newString<cr>і я закінчую. :)
iago-lito

Так це як макрос з параметром. Дуже приємна ідея, дякую!
PhilippFrank

@PhilippFrank начебто так. Я радий, що тобі це подобається. :)
iago-lito

Відповіді:


12

Іншим рішенням є, коли в режимі командного рядка використовуйте Ctrl-fта натисніть, qщоб зупинити запис.

Ctrl-fдозволяє відкрити вікно командного рядка, в якому ви можете редагувати команду в звичайному режимі. Для перевірки команди просто використовуйте клавішу enter.


Тому після додавання чогось типу:

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

у вашому .vimrc, ви можете використовувати <c-q>для припинення запису макросу в командному режимі.


Флорент


Ви все одно повинні видалити символ <Cf> ( ^F) з кінця макросу, правда? Принаймні, це я бачу.
VanLaser

Майже там! Дійсно корисно (я не знав про вікно командного рядка, але це чудово), але .. aargh! Схоже, що введення цього вікна з режиму вставки втрачає вибрану область. Чи є спосіб зробити команду, яку ви запускаєте з вікна командного рядка, працювати на вибраній області?
iago-lito

@VanLaser Ні, оскільки ви можете продовжувати вводити свою команду у вікні командного рядка. Ваш макрос буде подібний, qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qі тому запис фактично припинився, коли ви вводили командну частину. Щоб використовувати макрос: @qFINISHYOURCOMMAND<cr>і ви закінчили: не потрібно його редагувати. На жаль, це, здається, не працює з візуального режиму (або він втрачає вибір) .. чи я щось пропустив?
iago-lito

Ага, так :) BTW, я міг вибрати візуальний діапазон, потім зробіть, @qі діапазон додався при запуску команди '<,'>- поки макрос почався з :....
VanLaser

@ lago-lito Насправді це виглядає, навіть якщо ви не бачите свій вибір, вказаний діапазон (тобто '<,'>) все ще відповідає вибору під час перевірки команди.
fflorent

17

Один із способів зробити це:

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

В основному ви трохи "обробляєте" свій макрос, оскільки він зберігається в реєстрі :)

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

:let @q = @q[:-2]

Ха-ха! Це насправді був мій хак до цих пір = D. Чи не існує "канонічного" способу цього? (також швидше )
iago-lito

Я не знаю жодного, але я не використовую занадто багато макросів (я вважаю за краще писати невеликі функції замість цього). Макроси почуваються криптовалютними для мене, коли я дивлюся на них згодом.
VanLaser

@VanLaser: чи не могли б ви детальніше розповісти про лінію :let @q = @q[:-2]? Особливо, як [:-2]працює? :-)
statox

Це "нарізка" і працює на списках і рядках (саме так я отримую доступ / встановлюю @qвище). Деякі приклади тут
VanLaser

@VanLaser вони справді виглядають дурними. Однак є корисні для повторення складні дрібниці, які потрібно робити в дуже конкретних випадках. Ви знаєте, що такі проблеми виникають лише один раз і тривають лише кілька хвилин. Бути в змозі з ними боротися, створюючи макроси на льоту і без необхідності писати та налагоджувати виділену функцію просто .. вуа так чудово! ^ ^
iago-lito

3

Прочитавши ваш коментар щодо випадку використання, схоже, ви можете використовувати відображення ключа замість макросу.

У мене є цей рядок у моєму .vimrc (не пам'ятаю, де я його знайшов):

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

Це має схожий ефект з описаним вами випадком використання, виводячи вас в командний рядок, тому єдине, що вам потрібно зробити, - це ввести заміну і натиснути клавішу enter, але в цьому випадку замінити всі зустрічі слова, яке було під вашим курсором .

Щоб просто замінити всередині поточного блоку, я думаю, що щось подібне повинно працювати:

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

Звичайно, ви можете зіставити його на будь-який ключ, який ви хочете.

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


Так, у мене є і цей. Однак у моєму конкретному випадку toBeReplacedшаблон є не таким простим, як "слово під курсором", тому мені потрібен невеликий, специфічний макрос, який я міг би створити в дорозі. І знову: занадто багато конкретного для карти: \ Все одно дякую :)
iago-lito

2
Можливо, поставте шаблон в регістр, а потім адаптуйте вищезгадане відображення, щоб автоматично отримати вміст регістра як toBeReplacedчастину (замість поточного слова під курсором, що є більш обмежуючим).
VanLaser

1
@VanLaser Right, це дозволило б зробити загальне відображення, а також зробило б це набагато простішим: за va{:s/<C-r>0//g<Left><Left>допомогою цього ви можете витягнути будь-який шаблон, який вам потрібен заздалегідь, а потім просто натиснути зібрану клавішу, щоб замінити цей візерунок чимось у поточному блок.
дхакіміан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.