web-dev-qa-db-fra.com

Copiez et collez le contenu d'un fichier dans un autre fichier dans vi

Je travaille avec deux fichiers, je dois copier quelques lignes d'un fichier et les coller dans un autre fichier. Je sais comment copier (yy) et coller (p) dans le même fichier. Mais cela ne fonctionne pas pour différents fichiers, comment cela se fait-il ??

Aussi, y a-t-il un moyen de couper-coller? J'ai essayé de googler, mais la plupart des ressources ne parlent que de copier-coller.

218
macha

Puisque vous savez déjà comment couper/tirer du texte, voici quelques idées pour le recoller dans un autre fichier:

  • Éditez le premier fichier, en tirant le texte que vous voulez. Ensuite, ouvrez votre deuxième fichier depuis vi (:e /path/to/other/file) et collez-le.
  • Ouvrez les deux fichiers ensemble dans une fenêtre divisée et naviguez entre eux en utilisant Ctrl + wUp/Down soit par:

    • vi -o /path/to/file1 /path/to/file2
    • À partir du premier fichier, Ctrl + ws
192
Adam Batkin

Si vous utilisez VIM sous Windows, vous pouvez accéder au Presse-papiers (copier/coller MS) à l'aide de:

"*dd - couper une ligne (ou 3dd pour couper 3 lignes)

"*yy - copier une ligne (ou 3yy pour copier 3 lignes)

"*p - coller les lignes sur les lignes après le curseur

"*P - coller la ou les lignes sur la ligne précédant le curseur

Cela vous permet de coller entre les fenêtres VIM distinctes ou entre les applications VIM et PC (bloc-notes, Word, etc.).

46
JayG

Utilisez les variations de d comme dd pour couper.

Pour écrire une plage de lignes dans un autre fichier, vous pouvez utiliser:

:<n>,<m> w filename

<n> et <m> sont des nombres (ou symboles) désignant une plage de lignes.

Pour utiliser le presse-papier du bureau, jetez un coup d’œil aux commandes +g.

36
Apalala

Voici une façon de le faire.

  • Démarrez vim et ouvrez fichier1, qui est le fichier sur lequel vous travaillez.
  • :e fichier2 qui fera apparaître fichier2, le fichier à partir duquel vous voulez copier des lignes.
  • localisez les lignes que vous voulez copier, si c'est 3 lignes, vous appuyez sur 3yy
  • :b1 cela passera au tampon 1, où fichier1 est
  • déterminer où vous voulez insérer les lignes que vous avez tirées, et appuyez sur p

Vous pouvez également avoir les deux fichiers visibles, divisez l’écran avec, par exemple, CTRL + ws

Comme pour couper, d coupe, et place le truc coupé dans la mémoire tampon. dd va "couper" une ligne.

25
nos

Vous pouvez ouvrir l'autre fichier et taper :r file_to_be_copied_from. Ou vous pouvez tamponner. Ou allez au premier fichier, allez sur la ligne que vous voulez copier, tapez "qY, allez au fichier que vous voulez coller et tapez "qP.

"buffer_name, copie dans le tampon. Y est nul et P est mis. J'espère que cela pourra aider!

21
Win Man

Ce sont toutes d'excellentes suggestions, mais si vous connaissez l'emplacement du texte dans un autre fichier, utilisez sed avec facilité. :r! sed -n '1,10 p' < input_file.txt Ceci insérera 10 lignes dans un fichier déjà ouvert à la position actuelle du curseur.

14
malik

Lors de la modification du fichier, indiquez les emplacements où vous souhaitez que le début et la fin 

ma - définit la marque a

mb - définit la marque b

Ensuite, pour copier cela dans un autre fichier, utilisez simplement la commande w:

:'a,'bw /name/of/output/file.txt
7
vman

Ces remappages fonctionnent comme un charme pour moi:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

Donc, quand je suis en mode visuel, je sélectionne les lignes que je veux et appuie sur Ctrl + c puis sur Ctrl + v pour insérer le texte dans le fichier récepteur. Vous pouvez aussi utiliser "* y, mais je pense que c'est parfois difficile à retenir.

Ceci est également utile pour copier du texte de vim dans le presse-papier. 

Source: http://vim.wikia.com/wiki/Copy_and_paste_between_sessions_using_a_temporary_file

5
rovitulli

Je n'ai pas trouvé de réponse simple ici, alors je poste le mien.

objectif: enregistrer une partie d'un fichier dans un autre fichier.

Solution:

  1. Sélectionnez le texte que vous souhaitez enregistrer:
    • Placez le curseur à l'endroit où vous souhaitez commencer la sélection
    • Presse v pour sélectionner les caractères OR majuscules V sélectionner des lignes entières
    • Déplacez le curseur à la fin de ce que vous voulez sélectionner
  2. Enregistrer le texte sélectionné dans le nouveau fichier. Type :wSpace et le nom du nouveau fichier. En fait, vous verrez

    :'<,'>w new.txt

    Puis appuyez Enter

4
Lu55

Mise à jour 201705:

Je viens de constater que si vous ajoutez la ligne suivante dans votre fichier vimrc,

set presse-papiers = sans nom

alors VIM utilise le presse-papiers du système


Je viens de trouver que le mode de fonctionnement direct ne fonctionnait pas sur le mode où je copie le contenu entre différentes fenêtres d'instance VIM. (Au moins, cela ne fonctionne pas sur la base de mes connaissances VIM. Je ne sais pas s'il existe un autre moyen de l'activer). 

