É possível seletar objetos um heredoc ou "aqui documento aqui" com o vim?
-
23-09-2019 - |
Pergunta
Um dos grandes pontos fortes de Vim é seleção de objetos, oferecendo uma rápida manipulação de conteúdo dentro de palavras, parágrafos e delimitadores variados.
Por exemplo,
vi{
Selecionará tudo dentro de um par de aparelhos {}.
Existe alguma funcionalidade equivalente para selecionar um aqui documento ou heredoc:
<<<HTML
....
....
HTML;
Com base na resposta de Erichbschulz, criei o seguinte para uma seleção interna do heredoc:
nmap <F6> ?<<<<CR>w*kV?<<<<CR>j
?<<<<CR>w " find beginning tag (after <<<)
*k " find matching end tag and go up 1 line
V " enter visual mode
?<<<<CR>j " find beginning tag and go down 1 line
Solução
Pensando nas postagens anteriores e tentando dar um passo mais perto. Isso não será 100% confiável (ou seja, quebrará se a etiqueta de partida ocorrer dentro do heredoc, mas algo como:
?<<< "find begining
w " go to starting tag
* " find starting tag
v " enter visual mode (could use Upper V to do an 'ambientish' object select
n " find end tag
e " optional include end tag
EDIT: Ken melhorou a sequência como acima, por isso sugiro que você use seu melhor mapeamento de chaves para um heredoc 'interno':
nmap <F6> ?<<<<CR>w*kV?<<<<CR>j
(Isso é baseado em heredocs de estilo php)
Outras dicas
Para selecionar Heredoc, geralmente coloco o cursor na primeira linha, sobre o Identificador Heredoc e pressione V*
V Iniciará uma seleção de linha e * Começará uma pesquisa, indo para a próxima partida do identificador, o fim do heredoc ...
UMA <<''
Heredoc terminado por uma linha vazia é fácil, se você já está no início (?<<^M^M
): v}
Seleciona aqui até a linha vazia.
Caso contrário, no seu exemplo, o melhor que consigo pensar é v/^HTML
.
Há um plugin que permite definir seus próprios objetos de texto.
http://www.vim.org/scripts/script.php?script_id=2100
Eu imagino que seria bom definir um para que você pudesse dizer 'yih' (Yank in heredoc) para que você não precise ir explicitamente para o início.
Observe que eu não brinca com isso eu mesmo.
Se você deseja apenas uma seleção visual, você pode.
nnoremap <leader>ih ?HTML<cr>V/HTML<cr>