Aplique o comando do modo normal às correspondências regex

10

Estou usando a seguinte expressão regular para corresponder a uma sequência de documentação abaixo de uma definição de função Clojure:

\vdefn.*\n\s*\zs"([^"]|\n)*"

Existe uma maneira de executar o gqcomando do modo normal (formatar linhas) em todas as correspondências desse padrão em um determinado arquivo?


fonte

Respostas:

10

Poder de g:

:g/\vdefn.*\n\s*\zs"([^"]|\n)*"/normal gngq

A parte entre /s é bastante auto-explicativa, pois é o regex da sua pergunta original.

normal gngqno final é um pouco interessante. gnselecionará a próxima correspondência da expressão regular e gq, é claro, formata essa seleção (como você mencionou na sua pergunta).

:gé a parte realmente ótima. Este é, na minha opinião, um dos recursos mais úteis do Vim. O gcomando ex usa um regex e um comando Ex e executa o comando em todas as linhas correspondentes ao regex. Se você ainda não aprendeu :g, eu recomendo fazê-lo, pois aumentará bastante sua produtividade. Alguns recursos são do Vim :help :gou do Power of g no wiki do Vim.

Maçaneta
fonte
A gnpeça está selecionando da linha em que Vé acionada até a próxima ocorrência (não a da mesma linha) do padrão. A documentação do Vim afirma que, se o modo visual estiver ativo, a seleção será estendida da linha atual até o próximo padrão. Isso está causando comportamento indesejado.
@merb Opa, não percebi isso. Editado.
Doorknob
A seleção ainda é da linha da partida para a próxima partida. Percorrer manualmente os comandos do modo normal mostra que //s<cr>me deixa no início da partida na linha atual, mas //e<cr>me deixa no final da próxima partida, não na partida atual.
11
O problema parece estar com //s<cr>V. Quando corro :normal V, vou para o modo de linha visual, conforme o esperado. Quando corro, :normal //s<cr>meu cursor cai na primeira "partida, conforme o esperado. Quando corro :normal //s<cr>V, não recebo uma seleção visual.
11
Resolvi-o. O comando precisa ser normal gngq. Sugerindo uma edição.