Como especifico “a palavra sob o cursor” na linha de comando do VIM?
-
09-06-2019 - |
Pergunta
Quero escrever um comando que especifique "a palavra sob o cursor" no VIM.Por exemplo, digamos que eu tenha o cursor sobre uma palavra e a faça aparecer duas vezes.Por exemplo, se a palavra for "abc" e eu quiser "abcabc", posso digitar:
:s/\(abc\)/\1\1/
Mas então eu gostaria de poder mover o cursor para "def" e usar o mesmo comando para alterá-lo para "defdef":
:s/\(def\)/\1\1/
Como posso escrever o comando na linha de comando para que isso aconteça?
:s/\(*whatever is under the commandline*\)/\1\1
Solução
<cword>
é a palavra sob o cursor (:help <cword>
).
Desculpe, eu deveria ter sido mais completo nesta resposta.
Você pode mapear um comando para ele, ou esta série de teclas para os preguiçosos funcionará:
b #go to beginning of current word
yw #yank to register
Então, quando você estiver digitando seu padrão, você pode clicar <control-r>0<enter>
que colará em seu comando o conteúdo do 0º registro.
Você também pode criar um comando para isso como:
:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/
Que mapeará o acerto de '\' e 'w' ao mesmo tempo para substituir sua linha de comando por
:s/\(<currentword>\)/
Outras dicas
Enquanto estiver no modo de linha de comando, CTRL+R CTRL+C irá inserir a palavra sob o cursor.
Veja a ajuda para c_CTRL-R
para obter uma lista de todos os outros registros especiais:
:help c_CTRL-R
yiwP
yiw
:Arranque a palavra interna (a palavra sob o cursor).Este comando também move o cursor para o início da palavra.
P
:Cole antes do cursor.
Você pode então mapear, por exemplo: < ALT > - D
para este comando:
:nmap < ALT >-D yiwP
Outra maneira fácil de fazer isso é usar o *
comando.
No modo normal, ao terminar uma palavra, digite
*:s//\0\0<Enter>
*
torna o padrão de pesquisa a palavra atual (por exemplo\<abc\>).
:s//
faz uma substituição usando o padrão de pesquisa atual e \0
Na seção de substituição está a string correspondente.
Você pode então repetir esse comportamento, digamos sobre a palavra "def", digitando o mesmo novamente ou digitando
*@:
@:
apenas repete o último comando ex, sem necessidade de <Enter>, neste caso a substituição.
Você também pode gravar uma macro rápida para fazer isso usando o q
comando
qd*:s//\0\0<Enter>q
Em seguida, repita o quanto quiser, digitando
@d
quando você deseja dobrar uma palavra.Como este é apenas um caractere a menos que a solução anterior, pode não valer a pena para você - a menos que você esteja fazendo outros ex-comandos entre a duplicação de palavras, o que mudaria o comportamento de @:
Você precisa escapar das barras invertidas no mapeamento.Você também pode incluir a sequência de substituição no mapeamento.
:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>
ywPx
fará o que você descreve.
ywPxw
também avançará o cursor para a próxima palavra.
@usuário11211 tem a maneira mais direta para duplicar a palavra sob o cursor:
yiwP
arrancar a palavra interna (move o cursor para o início da palavra), colar (antes do cursor).
por exemplo.direto[t]para a frente ----> direto para a guerra[d]simples
[] é cursor
Para elaborar...
Você provavelmente deseja que o cursor siga a palavra duplicada:
yiwPea
direto[t]para a frente ----> diretopara a frente[]
OBSERVAÇÃO:
yiw
é a palavra interna arrancada (sem espaços em branco)
yaw
é arrancar todas as palavras (incluindo os espaços em branco à direita).
yawPea
é, portanto, uma palavra duplicada, incluindo espaços em branco e posição do cursor.
direto[t]para frente ----> direto direto[]
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>