Pelo menos uma vez por dia, tenho a seguinte situação:
A: This line should also replace line X
...
X: This is line should be replaced
Acredito que não desempenho essa tarefa de forma eficiente.
O que eu faço:
- Vá para a linha A: AG
- Yank line A: yy
- Vá para a linha X: XG
- Cole a linha A: P
- Mover para a linha antiga: j
- Excluir linha antiga: dd
Isso tem a desvantagem adicional de que a linha X está agora no registro padrão, o que é irritante se eu encontrar outra linha que deve ser substituída por A. Arrancar e colar de um registro adicional ( "ayy , " aP ) torna essa tarefa simples ainda menos eficiente.
Minhas perguntas:
- Eu perdi um comando Vim embutido para substituir uma linha puxada antes?
- Se não, como posso vincular meu próprio comando que deixa (ou restaura) a linha arrancada no registro padrão?
:move
e o registro do buraco negro (_
) (ou, na verdade, apenas registra)Respostas:
O que eu faria :
aG
Y
xG
Vp
Você não tem que sair do modo normal, mas faz puxão na linha. No entanto, você pode usar o
V"0p
que sempre colocará a linha puxada na etapa 2.fonte
Y
é sinônimo deyy
Y
é um sinônimo deyy
, mas sugiro remapear paray$
que corresponda aD
eC
.Vp
: selecione a linha, cole o que foi puxadofonte
VP
funciona tão bem, o que é útil porque você pode manter a tecla Shift pressionada durante toda a sequência.V"0p
, que cola do último registrador arrancado.V"0p
faz? V entra no modo de linha Visual e p é para colar. O que são "e 0 para? ObrigadoPara deletar texto sem afetar os registros normais, você pode usar o registro do buraco negro
"_
:fonte
d
edd
sempre usar o buraco negrox
exx
executar o que a maioria dos editores chamaria de "corte" (excluir e salvar no registro padrão):noremap x d
noremap xx dd
noremap d "_d
noremap dd "_dd
Com base nas respostas que sugerem usar
Vp
ouVP
colar sobre uma linha - para evitar alterar o conteúdo do registro de puxão, acho que o comando mais ergonômico é simplesmente:VPY
fonte
fonte
Eu usaria o modo de linha de comando (Ex) e faria os dois comandos a seguir
Isso simplesmente move a linha X para logo abaixo de A, em seguida, a exclusão de A move essa linha para cima
Por exemplo
fonte
Vá para o início da primeira linha.
y, $- copia a linha sem a quebra de linha no final
Mova para o início da linha de destino.
V, p- substituir apenas uma linha de destino
c, c, Ctrlr, 0, Esc- substituir a linha de meta com o puxão originais
Mova para o início da próxima linha de destino.
. - repete o comando emitido em 4.2.
Notas:
4.1 é y, $porque se você fizer isso y, you Yirá copiar a quebra de linha e Ctrlr, 0na verdade , adiciona a quebra de linha abaixo de sua linha de destino.
4.2 substitui V p, que não funciona com repetir porque tecnicamente a última ação é excluir, então .apenas excluiria uma linha.
Se alguém souber como emitir 'substituir linha atual por registro' no modo EX (linha de comando), gostaria de ouvir de você (e saber onde você encontrou a documentação). Pode haver um comando EX repetível que é mais rápido do que 4.2 e / ou não tem a ressalva de quebra de linha.
fonte
Aqui está o que eu faria
fonte
Você pode usar isso com o modo visual.
A
GX
Gfonte
Você também pode fazer:
As mesmas teclas podem ser usadas para puxar / colar mais de uma linha.
fonte
Você pode usar estes comandos no modo normal:
o
m
comando é param[ove]
, que move o número da linha A após o número da linha X, se você quiser copiar em vez de mover a linha, useco[py]
. od
comando é parad[elete]
.Você pode mover (copiar usando
co
) um intervalo de linhas usandofonte
À luz do comentário recente de cicld (obrigado!), Vejo que não compreendi totalmente o problema original. Mover a linha não é apropriado, mas copiar é (já que a linha está puxada). Então, eu revisaria para:
Copie a 1ª linha (o
:t
comando é um alias para:copy
) após a linha 20 (irá colocá-lo na linha 21)Exclua a linha 20, colocando a linha excluída no registro do 'buraco negro'
_
(ou seja, não afetando o buffer de yank atual)Conforme mencionado no comentário recente, isso não afetará a posição atual do cursor.
fonte
fonte
Acho mais fácil usar o comando Ex para isso; ex. para mover a linha 9 para 46:
Isso moverá o cursor para a linha 46, moverá a linha 9 abaixo da atual e, em seguida, excluirá a linha anterior (uma vez que a linha movida é a atual).
Ou usando marca (s), usando a marca 'a':
fonte
:1m20|.+1d
(mova a linha 1 para a linha 20 e exclua a próxima linha, ou seja, o texto que estava na linha 20 anteriormente). A mesma ideia!Freqüentemente, preciso usar uma linha em Y e substituí-la em vários lugares, cada um com um valor diferente (o que significa que não posso fazer uma regex).
Y arrancar a linha original desejada
e em cada linha que você deseja substituir, VpzeroY
fonte
Eu simplesmente usaria o registro "Buraco negro":
dado:
nnoremap <Cd> "_dd
a solução seria:
<Cd> yy
fonte