Existe algo como
eval("is_recording()")
que posso chamar no meu vimscript para descobrir se atualmente estou gravando uma macro? Eu teria pensado que isso funciona:
eval("mode(1)")
mas isso apenas retorna "n"
.
Não tenho certeza se isso importa, mas estou usando o neovim; portanto, se é exclusivo do neovim, tudo bem.
Respostas:
Em primeiro lugar, acho que seu problema é principalmente um problema XY . Você deve nos dar mais informações sobre o que está tentando fazer no final e acho que poderíamos encontrar outra solução.
Agora, aqui está uma solução alternativa: provavelmente não é o ideal e certamente não é muito robusto, mas você pode adicionar essas linhas ao seu
.vimrc
:A idéia é que o "modo de gravação" seja alternado exclusivamente quando você pressionar qno modo normal.
Com base nisso, você cria uma variável
g:isRecording
que será alternada toda vez que você iniciar ou parar uma gravação. Desta forma, quando você iniciar a gravaçãog:isRecording
, será definido como1
e0
quando você parar a gravação. Você pode acessar o estado de gravação através do valor da variável.A "desvantagem" é que, para evitar o mapeamento recursivo, você precisará usar Shit-q para iniciar e parar a gravação em vez de q. (Observe que esse não é um problema tão grande: estou usando shift-qpara alternar o modo de gravação há algum tempo, porque não gosto do shift-qcomportamento original )
O principal problema desta solução é que, se você a esqueceu e usa qa variável, ela não será alternada, mas você não poderá desativar q(por exemplo, com
nnoremap q <nop>
) porque, se você fizer shift-qisso, não funcionará mais.fonte
Esta é uma solicitação bastante curiosa, pois não há "modo" para gravar uma macro. Depois de pesquisar alguns documentos, encontrei o seguinte em
usr_10
O destaque para mim foi a linha sobre "Iniciar a gravação de uma macro no registro a"
Como cada macro será salva em um registro por padrão, eu esperava que pudéssemos vê-lo na
:reg
lista. Acontece que funciona como um encanto!Exemplo:
No modo normal:
qaisomething<Esc>
e dentro de
:reg
nós vemos a entrada!Com esse conhecimento, você poderá "espionar" os registros para confirmar que uma macro está sendo gravada (use um registro nomeado em todas as gravações [mapa
q
para sempre usar o mesmo registro (ou algo parecido)]Se você tiver problemas, avise-me e tentarei ajudá-lo (já que essa funcionalidade também é nova para mim: D)
edit Para resolver o problema de um registro que está sendo usado durante o arranco, recomendo procurar um tipo especial de registro que você possa usar apenas para o
vimL
que está escrevendo (nenhum arranco jamais estaria envolvido no registro ("ay
))Aqui estão algumas informações
:help registers
sobre os registros disponíveisSupondo que você tenha um registro que usará agora, o problema passa a ser "como sei quando a gravação parou?". Para cuidar do presente eu dar uma olhada no
autocmd-event
paraCursorHold
; a observação nos documentos de ajuda parece bastante promissora (eu tentaria descobrir como diferenciar cursorHold normal versus o evento ocioso / inexistente que ocorre quando o registro está sendo gravado para os fins da macro)fonte
blackhole register
foi mencionado apenas como uma dica e um petisco interessante de vim que pode levar a algo (não seria útil para gravar macros; como @_ não é utilizável.) Na verdade, você não pode nem tentar salvar a macro a ele ..CursorHold
parece ser um sonho impossível devido ao atraso do queCursorHold
realmente está acontecendo (fez um simples incremento global para acontecer sempre que assistir isso). Ainda incrivelmente interessado em vir acima com uma maneira de fazer isso e vai continuar quebrando meu rosto contra as chaves até que temos uma solução ..q
e alternar uma variável e iniciar / parar a gravação. Um autocomand não pode ser confiável aqui, pois nenhum autocmd é acionado ao pressionar uma tecla e não é possível criar uma função de pesquisa devido à natureza de monotread do Vim. Boa sorte com seus futuros experimentações :-)