mover a seleção para um arquivo separado

12

Com o vim, como posso mover um texto para um novo arquivo? Por enquanto, faço isso:

  • selecione o texto
  • usar :w new_file
  • selecione o texto novamente
  • apague o texto

Existe uma maneira mais eficiente de fazer isso?

Antes

a.txt

sometext
some other text
some other other text
end

Depois de

a.txt

sometext
end

b.txt

some other text
some other other text
greg0ire
fonte

Respostas:

4

Que tal esses comandos personalizados:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _
Ingo Karkat
fonte
1
Isso é muito feio, mas, ei, parece fazer em uma etapa exatamente o que eu pedi (tentei). +1 e aceito. Eu estava procurando uma maneira nativa de fazer isso rapidamente, mas como não parece haver uma, a sua funcionará perfeitamente. Obrigado!
greg0ire
1
A beleza está nos olhos de quem vê. Eu acho isso muito elegante; você só precisa digitar uma vez (no seu .vimrc).
Ingo Karkat
Você está certo, o "muito feio" deve ser "muito desconhecido". Seu comando é muito útil, e eu acho que definitivamente vai dividi-la em meu .vimrc
greg0ire
8

Ao "mover um pedaço de texto para um novo arquivo", presumo que você queira recortar esse pedaço de texto do arquivo atual e criar um novo arquivo contendo apenas esse texto.

Vários exemplos:

  • :1,1 w new_file para criar um novo arquivo contendo apenas o texto da linha número 1
  • :5,50 w newfile para criar um novo arquivo contendo o texto da linha 5 à linha 50
  • :'a,'b w newfilepara criar um novo arquivo contendo o texto de marca apara marcab
    • defina suas marcas usando mae mbonde quiser

O texto acima copia apenas o texto e cria um novo arquivo contendo esse texto. Você precisará excluir posteriormente.

Isso pode ser feito usando o mesmo intervalo e o dcomando:

  • :5,50 d excluir o texto da linha 5 para a linha 50
  • :'a,'b dpara excluir o texto de marca apara marcab

Ou usando ddpara o caso de linha única.

Se você selecionar o texto usando o modo visual e pressionar :enquanto o texto estiver selecionado, verá o seguinte na linha de comando:

:'<,'>

O que indica o texto selecionado. Você pode expandir o comando para:

:'<,'>w >> old_file

O qual anexará o texto a um arquivo existente. Em seguida, exclua como acima.


Um forro:

:2,3 d | new +put! "

O colapso:

  • :2,3 d - exclua as linhas 2 a 3
  • | - tecnicamente, isso redireciona a saída do primeiro comando para o segundo comando, mas como o primeiro comando não gera nada, estamos apenas encadeando os comandos
  • new - abre um novo buffer
  • +put! "- coloque o conteúdo do registrador sem nome ( ") no buffer
    • O bang ( !) existe para que o conteúdo seja colocado antes da linha atual. Isso causa uma linha vazia no final do arquivo. Sem ele, há uma linha vazia na parte superior do arquivo.
embedded.kyle
fonte
Sua suposição está certa. Parece bom, eu vou testar. Você poderia explicar 2. um pouco mais? Não estou muito familiarizado com os intervalos. Edição: Se eu tentar isso na segunda linha, ele grava a primeira linha para o outro arquivo, não a segunda linha.
greg0ire
@ greg0ire eu tenho que um pouco para trás, eu vou editar para explicar melhor
embedded.kyle
Adicionei um exemplo para tornar minha pergunta mais clara.
greg0ire
@ greg0ire Corrigi minha resposta. Ainda são dois passos. As primeiras cópias e gravações. O segundo exclui.
embedded.kyle
1
Ótima solução! Você também pode escrevê-lo quanto '<,'>d | new | 0put "à clareza.
Atripes
1

Baseado na resposta da @ embedded.kyle e este Q & A , acabei com este um forro para anexar uma seleção para um arquivo e excluir do arquivo atual. Depois de selecionar algumas linhas com Shift+V, pressione :e execute:

'<,'>w >> test | normal gvd 

A primeira parte anexa as linhas selecionadas. O segundo comando entra no modo normal e é executado gvdpara selecionar a última seleção e, em seguida, exclui.

jtpereyda
fonte
0

Selecione o texto no modo visual e pressione ypara "puxá-lo" para o buffer (cópia) ou dpara "excluí-lo" para o buffer (cortar).

Depois, é possível :split <new file name>dividir a janela do vim e pressionar ppara colar o texto arrancado. Escreva o arquivo normalmente.

Para fechar a divisão novamente, passe a divisão que deseja fechar :q.

Xyon
fonte
1
Eu tenho 4 etapas no momento: selecionar, escrever, selecionar, excluir. Com seu método, eu tenho 6 etapas: selecione, exclua, divida, cole, escreva, feche. Eu pedi algo mais eficiente: P
greg0ire
Bem, se você passar a divisão :x, poderá combinar a escrita e o fechamento em uma e fazer cinco etapas. : P
Xyon 23/01
Isso é melhor, mas ainda 5> 4: P
greg0ire