Por isso, geralmente me pego copiando texto de um ponto para outro enquanto sobrescrito texto antigo onde o novo é colado:
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
Suponha que eu marque visualmente newtext
e y
ank. Agora eu seleciono wrong1
(que pode ser qualquer coisa, não necessariamente apenas uma palavra) e p
aste o newtext
. No entanto, se eu fizer o mesmo agora, wrong2
ele será substituído por em wrong1
vez de newtext
.
Então, como evito que o texto que está no buffer seja trocado pelo texto que estou substituindo no momento?
Editar 1
Embora eu goste das sugestões de re-registro (acho que vou começar a usar mais os registradores, agora que descobri o :dis
comando), vou fazer uma modificação na resposta de jinfield , porque não uso o modo de troca.
vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d
faz o truque perfeitamente.
Editar 2
Eu fui muito rápido; A solução da romainl é exatamente o que eu estava procurando, sem o hack do Edit 1 .
Na verdade, vnoremap p "_dP
é o suficiente!
Então, alterando a resposta aceita.
fonte
vnoremap p "_dP map
e notei que ele não funciona bem para a última palavra / caractere em uma linha. Eu tenho de volta foi para ovnoremap p "0p
,vnoremap P "0P
eset clipboard=unnamed
(para OSX)vnoremap p "_dP
remove o espaço em branco na pasta. O Edit 1 funciona perfeitamente.Respostas:
Eu tenho esses mapeamentos no meu .vimrc:
"_
é o "registro buraco negro", de acordo com:help "_
:"Ao escrever neste registro, nada acontece. Isso pode ser usado para excluir texto sem afetar os registros normais. Ao ler esse registro, nada é retornado. {Não no Vi}"
fonte
vnoremap p "_dP map
e notei que ele não funciona bem para a última palavra / caractere em uma linha. Eu tenho de volta foi para ovnoremap p "0p
,vnoremap P "0P
eset clipboard=unnamed
(para OSX)vnoremap p "_dP
parar de trabalhar para mim no modo de seleção, masvnoremap <leader>p "_dP
funciona<leader>
seja um espaço reservado que devo substituir por algo, mas isso só funcionou para mim se eu o removesse. O que isso significa aqui?:help mapleader
,.vnoremap <leader>p
mapeamento não funciona corretamente na última linha do buffer, porque assim que você exclui a última linha do buffer, você está na linha uma vez após o último eP
colará acima dessa linha, em vez de abaixo.Além do buffer padrão, você pode puxar o texto em buffers nomeados e, em seguida, colocar a partir desses buffers nomeados. Você pode usar até 26 buffers nomeados (um para cada letra). Use aspas duplas e uma letra para acessar um buffer nomeado. Exemplos:
"dyy
- Arranque a linha atual no buffer d."a7yy
- Arranque as próximas sete linhas no buffer a."dP
- Coloque o conteúdo do buffer d antes do cursor."ap
- Coloque o conteúdo do buffer depois do cursorOutra coisa interessante, se você usar uma letra maiúscula em vez de minúscula, ou seja,
"Dyy
a linha atual será anexada ao buffer d em vez de substituí-la. Mais detalhes no livro O`Reilly: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htmfonte
"a
tudo, mas tudo bem.Ao usar
put
no modo visual, o texto que você está substituindowrong1
é substituído pelo conteúdo do registro 'sem nome'.Na verdade, isso funciona 'colocando' o registro após a seleção e excluindo a seleção. O problema é que essa exclusão agora está armazenada no
unnamed
registro e será usada para a próximaput
ação.A solução, de acordo com
:h v_p
, é puxar para um registro nomeado, como"0y
colar e colar o"0p
tempo que você precisar. Pode ser útil mapear<leader>y
e<leader>p
usar um registro nomeado, se isso é algo que você faz com freqüência.para obter mais ajuda, consulte:
fonte
"0
É importante saber colar do registro, mas muitas vezes você deseja substituir muitas vezes. Se você fizer uma ação repetível, poderá usar o.
operador, conforme mencionado por garyjohn. É explicado no wiki do vim :fonte
Quando você puxa o texto para o registro sem nome *, uma cópia também é colocada no registro 0. Cada vez que você substitui o texto selecionado, basta colar do registro 0. Vejo
Além disso, se você estiver substituindo um número de palavras pela mesma palavra, basta ir para o início da palavra a ser substituída e digitar
.
. Isso repetirá a última operação de edição. Vejo* Os locais de armazenamento nos quais você puxa e coloca são chamados de registradores. Um buffer é o que você edita, geralmente uma cópia de um arquivo do disco.
fonte
Eu preciso disso com tanta frequência que escrevi um plugin para isso: ReplaceWithRegister .
Este plug-in oferece um
gr
comando dois-em-um que substitui o texto coberto por {motion}, linha (s) inteira (s) ou a seleção atual pelo conteúdo de um registro; o texto antigo é excluído no registro do buraco negro, ou seja, foi removido.fonte
Como algo como
vnoremap p "_dP
(eu também tenteix
ouc
) tem problemas com o início e o fim da linha, acabei fazendo o seguinte: ovnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
que achei mais simples do que os plugins existentes (que também não funcionavamset clipboard=unnamedplus
de fábrica). Então, o que ele faz é:C-U
)+
registro de backup (devido ao unnamedplus, as alternativas são"
e*
dependendo da sua configuração) parap
fonte
Isso é o que eu uso (literalmente copiado do meu .vimrc) para o estilo do Windows Control + X cut / Control + C copy / Control + V colar / Control + S save / Control + S save / Control + F find / Control + H substituir o comportamento.
A função smartpaste () deve conter o que você procura, ou seja, uma maneira de colar sobre o texto realçado sem simultaneamente puxar o que foi selecionado.
fonte
tl; dr - vnoremap p "_c *
Aqui está uma lista dos meus mapeamentos completos:
"Corrigir cópia / colar
registro nnoremap DD" * dd
nnoremap D "* d
vnoremap D" d
nnoremap d "_d
nnoremap dd" _dd
vnoremap d "_d
nnoremap s" _s vnoremap s "
_s
nnoremap c "_c
vnoremap c" _c
nnoremap x "_x
vnoremap x" _x
vnoremap p "_c
"Colar na nova linha
nnoremap, p op
nnmapmap, P Op
fonte