Usando o Vim, geralmente desejo substituir um bloco de código por outro que acabei de puxar.
Mas quando eu excluo o bloco de código que será substituído, o próprio bloco entra no registro que apaga o bloco que acabei de puxar. Então, eu tenho o hábito de puxar, inserir e excluir o que não queria, mas com grandes blocos de código, fica complicado tentar manter o bloco inserido e o bloco a ser excluído separados.
Então, qual é a maneira mais rápida e rápida de substituir o texto no Vim?
- existe uma maneira de excluir texto sem colocá-lo no registro?
- existe uma maneira de dizer, por exemplo, "substituir a próxima palavra" ou "substituir até o próximo parágrafo"
- ou é a melhor maneira de usar o recurso de registro múltiplo?
vim
replace
vim-registers
Edward Tanguay
fonte
fonte
viwp
(paraw
ord).Respostas:
Para excluir algo sem salvá-lo em um registro, você pode usar o "registro do buraco negro":
Claro que você também pode usar qualquer um dos outros registradores que não contêm nada do seu interesse.
fonte
"<space>_d
. O espaço é necessário para realmente digite o".dd
em uma linha vazia, ela entra no buraco negro, caso contrário,dd
é normal)."_x
yy
ou '3yy' (ou o que seja), o que o coloca no registro sem nome, mas também em 0. Você pode continuar colando"0p
, apesar de ter usadod
depois disso.Sim. É um pouco mais complicado do que excluir o texto "antigo" primeiro, mas:
Eu começo com ..
I shift+ vseleciono as linhas 1, 2, 3 e 4 e as excluo com o dcomando
Em seguida, apago as linhas 1-4 antigas da mesma maneira.
Então faça
Isso colará as segundas últimas linhas arrancadas (linha 1-4).
"3p
fará o terceiro do último, e assim por diante ..Então eu acabo com
Referência: documentação do Vim no registro numerado
fonte
Documentos do VIM: O registro numerado 0 contém o texto do comando yank mais recente, a menos que o comando especifique outro registro com ["x].
Por exemplo, puxamos "foo" e excluímos "bar" - o registro 0 ainda contém "foo"! Portanto, "foo" pode ser colado usando
"0p
fonte
É útil ter um mapeamento fácil, que permite substituir a seleção atual por buffer.
Por exemplo, quando você coloca isso em seu arquivo .vimrc
depois, depois de copiar algo no registro (ou seja, com 'y'), você pode simplesmente selecionar o texto que deseja substituir e simplesmente pressionar 'r' no teclado. A seleção será substituída pelo seu registro atual.
Explicação:
fonte
vmap <C-P> "_dP
Vp
substitui sua linha atual pela arrancada imediatamente.d
que está sendo frequentemente usado para exclusão.Coloquei o seguinte no meu vimrc:
Agora eu puxo e pego do registro da área de transferência e não preciso me importar com o que acontece com o registro padrão. Um benefício adicional é que eu posso colar de outros aplicativos com o mínimo de problemas. Estou perdendo algumas funcionalidades, eu sei, mas simplesmente não consigo acompanhar mais de um registro / área de transferência de qualquer maneira.
fonte
set clipboard=unnamed
ouset clipboard=unnamedplus
, que altera a área de transferência padrão para*
ou+
, respectivamente.Para o exemplo específico que você deu, se eu entender a pergunta, isso pode funcionar:
fonte
Todas as operações de arrancar e excluir gravam no registro sem nome por padrão. No entanto, o arranque mais recente e a exclusão mais recente são sempre armazenados (separadamente) nos registros numerados. O registro
0
contém o puxão mais recente. Os registros1-9
contêm as 9 exclusões mais recentes (1
sendo a mais recente).Em outras palavras, uma exclusão substitui o arranque mais recente no registro sem nome, mas ainda está lá no
0
registro. O truque do registro de buraco negro ("_dd
) mencionado nas outras respostas funciona porque impede a substituição do registro sem nome, mas não é necessário.Você faz referência a um registro usando aspas duplas, portanto, colar o texto arrancado mais recentemente pode ser feito assim:
Esta é uma excelente referência:
fonte
Para enfatizar o que a EBGreen disse :
Se você colar ao selecionar o texto, o texto selecionado será substituído pelo texto colado.
Se você deseja copiar algum texto e colá-lo em vários locais, use
"0p
para colar. O registro numerado 0 contém o texto do comando yank mais recente.Além disso, você pode listar o conteúdo de todos os seus registros:
Esse comando torna mais fácil descobrir qual registro você deseja ao executar algo como a resposta do dbr . Você também verá os registros /,%, #. (Veja também
:help registers
)E, finalmente, confira
cW
ecW
altere uma palavra, incluindo e não um espaço à direita. (Usar capitalW
inclui pontuação.)fonte
Se você estiver usando o Vim, terá o modo visual, que é como selecionar, mas com os modos de separação que são a base do vi / vim.
O que você deseja fazer é usar o modo visual para selecionar a fonte e, em seguida, puxar, em seguida, usar o modo visual novamente para selecionar o escopo do destino e colar no texto a partir do buffer padrão.
Exemplo:
Em um arquivo de texto com:
com a seguinte sequência:
ggVjyGVkp
você terminará com:Explicado:
gg
: ir para a primeira linhaV
: inicia o modo visual com linhas inteirasj
: desce uma linha (com a seleção iniciada nas linhas anteriores, aumenta a seleção uma linha abaixo)y
: puxa para o buffer padrão (as duas linhas selecionadas e sai automaticamente do modo visual)G
: ir para a última linhaV
: inicia o modo visual (o mesmo de antes)k
: sobe uma linha (como antes, com o modo visual ativado, aumenta a seleção de uma linha)p
: paste (com a seleção nas duas últimas linhas, ele substituirá essas linhas pelo que houver no buffer - as 2 primeiras linhas nesse caso)Isso tem o pouco inconveniente de colocar o último bloco no buffer, então, de alguma forma, não é desejado para pastos repetidos da mesma coisa; portanto, você deseja salvar a fonte em um buffer nomeado com algo como
"ay
(em um buffer chamado "a ") e cole com algo como"ap
(mas, em seguida, se você estiver programação, você provavelmente não quer colar várias vezes, mas para criar uma função e chamá-lo, certo? dIREITO ?).Se você estiver usando apenas o vi, precisará usar marcas invisíveis no modo visual.
:he mark
Para mais informações, desculpe, mas não sou muito bom com essa coisa de marcas invisíveis, estou bastante contaminado com o modo visual.fonte
Para 'substituir palavra', tente
cw
no modo normal.Para 'substituir parágrafo', tente
cap
no modo normal.fonte
c}
no modo normal.Uma solução invasiva mínima para os preguiçosos:
O registro
0
sempre contém o último puxão (como Rafael , alex2k8 e idbrii já mencionaram). Infelizmente, selecionar o registro0
o tempo todo pode ser bastante irritante, por isso seria bom se op
usar"0
por padrão. Isso pode ser alcançado colocando as seguintes linhas no seu.vimrc
:A primeira linha mapeia cada
p
curso para"0p
. No entanto, isso impede op
acesso a outros registros. Portanto, todos osp
traços com um registro selecionado explicitamente são mapeados para a expressão de linha de comando equivalente no loop for. O mesmo é feito paraP
.Dessa forma, o comportamento padrão é preservado, exceto os implícitos
p
e osP
traços, que agora usam o registro0
por padrão.Dica 1: O comando recortar é agora, e
"0d
não apenasd
. Mas como sou preguiçoso, isso é muito longo para mim;) Portanto, estou usando o seguinte mapeamento:A tecla líder é
\
por padrão, para que você possa cortar o texto facilmente digitando\d
ou\D
.Dica 2: o tempo limite padrão para mapeamentos de várias chaves é bastante curto. Você pode aumentá-lo para ter mais tempo ao selecionar um registro. Veja
:help timeoutlen
para detalhes, estou usando:fonte
Bem, primeiro faça este comando:
Então você perceberá que pode excluir em um registro específico. Dessa forma, você não alterará o que está no seu registro padrão.
fonte
["x]d{motion} Delete text that {motion} moves over [into register x]
- Vim:h d
Minha situação: no
Normal
modo, quando excluo caracteres usando ax
tecla, essas exclusões substituem meu registro mais recente - complicando as edições em que desejo excluir caracteres usandox
e colando algo que tenho no meu registro mais recente (por exemplo, colando o mesmo texto em dois ou mais lugares).Tentei a sugestão na resposta aceita (
"_d
), mas não funcionou.No entanto, das respostas / comentários aceitos em /vi/122/performing-fficient-operations-without-clearing-register , eu adicionei isso ao meu
~/.vimrc
, que funciona (talvez seja necessário reiniciar o Vim ):Ou seja, agora eu posso executar meus comandos yank (
y
), delete (d
) e paste (p
) normais - e os caracteres que eu excluo usandox
não preenchem mais os registros mais recentes.fonte
O texto excluído, no modo de inserção, não entra no registro padrão.
fonte
As duas soluções que eu uso nos contextos certos são;
VISUAL
modo Vims e cole o registro.Eu uso isso principalmente por hábito, pois só encontrei a segunda solução mais tarde, por exemplo
<ctrl>+<p>
de teclas para substituir o registro numerado anterior pelo que você acabou de colar.Basicamente, você colará como faria, mas, quando perceber que substituiu o registro padrão, perdendo o que realmente queria colar, poderá
<C-P>
encontrar e substituir o histórico do YankRing!Um deles deve ter plugins ...
fonte
Encontrei um mapeamento muito útil para seu propósito:
O texto excluído é colocado no "registro do buraco negro" e o texto arrancado permanece.
Fonte: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
fonte
Na versão do Windows (provavelmente também no Linux), você pode puxar o buffer de copiar / colar do sistema usando
"*y
(ou seja, preceder o seu comando puxar com aspas duplas e asterisco).Você pode excluir as linhas substituíveis normalmente e colar o texto copiado usando
"*p
.fonte
Costumo cometer um erro ao seguir os comandos para 'y'ank then' "_d'elete em um buraco negro e depois 'p'aste. Prefiro' y'ank, depois excluo como eu quiser e depois" "0p" de o registro 0, que é para onde o último texto copiado é enviado.
fonte
Para usuários do emacs-evil, a função
(evil-paste-pop)
pode ser acionada após colar, e percorre as entradas anteriores no ringue. Supondo que você o<C-p>
vinculasse (padrão no Spacemacs), você pressionariap
seguido de quantos fossem<C-p>
necessários.fonte
Para os usuários do Dvorak, um método muito conveniente é excluir o texto desnecessário no registro "1 em vez do" _ _ black hole register, apenas porque você pode pressionar "+ 1 com a mesma tecla Shift e um rápido movimento mindinho, já que 1 é a chave imediatamente acima "em Dvorak (PLUS d está na outra mão, o que torna todo o comando rápido como o inferno).
Então, é claro, o registro "1 pode ser usado para outras coisas por sua conveniência, mas, a menos que você tenha um propósito mais comum do que substituir o texto, eu diria que é um uso muito bom do registro.
fonte
Para aqueles que são os principais interessados em não substituir o registro sem nome ao substituir um texto por seleção virtual e colar.
Você pode usar a seguinte solução que é fácil e funciona melhor para mim:
xnoremap <expr> p 'pgv"'.v:register.'y'
É das respostas (e comentários) aqui: Como colar sem substituir o registro
Após a seleção primeiro, a seleção com o novo texto é selecionada novamente (gv). Agora, o registro que foi usado pela última vez no modo visual (normalmente o registro sem nome, mas também funciona sem efeitos colaterais se você usar outro registro para colar). E, em seguida, puxe o novo valor para o registro novamente.
PS: Se você precisar de uma variante mais simples que funcione também com a simulação de vim do plugin intellj idea, você pode usar esta (desvantagem: substituir o registro sem nome, mesmo que outro registro tenha sido fornecido para colar):
vnoremap p pgvy
fonte
Para quem usa o JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) com o IdeaVim. Você pode estar tendo problemas com o remapeamento, como o
nnoremap d "_d
usado para excluir uma linhadd
. Possível solução para você:nnoremap dd "_dd
Há problemas no youtrack, vote neles: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
fonte
A preferência ocasional do Vim pela complexidade e não pela praticidade sobrecarrega o usuário com a aplicação de registros para copiar / excluir ações - quando, na maioria das vezes, apenas se deseja colar o que foi copiado e "esquecer" o que foi excluído.
No entanto, em vez de combater os complicados registros do vim, torne-os mais convenientes: escolha um registro "padrão" para armazenar sua exclusão mais recente. Por exemplo, envie exclusões para o registro d (deixando um AC aberto para uso ad-hoc; d é um mnemônico interessante):
Essa abordagem evita que as exclusões ocultas puxem, mas não perde o registro da exclusão - é possível colar (voltar) o que foi excluído em vez de perdê-lo em um buraco negro (como na resposta aceita). No exemplo acima, essa recuperação é feita com dois mapeamentos líderes p. Um benefício dessa abordagem é que ela permite escolher o que colar: (a) o que acabou de ser arrancado ou (b) o que acabou de ser excluído.
fonte
registre de 0 a 9 são as coisas mais recentes que você puxa ou corta etc., e NÃO inclui itens excluídos etc. Portanto, se você puxa / corta algo, também está no registro 0, mesmo que você diga coisas excluídas o dia todo depois disso, registre 0 ainda é a última coisa que você arrancou / cortou.
yiw # passa para o registro padrão e registra 0
ele puxa a palavra em que o cursor está
coisas excluídas etc irão para o registro padrão, mas NÃO registram 0
no modo padrão:
"0p #puta o conteúdo do registro 0
no modo de inserção:
ctrl-r 0 #putar o conteúdo do registro 0
Eu também tive um amigo que sempre puxou / cortou para registrar x lol.
fonte