Como faço para especificar “a palavra sob o cursor” na linha de comando do VIM?

86

Quero escrever um comando que especifica "a palavra sob o cursor" no VIM. Por exemplo, digamos que tenho o cursor sobre uma palavra e a faço 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 ele faça isso?

:s/\(*whatever is under the commandline*\)/\1\1
Nathan Fellman
fonte

Respostas:

74

<cword>é a palavra sob o cursor (: ajuda <cword>).

Desculpe, eu deveria ter sido mais completo nesta resposta.

Você pode nmapear um comando para ele, ou esta série de pressionamentos de tecla para o preguiçoso funcionará:

b #go to beginning of current word
yw #yank to register

Então, quando você estiver digitando em seu padrão, você pode clicar em <control-r>0<enter>que irá colar em seu comando o conteúdo do 0-th register.

Você também pode fazer um comando para isso como:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Que mapeará pressionando '\' e 'w' ao mesmo tempo para substituir sua linha de comando por

:s/\(<currentword>\)/
Hazzen
fonte
17
Eu aprecio a grande resposta, mas eu provavelmente iria sugerir a yiwmais bywsó por causa de memória muscular. No cenário em que o cursor já está no primeiro caractere da palavra, você deve omitir o be simplesmente digitar ywvs você pode omitir o iin yiw. Acidentes podem acontecer, e consertar um erro certamente requer mais pressionamentos de teclas :)
Jacob Swartwood
130

Enquanto estiver no modo de linha de comando, CTRL+ R CTRL+ Wirá inserir a palavra sob o cursor.

Consulte a ajuda para c_CTRL-Robter uma lista de todos os outros registros especiais:

:help c_CTRL-R
César Alforde
fonte
28
yiwP

yiw: Yank 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 o exemplo: < ALT > - Dpara este comando:

:nmap < ALT >-D yiwP
user11211
fonte
4
A questão era especificamente sobre como especificar "a palavra sob o cursor" da linha de comando do Vim, não do modo de comando
Nathan Fellman
12

Outra maneira fácil de fazer isso é usar o *comando.

No modo normal, ao falar sobre 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 \0na seção de substituição está a string correspondente.

Você pode então repetir este comportamento, dizer sobre a palavra "def", digitando o mesmo novamente ou digitando

*@:

@: apenas repete o último comando ex, sem a necessidade de um <Enter>, neste caso a substituição.

Você também pode gravar uma macro rápida para fazer isso usando o qcomando

qd*:s//\0\0<Enter>q

Em seguida, repita o que quiser digitando

@d

quando sobre uma palavra você deseja dobrar. 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@:

rampion
fonte
1

Você precisa escapar das barras invertidas no mapeamento. Você também pode incluir a string de substituição no mapeamento.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

fonte
1
ywPx

fará o que você descreve.

ywPxw

também avançará o cursor para a próxima palavra.

bmb
fonte
A questão era especificamente sobre como especificar "a palavra sob o cursor" da linha de comando do Vim, não do modo de comando
Nathan Fellman
Descreva respostas como essa, cada letra do comando.
Vitaly Zdanevich
0

@ user11211 tem a maneira mais direta de 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] direto ----> direto [d] direto

[] é o cursor

Para elaborar...

Você provavelmente deseja que o cursor acompanhe a palavra duplicada:

yiwPea

direto [t] direto ----> direto direto []

NOTA:

yiw

é a palavra interna arrancada (sem espaço em branco)

yaw

é arrancar todas as palavras (incluindo espaços em branco à direita).

yawPea

é, portanto, uma palavra duplicada, incluindo espaço em branco e cursor de posição.

direto [t] direto ----> direto direto []

BBW antes do Windows
fonte
A questão era especificamente sobre como especificar "a palavra sob o cursor" na linha de comando do Vim , não no modo de comando.
Nathan Fellman
1
Você pode usar qualquer um dos comandos normais (modo de comando) acima dentro do modo de comando, simplesmente precedendo-os com: normal ... por exemplo,: normal yiwP fará o mesmo que yiwP no modo normal. Obviamente, essa é a maneira mais lenta de fazer o que você estava pedindo.
BBW antes do Windows
-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
SergioAraujo
fonte
você poderia comentar sobre o que isso faz?
Nathan Fellman
1
Isso usa o nsinalizador para o :substitutecomando para imprimir quantas vezes a palavra sob o cursor aparece no buffer atual. Muito inteligente, mas não é realmente uma resposta a essa pergunta.
Jacob