La méthode Yank ne fonctionne que lorsque plusieurs fichiers sont ouverts dans la même fenêtre selon mon test.

Si vous voulez faire cela, vous feriez mieux d'utiliser un système de copier-coller du système d'exploitation tel que ctrl + x, ctrl + c (sous Windows).

4
Lichader

Copier du texte entre deux tampons (== fichiers) ouverts dans la même instance de VIM ne pose aucun problème: il suffit de tirer dans un tampon avec y (en supposant que vous ayez précédemment marqué une zone à copier en mode visuel), puis collez-le dans l’autre tampon avec p. Fonctionne également avec différents onglets dans la mesure où ils se trouvent dans la même instance de VIM.

Comment ouvrir deux fichiers dans la même instance de VIM dépend de votre système:

  • Sous Win32, une option dans le menu contextuel indique Éditer avec un seul vim si vous sélectionnez deux fichiers ou plus.
  • Lorsque vous êtes sur la console, vous pouvez y parvenir avec vim file1 file2
  • Si vous utilisez VIM comme éditeur pour un autre outil, veillez à spécifier l'option --remote-silent pour vous assurer que tous les fichiers sont ouverts dans la même instance.

Si vous avez ouvert les deux fichiers dans deux instances différentes de VIM, vous devez utiliser le presse-papiers du système: dans le premier VIM, insérez le texte dans le presse-papiers du système en utilisant "+y (là encore, marquez la zone à supprimer en mode visuel). ), puis allez au second VIM et collez le presse-papiers à cet emplacement: "+p.

4
eckes

Mon scénario était que je devais copier un nombre n de lignes au milieu, n inconnu, du fichier 1 au fichier 2.

:'a,'bw /name/of/output/file.txt
3
Shyam S

Exemple: fileS et file - commencez dans le fichier à la ligne 25, copiez 50 lignes et collez-le dans fichierB

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp
1
Brenda

Entrez en mode commande et exécutez

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

E.g pour extraire les lignes 20-30 de filename dans le fichier actuellement ouvert

:r! sed -n '20, 30p' filename
0
Anthony Awuley

Si vous voulez copier une partie d'un fichier et coller ce contenu au milieu d'un autre fichier, vous pouvez le faire.

:linenumber,linenumber write newfile

Exemple: 

:2,34 write temp1

Ou

:'mark, 'mark write newfile

Exemple:

:'a,'b write temp1

Maintenant les lignes sont copiées dans un autre fichier . Si vous voulez supprimer ces lignes après la copie, vous pouvez faire

:linenumber1,linenumber2 d

Ou 

:'mark1,'mark2 d

Maintenant, allez dans un autre fichier. Ensuite, gardez le curseur sur la ligne où vous voulez coller.

Type

:r!cat temp1

Maintenant, le contenu du fichier temporaire est collé ici. Vous pouvez supprimer le fichier temporaire de la ligne de commande elle-même, après avoir collé le contenu.

:!rm temp1

Cela aiderait si vous vouliez copier et coller plusieurs fois. 

0
SibiCoder

Une autre solution consiste à ouvrir les deux fichiers dans deux mémoires tampons fractionnées et à utiliser le "fragment" suivant la sélection visuelle des lignes d’intérêt.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p
0
Thorsten

L'option ci-dessous fonctionne la plupart du temps et permet également de coller ultérieurement.

 "xnyy
x - buffer name
n - number of line to Yank - optional

Les lignes tirées seront stockées dans le tampon 'x'. Il peut être utilisé n’importe où dans la modification.

Pour coller des lignes dans l'autre fichier,

:e filename&location

Exemple: Tapez la commande ci-dessous dans l'édition en cours.

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

Opération complète

ouvrir le fichier 1:

vi Test1.sh

a10yy

-Yanked 10 lines

Ouvre maintenant le deuxième fichier de l'édition en cours

*:e /u/test/Test2.sh*

déplace le curseur sur la ligne où vous devez coller

*"ap*

--Les lignes du tampon '*a*' seront copiées après la position actuelle du curseur

0
Raams
  1. Assurez-vous que la version de Vim est compilée avec le support du presse-papier
    • :echo has('clipboard') devrait retourner 1
    • s'il renvoie 0 (par exemple, OSX, au moins El Capitan, Mavericks et Mountain Lion - est livré avec la version Vim, le support du presse-papier est insuffisant), vous devez installer la version Vim avec le support du presse-papiers, via brew install vim (n'oubliez pas de relancer votre terminal (s) après l'installation)
  2. Entrez dans un mode visuel (V - multiligne, v - uni ou Ctrlv - bloc visuel)
  3. Sélectionnez la ou les lignes que vous souhaitez copier
  4. "*y - copier sélectionné
  5. "*p - coller copié

P.S:

  • vous pouvez remplacer les étapes 2 à 5 par les instructions de la réponse par JayG , si vous devez copier-coller une seule ligne
  • pour faciliter la sélection des lignes, vous pouvez ajouter set mouse+=a à votre .vimrc - cela vous permettra de sélectionner des lignes dans vim à l'aide de la souris, sans sélectionner d'éléments superflus (comme des numéros de ligne, etc.) AVIS: il bloque possibilité de copier le texte sélectionné par la souris dans le presse-papiers du système depuis Vim
0
Filipp W.