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
Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top