Eu preciso fazer várias substituições de palavras em um arquivo e quero fazê-lo com um comando vi, não um comando EX como :%s///g
. Eu sei que esta é a maneira típica de substituir a palavra na posição atual do cursor: cw<text><esc>
mas existe uma maneira de fazer isso com o conteúdo do registro não nomeado como o texto de substituição e sem sobrescrever o registro?
110
12yl
arrancar 12 caracteres e"_cw^r0
substituir uma palavra. Consegui então usar o.
comando para repetir a substituição em todo o arquivo.Respostas:
Estou pensando que por "colar" você quer dizer o registro sem nome (arrancar / colocar / alterar / excluir / substituir), certo? (Uma vez que é o que seria substituído pelo comando de alteração.)
Registros são geralmente especificado digitando
"
então o nome (um único caractere) do registo, como"ay
, em seguida,"ap
para arrancar em registoa
, em seguida, colocar o conteúdo do registradora
. O mesmo vale para um comando de mudança. Neste caso, se você não quer que o texto que você remova com o comando de mudança de ir a qualquer lugar, você pode usar o registo buraco negro"_
:"_cw
. Então, uma vez no modo de inserção, você pode pressionar ctrl-R seguido pelo registro que você deseja (provavelmente"
) colocar no conteúdo desse registro."*
- registro de seleção (colar do botão do meio)"+
- registro da área de transferência (provavelmente também acessível com ctrl-shift-v através do terminal)""
- o registro de arrancar / colocar / alterar / excluir / substituir padrão (sem nome) do vim.Resposta curta:
"_cw^R"
Editar: como outros estão sugerindo, você pode usar um registro diferente para o yank (ou qualquer outro) que colocou seu texto no registro padrão. No entanto, nem sempre você pensa nisso primeiro, então é bom fazer um único comando de mudança sem ignorá-lo. Embora não seja totalmente estourado. Existem os registros numerados
"0
por meio de"9
:fonte
:help registers
.Usando as informações desta postagem, formulei esse mapeamento útil. Escolhi 'cp' porque significa "alterar colar"
nmap <silent> cp "_cw<C-R>"<Esc>
EDITAR:
Também dei um passo adiante e apoiei qualquer movimento.
Para obter o equivalente ao comando acima, seria
cpw
para "alterar colar palavra"fonte
nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Você pode usar o modo visual do vim para isso. por exemplo, copie uma palavra:
ye
e então sobrescreva outra com a palavra copiada:vep
fonte
Se o cursor estiver sobre a palavra que deseja substituir pelo conteúdo do registro sem nome, você pode usar
viwp
.v
muda para o modo visual,iw
seleciona a palavra interna ep
coloca o conteúdo do registro em seu lugar.Na prática, quando preciso substituir uma palavra (nome da função, etc.) por outra, passarei para aquela para usar como uma substituição,
yiw
para puxar a palavra interna para o registro sem nome e, em seguida, mover para a palavra I ' m substituindo, eviwp
para substituí-lo. Maneira muito rápida de substituir uma palavra por outra. Se você pesquisou (/
) pela palavra que está substituindo para chegar a ela, pode simplesmente clicar emn
para ir para a próxima ocorrência que precisa ser substituída. Obviamente, não substitui o uso:%s/find/replace/g
, mas para algumas substituições rápidas pode ser útil, especialmente se você já tiver a nova palavra em um registro.fonte
Se você fizer uso de um registro nomeado (ou seja, use
"ay
ou"ad
, etc., para preencher o registro de colagem), você pode fazer algo comocw<CTRL-R>a<esc>
Que substituirá a palavra pelo conteúdo do registro
a
. Pelo que eu posso dizer, você não pode usar o registrador padrão porque quando vocêcw
for preenchido com a palavra que foi cortada por aquele comando.fonte
Você quer dizer o buffer de pasta do sistema ou o registro vi?
Se você quiser usar o buffer de colagem do sistema, tudo bem e pode
dw"+P
-"
escolhe um registro e"+
é o buffer de colagem do sistema.Caso contrário, copie para o registro não padrão com a palavra
"ay
para copiar para o registroa
e, em seguida, para substituir algo, façadw"aP
fonte
dw
exclui o espaço em branco depois do que eu consideraria a "palavra", enquantocw
apenas altera a palavra. Por esse motivo,dw
não vai funcionar para mim.de
deve funcionar para você - excluirá no final desta palavra, enquantodw
excluirá no início da próxima palavra.Você pode usar
yw
para puxar a palavra e, em seguida, alterar a palavra com palavra puxada porvipw
para palavra puxada e colar a palavra previamente puxada.fonte
Você pode usar registros para isso:
texto de substituição de primeiro lugar no registro
<mark some text>"ay
onde
a
está o nome de registroentão você pode usar esse registro em substituição
ve"ap
fonte
.
, que é outra coisa que eu queria fazer. Obrigado, entretanto. Muito apreciado.Ou você pode fazer Shift+ v- p(selecionar a linha inteira e colar em seu 'lugar)
fonte