vi [m] lire la plage de lignes d'un autre fichier


9

Sous Linux, en éditant file_Bdans vim je veux ajouter la ligne 10-25 de file_A. Exemple: On a tout un ensemble de documents HTML avec à peu près le même en-tête et oui, on pourrait créer un modèle et partir de là, mais quand même:

Je cherche un moyen simple [et élégant] d'insérer une plage de lignes à partir d'un fichier et de l'ajouter au fichier que je suis en train de modifier. In vim.

Les solutions que j'ai trouvées jusqu'à présent, mais qui ne correspondent pas exactement à ce que je recherche, sont

  • à file_B l' intérieur de la commande :read file_Aajoutera * tout le fichier_A * dans le fichier_B. Trop
  • il y a du copier-coller à l'intérieur de vim - mais pour celui-ci doit avoir ouvert file_A
  • dans file_A :10,25w! file_B'enverra' la plage de lignes donnée à file_B.
    Cela semble assez proche du copier-coller
  • on peut ouvrir plusieurs fenêtres dans vim
    Mais comme je travaille sur un écran de 8 pouces, plusieurs fenêtres rendent l'orientation difficile

Comme je n'ai pas été en mesure de trouver une solution confortable, je me demande si j'ai simplement mal compris quelque chose ou si les moyens que j'ai trouvés jusqu'à présent sont couramment utilisés et pris comme moyen standard.


Voir cette question SO , la réponse de @ Bernhard était la réponse acceptée à cette question là-bas aussi!
slm

@slm J'étais au courant de cette réponse, mais comme je ne l'ai pas mise dans la liste des solutions que j'ai trouvées, merci pour l'astuce. Je cherche toujours quelque chose de construit à l'intérieur vim. Mais cela semble hors de portée. Et je me demande vraiment si cela n'est réalisable que par le biais de commandes externes, car pour autant que j'en suis vimmaintenant, je suis arrivé à de petites restrictions jusqu'ici.
erch

@ cellar.dweller Vous pouvez en faire une sorte de fonction si vous voulez vraiment quelque chose de plus simple.
Bernhard

Réponses:


11

La meilleure solution que je peux trouver est d'appeler en externe sedet de combiner cela avec:read !

:r !sed -n -e '10,25p' fileB

Ne fonctionne pas ici - mais pourquoi? Tout d'abord, merci pour votre aide. Ce que j'obtiens est 'E34: pas de commande précédente' [grossièrement traduit] comme si vim essayait de répéter une commande. Pour autant que je le comprends, étape par étape: :rest l'abréviation de readin vim. Je n'ai aucune connaissance sedni comment l'utiliser. Bien sûr, je l'ai remplacé fileBpar le fichier réel :)
erch

@ cellar.dweller Ma réponse a été mise à jour par quelqu'un, j'ai eu la même erreur avec ce code. Je l'ai fait reculer. Voyez si cela fonctionne pour vous.
Bernhard

@Stephane Bon pour raccourcir les réponses, mais votre suggestion n'a pas fonctionné.
Bernhard

Maintenant ça marche! Pour ajouter un peu de myslef: commencer par :10retc. placera le contenu de la ligne dix sur [tant qu'il existe]. ça fonctionne parfaitement maintenant. Génial. Merci beaucoup!
erch

2
Oops désolé. Vous avez oublié l'expansion de vim de!. Ça aurait dû l'être :r!sed 10,25\!d. Notez que vous n'avez pas besoin du -eou des guillemets, vous pouvez donc également l'écrire :r!sed -n 10,25pbrièvement. :r sed '10,$\!d;25q'pour éviter de lire tout le fichier.
Stéphane Chazelas
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.