Existe uma maneira de detectar se estou gravando em vimscript?

11

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.

James
fonte
3
IMHO, seria uma má idéia - "gravação", nesse caso, se tornaria um nome falso :) Não sei o que você está tentando fazer, mas talvez fazer essa pergunta possa fornecer maneiras diferentes de resolvê-lo.
21416 VanLaser
@VanLaser O que você quer dizer com nome falso?
James
1
Se uma ação do Vim for diferente quando você estiver gravando, significa que o próprio processo de gravação afeta a ação, quando deve "armazená-la" apenas para repetição posterior. O que você espera que aconteça ao executar a macro?
23416 VanLaser

Respostas:

4

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:

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

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

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:isRecordingque será alternada toda vez que você iniciar ou parar uma gravação. Desta forma, quando você iniciar a gravação g:isRecording, será definido como 1e 0quando 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.

statox
fonte
2

Esta é uma solicitação bastante curiosa, pois não há "modo" para gravar uma macro. Depois de pesquisar alguns documentos, encontrei o seguinte emusr_10

Você começa movendo para o primeiro caractere da primeira linha. Em seguida, você executa os seguintes comandos:

qa Comece a gravar uma macro no registro a .

^ Mover para o início da linha.

i # include "Insira a string #include" no início da linha.

$ Mova para o final da linha.

a "Anexe as aspas duplas de caracteres (") no final da linha.

j Vá para a próxima linha.

q Pare de gravar a macro.

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 :reglista. Acontece que funciona como um encanto!

Exemplo:

No modo normal: qaisomething<Esc>

e dentro de :regnós vemos a entrada!

"a   isomething^[

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 qpara 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 vimLque está escrevendo (nenhum arranco jamais estaria envolvido no registro ( "ay))

Aqui estão algumas informações :help registerssobre os registros disponíveis

Existem dez tipos de registradores: registradores E354

  1. O registro sem nome ""

  2. 10 registros numerados "0 a" 9

  3. O pequeno registro de exclusão "-

  4. 26 registra os nomes "a a" z ou "A a" Z

  5. três registros somente leitura ":,"., "%

  6. registro de buffer alternativo "#

  7. o registro da expressão "=

  8. A seleção e o descarte registram "*," + e "~

  9. O registro do buraco negro "_

  10. Último registro de padrão de pesquisa "/

Supondo 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-eventpara CursorHold; 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)

CursorHold

Quando o usuário não pressiona uma tecla durante o tempo especificado com 'updatetime'. Não é acionado novamente até que o usuário tenha pressionado uma tecla (ou seja, não dispara todos os ms de 'horário de atualização' se você deixar o Vim para fazer um café. :) Consulte | Exemplo do CursorHold | para visualizar tags. Este evento é acionado apenas no modo Normal. Não é acionado ao aguardar que um argumento de comando seja digitado ou um movimento após um operador. Durante a gravação do evento CursorHold não é acionado. | q |

Dan Bradbury
fonte
Realmente não vejo como isso resolve o problema: quando você termina de gravar sua macro, uma string é salva no registro, mas como você diferencia quando o registro contém uma macro ou quando contém algo proveniente de um comando yank, por exemplo. Além disso, o registro é salvo como uma foto quando você termina a gravação. Quando você vê que o conteúdo do registro foi alterado, você não está mais no modo de gravação.
Statox
Minha esperança era que você pudesse usar algo como o registro blackhole (um registro que nunca será puxado para sempre). Se você tiver esse registo bloqueado, então você pode fazer o checkout CursorHold que tem um comportamento especial quando em modo de gravação (vai atualizar a minha resposta com mais algumas informações para ver se isso ajuda ya)
Dan Bradbury
adicionamos algumas informações sobre os outros registradores (maneira de evitar conflitos com o puxão) e uma dica de como podemos capturar a "gravação" com o CursorHold não ativo durante a gravação de macro. Se você ainda está lutando contra isso depois dessas anotações, avise-me e posso tentar implementá-lo depois que o trabalho terminar. Como observação, isso blackhole registerfoi 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 ..
Dan Bradbury
Passei algum tempo nesta noite passada (esmagando o teclado após a cerveja) e achei incrivelmente difícil descobrir exatamente quando a gravação está ocorrendo e termina. Meu palpite sobre CursorHoldparece ser um sonho impossível devido ao atraso do que CursorHold 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 ..
Dan Bradbury
Na minha opinião, você não tem mil opções diferentes: você precisa substituir o comportamento qe 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 :-)
statox