Есть что-нибудь подобное
eval("is_recording()")
что я могу вызвать в своем vimscript, чтобы узнать, записываю ли я в данный момент макрос? Я бы подумал, что это работает:
eval("mode(1)")
но это только возвращается "n"
.
Не уверен, что это имеет значение, но я использую neovim, так что, если он эксклюзивен для neovim, это нормально.
Ответы:
Во - первых, я думаю , что ваша проблема в основном является проблемой XY . Вы должны дать нам больше информации о том, что вы пытаетесь сделать , в конце концов , и я думаю , что мы могли бы найти другое решение.
Теперь здесь обходной путь, это, вероятно , не является идеальным и , конечно , не очень надежно , но вы можете добавить эти строки в
.vimrc
:Идея заключается в том, что «режим записи» переключается исключительно при нажатии qв обычном режиме.
Исходя из этого, вы создаете переменную,
g:isRecording
которая будет переключаться при каждом запуске или остановке записи. Таким образом, при начале записиg:isRecording
будет установлено значение1
и,0
когда вы остановите запись. Затем вы можете получить доступ к состоянию записи через значение переменной.«Недостатком» является то, что во избежание рекурсивного сопоставления вам придется использовать, Shit-q чтобы начать и остановить запись вместо q. (Обратите внимание, что это не такая большая проблема: я использовал shift-qдля переключения режима записи в течение некоторого времени, потому что мне не нравится оригинальное shift-qповедение)
Основная проблема этого решения состоит в том, что если вы забыли об этом и используете qпеременную, она не будет переключаться, но вы не можете отключить q(например, с помощью
nnoremap q <nop>
), потому что если вы не shift-qбудете работать, больше не будет.источник
Это довольно любопытный запрос, так как нет «режима» для записи макроса. После того, как копаться в некоторых документах я нашел следующий
usr_10
Самой выдающейся вещью для меня была строка «Начать запись макроса в регистр»
Поскольку каждый макрос будет сохранен в регистр по умолчанию, я надеялся, что мы сможем увидеть его в
:reg
списке. Оказывается, это работает как шарм!Пример:
В обычном режиме:
qaisomething<Esc>
и внутри
:reg
мы видим запись!Обладая этим знанием, вы должны иметь возможность «шпионить» за регистрами, чтобы подтвердить, что макрос записывается (используйте именованный регистр для каждой записи [карта,
q
чтобы всегда использовать один и тот же регистр (или что-то подобное)]Если у вас возникнут проблемы, дайте мне знать, и я постараюсь вам помочь (поскольку эта функциональность для меня тоже нова: D)
редактировать Для решения вопроса регистра используется во время рывка я рекомендую заглянуть в особый тип регистра , который можно использовать только для
vimL
вас писать (не рывка бы когда - либо заниматься в реестре ("ay
))Вот немного информации
:help registers
о доступных регистрахПредполагая, что у вас есть регистр, который вы собираетесь использовать сейчас, возникает вопрос «как узнать, когда запись остановлена?». Для того, чтобы позаботиться об этом я взять бы взглянуть на
autocmd-event
дляCursorHold
; примечание в справочных документах выглядит довольно многообещающе (я бы попытался выяснить, как я могу отличить обычное cursorHold от события бездействия / несуществующего, которое происходит, когда ваш регистр записывается для целей макроса)источник
blackhole register
было упомянуто только как подсказка и интересный лакомый кусочек vim, который может привести к чему-либо (бесполезно использовать при записи макросов, так как @_ не может использоваться.) На самом деле вы даже не можете попытаться сохранить макрос к нему ..CursorHold
кажется несбыточной мечтой из-за запаздыванияCursorHold
фактического события (каждый раз, чтобы наблюдать за этим, происходил простой глобальный прирост). Все еще невероятно заинтересован в том, чтобы придумать способ сделать это, и буду продолжать бить меня по клавишам, пока у нас не будет решения ..q
и сделать его переключением переменной и начать / остановить запись. Автокоманда здесь не может быть надежной, так как при нажатии клавиши не запускается autocmd, а функция опроса невозможна из-за монотонной природы Vim. Удачи в ваших будущих экспериментах :-)