Есть ли способ определить, записываюсь ли я в vimscript?

11

Есть что-нибудь подобное

eval("is_recording()")

что я могу вызвать в своем vimscript, чтобы узнать, записываю ли я в данный момент макрос? Я бы подумал, что это работает:

eval("mode(1)")

но это только возвращается "n".

Не уверен, что это имеет значение, но я использую neovim, так что, если он эксклюзивен для neovim, это нормально.

Джеймс
источник
3
ИМХО, это была бы плохая идея - «запись» в таком случае превратилась бы в ложное имя :) Не знаю, что вы пытаетесь сделать, но, возможно, задавая этот вопрос, можно найти разные способы ее решения.
VanLaser
@VanLaser Что вы подразумеваете под ложным именем?
Джеймс
1
Если действие Vim отличается , когда вы записываете его, это означает , что сам процесс записи влияет на действие, когда он должен только «магазин» его для последующего повторения. Что вы ожидаете, когда вы запустите макрос?
VanLaser

Ответы:

4

Во - первых, я думаю , что ваша проблема в основном является проблемой XY . Вы должны дать нам больше информации о том, что вы пытаетесь сделать , в конце концов , и я думаю , что мы могли бы найти другое решение.

Теперь здесь обходной путь, это, вероятно , не является идеальным и , конечно , не очень надежно , но вы можете добавить эти строки в .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

Идея заключается в том, что «режим записи» переключается исключительно при нажатии qв обычном режиме.

Исходя из этого, вы создаете переменную, g:isRecordingкоторая будет переключаться при каждом запуске или остановке записи. Таким образом, при начале записи g:isRecordingбудет установлено значение 1и, 0когда вы остановите запись. Затем вы можете получить доступ к состоянию записи через значение переменной.

«Недостатком» является то, что во избежание рекурсивного сопоставления вам придется использовать, Shit-q чтобы начать и остановить запись вместо q. (Обратите внимание, что это не такая большая проблема: я использовал shift-qдля переключения режима записи в течение некоторого времени, потому что мне не нравится оригинальное shift-qповедение)

Основная проблема этого решения состоит в том, что если вы забыли об этом и используете qпеременную, она не будет переключаться, но вы не можете отключить q(например, с помощью nnoremap q <nop>), потому что если вы не shift-qбудете работать, больше не будет.

statox
источник
2

Это довольно любопытный запрос, так как нет «режима» для записи макроса. После того, как копаться в некоторых документах я нашел следующийusr_10

Вы начинаете с перехода к первому символу первой строки. Далее вы выполняете следующие команды:

qa начать запись макроса в регистр a .

^ Перейти к началу строки.

я # включить "Вставить строку #include" в начале строки.

$ Перейти к концу строки.

a «Добавьте символ двойной кавычки (») в конец строки.

j Перейти к следующей строке.

Остановите запись макроса.

Самой выдающейся вещью для меня была строка «Начать запись макроса в регистр»

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

Пример:

В обычном режиме: qaisomething<Esc>

и внутри :regмы видим запись!

"a   isomething^[

Обладая этим знанием, вы должны иметь возможность «шпионить» за регистрами, чтобы подтвердить, что макрос записывается (используйте именованный регистр для каждой записи [карта, qчтобы всегда использовать один и тот же регистр (или что-то подобное)]

Если у вас возникнут проблемы, дайте мне знать, и я постараюсь вам помочь (поскольку эта функциональность для меня тоже нова: D)

редактировать Для решения вопроса регистра используется во время рывка я рекомендую заглянуть в особый тип регистра , который можно использовать только для vimLвас писать (не рывка бы когда - либо заниматься в реестре ( "ay))

Вот немного информации :help registersо доступных регистрах

Существует десять типов регистров: регистры E354

  1. Безымянный регистр ""

  2. 10 пронумерованных регистров "от 0 до" 9

  3. Небольшой регистр удаления "-

  4. 26 именованных регистров "от А до" Z или от "А до" Z

  5. три регистра только для чтения ":,"., "%

  6. регистр альтернативного буфера "#

  7. регистр выражений "=

  8. Регистры выбора и удаления "*," + и "~

  9. Регистр черной дыры "_

  10. Последний шаблон поиска "/

Предполагая, что у вас есть регистр, который вы собираетесь использовать сейчас, возникает вопрос «как узнать, когда запись остановлена?». Для того, чтобы позаботиться об этом я взять бы взглянуть на autocmd-eventдля CursorHold; примечание в справочных документах выглядит довольно многообещающе (я бы попытался выяснить, как я могу отличить обычное cursorHold от события бездействия / несуществующего, которое происходит, когда ваш регистр записывается для целей макроса)

CursorHold

Когда пользователь не нажимает клавишу в течение времени, указанного в «время обновления». Не запускается повторно до тех пор, пока пользователь не нажмет клавишу (то есть не будет запускать каждые «время обновления» мс, если вы оставите Vim, чтобы сделать кофе. :) См. | CursorHold-example | для предварительного просмотра тегов. Это событие вызывается только в обычном режиме. Он не срабатывает при ожидании ввода аргумента команды или движения после оператора. Во время записи событие CursorHold не срабатывает. | Д |

Дэн Брэдбери
источник
Я действительно не понимаю, как это решает проблему: когда вы заканчиваете запись макроса, строка сохраняется в регистре, но как вы различаете, когда регистр содержит макрос или когда он содержит что-то, поступающее, например, из команды yank. Также регистр сохраняется как один снимок после завершения записи, поэтому, когда вы видите, что содержимое регистра изменилось, вы больше не находитесь в режиме записи.
statox
Я надеялся, что вы сможете использовать что-то вроде регистра черной дыры (регистра, который никогда не будет выдернут). Если у вас заблокирован этот регистр, вы можете проверить CursorHold, который работает в режиме записи (в моем ответе появится дополнительная информация, чтобы узнать, поможет ли это вам)
Дэн Брэдбери,
добавили некоторую информацию о других регистрах (способ избежать конфликтов с янки) и подсказку о том, как мы можем отловить «запись», когда CursorHold не активен во время записи макроса. Если после этих заметок вы все еще боретесь с этим, дайте мне знать, и я могу попытаться реализовать его после окончания работы. Как примечание, это blackhole registerбыло упомянуто только как подсказка и интересный лакомый кусочек vim, который может привести к чему-либо (бесполезно использовать при записи макросов, так как @_ не может использоваться.) На самом деле вы даже не можете попытаться сохранить макрос к нему ..
Дэн Брэдбери
Я потратил некоторое время на эту последнюю ночь (после удара пивной клавиатуры) и обнаружил, что невероятно трудно точно определить, когда запись происходит и заканчивается. Моя догадка CursorHoldкажется несбыточной мечтой из-за запаздывания CursorHold фактического события (каждый раз, чтобы наблюдать за этим, происходил простой глобальный прирост). Все еще невероятно заинтересован в том, чтобы придумать способ сделать это, и буду продолжать бить меня по клавишам, пока у нас не будет решения ..
Дэн Брэдбери
По моему мнению, у вас нет тысячи различных опций: вам нужно переопределить поведение qи сделать его переключением переменной и начать / остановить запись. Автокоманда здесь не может быть надежной, так как при нажатии клавиши не запускается autocmd, а функция опроса невозможна из-за монотонной природы Vim. Удачи в ваших будущих экспериментах :-)
statox