déplacer la sélection vers un fichier séparé


12

Avec vim, comment déplacer un morceau de texte vers un nouveau fichier? Pour le moment, je fais ceci:

  • sélectionner le texte
  • utilisation :w new_file
  • sélectionner à nouveau le texte
  • supprimer le texte

Existe-t-il un moyen plus efficace de procéder?

Avant

a.txt

sometext
some other text
some other other text
end

Après

a.txt

sometext
end

b.txt

some other text
some other other text

Réponses:


4

Que diriez-vous de ces commandes personnalisées:

: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 _

1
C'est très moche, mais bon, il semble faire en une seule étape exactement ce que j'ai demandé (j'ai essayé). +1, et accepté. Je cherchais un moyen natif de le faire rapidement mais comme il ne semble pas y en avoir un, le vôtre ira très bien. Merci!
greg0ire

1
La beauté est dans l'oeil de celui qui regarde. Je trouve cela assez élégant; il vous suffit de le taper une fois (dans votre .vimrc).
Ingo Karkat

Vous avez raison, "très moche" aurait dû être "très peu familier". Votre commande est très pratique, et je pense que je vais certainement la graver dans mon .vimrc
greg0ire

8

Par «déplacer un morceau de texte vers un nouveau fichier», je suppose que vous voulez dire couper ce morceau de texte du fichier actuel et créer un nouveau fichier contenant uniquement ce texte.

Divers exemples:

  • :1,1 w new_file pour créer un nouveau fichier contenant uniquement le texte de la ligne numéro 1
  • :5,50 w newfile pour créer un nouveau fichier contenant le texte de la ligne 5 à la ligne 50
  • :'a,'b w newfilepour créer un nouveau fichier contenant le texte de marque aen marqueb
    • établissez vos marques en utilisant maet mboù vous le souhaitez

Ce qui précède copie uniquement le texte et crée un nouveau fichier contenant ce texte. Vous devrez ensuite le supprimer.

Cela peut être fait en utilisant la même plage et la dcommande:

  • :5,50 d pour supprimer le texte de la ligne 5 à la ligne 50
  • :'a,'b dpour supprimer le texte de marque aen marqueb

Ou en utilisant ddpour le cas d'une seule ligne.

Si vous sélectionnez plutôt le texte en mode visuel, puis appuyez sur :pendant que le texte est sélectionné, vous verrez ce qui suit sur la ligne de commande:

:'<,'>

Qui indique le texte sélectionné. Vous pouvez ensuite étendre la commande à:

:'<,'>w >> old_file

Ce qui ajoutera le texte à un fichier existant. Supprimez ensuite comme ci-dessus.


Bon mot:

:2,3 d | new +put! "

La ventilation:

  • :2,3 d - supprimer les lignes 2 à 3
  • | - techniquement, cela redirige la sortie de la première commande vers la deuxième commande, mais comme la première commande ne produit rien, nous enchaînons simplement les commandes ensemble
  • new - ouvre un nouveau tampon
  • +put! "- mettre le contenu du registre sans nom ( ") dans le tampon
    • Le bang ( !) est là pour que le contenu soit placé avant la ligne courante. Cela provoque et une ligne vide à la fin du fichier. Sans cela, il y a une ligne vide en haut du fichier.

Votre hypothèse est juste. Ça a l'air bien, je vais tester. Pourriez-vous expliquer 2. un peu plus? Je ne connais pas très bien les gammes. EDIT: Si j'essaye ceci sur la deuxième ligne, il écrit la première ligne dans l'autre fichier, pas la deuxième ligne.
greg0ire

@ greg0ire J'ai eu ça un peu en arrière, je vais modifier pour mieux expliquer
embedded.kyle

J'ai ajouté un exemple pour clarifier ma question.
greg0ire

@ greg0ire J'ai corrigé ma réponse. C'est encore deux étapes. Les premières copies et écrit. Le second supprime.
embedded.kyle

1
Bonne solution! Vous pouvez également l'écrire '<,'>d | new | 0put "pour plus de clarté.
atripes

1

Sur la base de la réponse de @ embedded.kyle et de cette Q&R , je me suis retrouvé avec cette doublure pour ajouter une sélection à un fichier et supprimer du fichier actuel. Après avoir sélectionné quelques lignes avec Shift+V, appuyez :et exécutez:

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

La première partie ajoute des lignes sélectionnées. La deuxième commande entre en mode normal et s'exécute gvdpour sélectionner la dernière sélection, puis supprime.


0

Sélectionnez le texte en mode visuel, puis appuyez sur ypour le "tirer" dans le tampon (copier) ou dpour le "supprimer" dans le tampon (couper).

Ensuite, vous pouvez :split <new file name>diviser votre fenêtre vim et appuyer sur ppour coller le texte tiré. Écrivez le fichier normalement.

Pour refermer le fractionnement, passez le fractionnement que vous souhaitez fermer :q.


1
J'ai 4 étapes pour le moment: sélectionner, écrire, sélectionner, supprimer. Avec votre méthode, j'ai 6 étapes: sélectionner, supprimer, diviser, coller, écrire, fermer. J'ai demandé quelque chose de plus efficace: P
greg0ire

Eh bien, si vous passez la séparation à la :xplace, vous pouvez combiner l'écriture et la fermeture en une seule et faire cinq étapes. : P
Xyon

C'est mieux, mais 5 quand même> 4: P
greg0ire
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.