Como faço para parar a gravação na linha de comando?

19

Quando estou gravando uma macro qe pronto, posso digitar:

  • q para parar a gravação se estiver no modo normal ou visual.
  • <c-o>q para parar a gravação se eu estiver no modo de inserção.
  • ..

    Como interrompo a gravação se minha macro termina no modo de comando?

iago-lito
fonte
Qual é o seu caso de uso para isso? Eu estou realmente apenas curioso :)
PhilippFrank
2
@PhilippFrank Frequentemente procurarei e substituirei o mesmo padrão por diferentes em vários blocos de texto. Com essa macro, é possível selecionar automaticamente o bloco, escrever o padrão de pesquisa real e colocar o cursor na boa posição para digitar a cadeia de substituição. Quando eu o jogo, ele seleciona o bloco, entra no modo de comando, digite :'<,'>s/toBeReplaced//ge coloque o cursor entre os dois //para que tudo que eu precise fazer seja digitar newString<cr>e pronto. :)
iago-lito 4/15
Então é como uma macro com um parâmetro. Muito boa ideia, obrigado!
PhilippFrank
@PhilippFrank meio que sim. Estou feliz que você gostou. :)
iago-lito

Respostas:

12

Outra solução é quando, no modo de linha de comando, use Ctrl-fe pressione qpara interromper a gravação.

Ctrl-fpermite abrir a janela da linha de comandos, na qual é possível editar o comando no modo normal. Para validar o comando, basta usar enter.


Portanto, depois de adicionar algo como:

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

no seu .vimrc, você pode usar <c-q>para interromper a gravação de uma macro enquanto estiver no modo de comando.


Florent

fflorent
fonte
Você ainda precisa remover o caractere <Cf> ( ^F) do final da macro, certo? Pelo menos é o que eu vejo.
VanLaser 6/09/2015
Quase lá! Realmente útil (eu não sabia sobre a janela da linha de comando, mas é ótima), mas .. aargh! Parece que entrar nessas janelas a partir do modo de inserção perde a área selecionada. Existe uma maneira de fazer com que o comando iniciado na janela da linha de comando funcione em uma área selecionada?
iago-lito
@VanLaser Não, pois você pode continuar digitando seu comando na janela da linha de comando. Sua macro será semelhante qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qe, portanto, a gravação realmente parou enquanto você digitava a parte do comando. Para usar a macro: @qFINISHYOURCOMMAND<cr>e pronto: não há necessidade de editá-la. Infelizmente, isso não parece funcionar no modo visual (ou perde a seleção) .. ou eu perdi alguma coisa?
iago-lito
Ah, certo :) BTW, eu poderia selecionar um intervalo visual, em seguida, fazer @qeo intervalo foi adicionado no início de comando '<,'>- enquanto a macro começou com :....
VanLaser
@ lago-lito Na verdade, parece que mesmo que você não veja sua seleção, o intervalo especificado (ou seja '<,'>) ainda corresponde à seleção ao validar o comando.
Fflorent 6/09/15
17

Uma maneira de fazer isso:

  • inicie sua macro normalmente (por exemplo qq... outros caracteres)
  • quando você chegar ao modo cmdline, escreva todos os caracteres que deseja
  • você deseja finalizar a macro aqui. Clique ESCpara sair do modo cmdline e qfinalizar sua macro.
  • remova o ESCdo seu qregistro (*): você pode colá-lo em um buffer, remover o ^[caractere, selecionar todo o material novamente (caractere) e puxá-lo de volta para registrar q.
  • é isso: executar a macro: @q.

Basicamente, você "pós-processa" sua macro um pouco, pois ela é armazenada em um registro :)

(*) Uma maneira rápida de remover o último caractere de uma macro armazenada no registro qseria:

:let @q = @q[:-2]
VanLaser
fonte
Haha! Este foi realmente o meu hack até agora = D. Não existe uma maneira "canônica" de fazer isso? (também mais rápido )
iago-lito 4/15
Não conheço uma, mas não uso muito as macros (prefiro escrever pequenas funções). As macros parecem enigmáticas para mim, quando as olho depois.
VanLaser 4/09/15
@ VanLaser: você poderia dar um pouco mais de detalhes sobre a linha, :let @q = @q[:-2]por favor? Especialmente como [:-2]funciona? :-)
statox
É "fatiar" e funciona em listas e strings (que é como eu acesso / defino @qacima). Alguns exemplos aqui
VanLaser 4/15/15
@VanLaser eles realmente parecem enigmáticos. No entanto, são úteis para repetir pequenas coisas sofisticadas que você precisa fazer em casos muito específicos. Você conhece esse tipo de problema que aparece apenas uma vez e dura apenas alguns minutos. Ser capaz de lidar com eles criando macros em tempo real e sem ter que escrever e depurar uma função dedicada é simplesmente .. woo so wonderful! ^ ^
iago-lito 4/15
3

Depois de ler seu comentário sobre o caso de uso, parece que você pode usar um mapeamento de teclas em vez de uma macro.

Eu tenho esta linha no meu .vimrc (não me lembro onde a encontrei):

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

Ele tem um efeito semelhante ao caso de uso que você descreveu, colocando você na linha de comando. Portanto, a única coisa que você precisa fazer é digitar a substituição e pressionar enter, mas, neste caso, substituir todas as ocorrências da palavra que estava sob o cursor .

Para substituir apenas dentro do bloco atual, acho que algo como o seguinte deve funcionar:

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

Obviamente, você pode mapeá-lo para qualquer chave que desejar.

O que faz acima: marque a posição atual usando o marcador sem nome, selecione visualmente o bloco atual, saia do modo visual e retorne o cursor para a posição salva (os marcadores de seleção visual ainda estão definidos), entre no modo de comando e digite o comando substituto , inserindo a palavra que estava sob o cursor <C-r><C-w>e posicionando o cursor para digitar a substituição.

dhakimian
fonte
Sim, eu tenho esse também. No meu caso de uso específico, no entanto, o toBeReplacedpadrão não é tão simples quanto "a palavra sob o cursor", e é por isso que preciso de uma macro pequena e específica que eu possa criar em qualquer lugar. E mais uma vez: muito específico para um mapa: \ Obrigado de qualquer maneira :) #
9781 iago-lito
2
Talvez, coloque o padrão em um registro e adapte o mapeamento acima para obter automaticamente o conteúdo do registro como toBeReplacedparte (em vez da palavra atual sob o cursor, o que é mais limitador).
VanLaser 04/04
1
@VanLaser Certo, isso permitiria um mapeamento geral e também o tornaria muito mais simples: va{:s/<C-r>0//g<Left><Left>com isso, você pode puxar qualquer padrão que precisar com antecedência e pressionar a tecla mapeada para substituir esse padrão por algo atual. quadra.
dhakimian 04/09/2015