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

256

Je travaille avec deux fichiers et j'ai besoin de copier quelques lignes d'un fichier et de les coller dans un autre fichier. Je sais copier (aa) et coller (p) dans le même fichier. Mais cela ne fonctionne pas pour différents fichiers. Comment cela se fait-il?

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

macha
la source
Êtes-vous sûr que cela ne fonctionne pas? Je l'utilise assez souvent pour copier des lignes entre des fichiers.
sjngm
Eh bien, quand je fais ça, je reçois seulement un guillemet?
macha
4
La commande dd fonctionne comme cut.
Martin Stålberg

Réponses:

218

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

  • Modifiez le premier fichier en tirant sur le texte souhaité. 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 à l'aide de Ctrl+ w, Up/ Downsoit en:

    • vi -o /path/to/file1 /path/to/file2
    • Depuis le premier fichier, Ctrl+ w,s
Adam Batkin
la source
J'ai deux fenêtres de mastic ouvertes, je fais d'abord "v pour le mode visuel, puis je sélectionne toutes les lignes et je fais un" y "pour tirer, non je fais un alt + tab pour accéder à l'autre fichier et quand je le fais un "p" pour put, il n'imprime qu'un guillemet.
macha
10
Si vous travaillez avec 2 fenêtres de mastic, vous devez utiliser la méthode de copier / coller de mastic / windows. C'est facile. Marquez les éléments que vous souhaitez copier avec votre souris (vous n'avez rien d'autre à faire, le texte marqué est maintenant copié dans le presse-papiers.) Basculez vers votre autre fenêtre de mastic. Entrez en mode d'insertion dans vim (appuyez sur i). Appuyez sur le bouton droit de la souris - la souris droite dans une fenêtre de mastic collera tout ce qui se trouve dans le presse-papiers.
nos
3
Ce que vous faites ne fonctionnera pas: Yanking dans vi ne placera pas le texte dans votre presse-papiers Windows, et le tampon yank n'est pas partagé entre les instances vim ouvertes.
Adam Batkin
1
Je ne comprends pas ce que le dernier point est censé faire: * A partir de l' intérieur du premier fichier, Ctrl+ w, s.
svassr
1
pour moi, il a divisé la fenêtre mais en ouvrant exactement le même fichier. Comment choisissez-vous alors le fichier à ouvrir? J'ai vu la commande :sp myfilequi se divise horizontalement et ouvre le fichier spécifié, mais comment faire si je préfère diviser la fenêtre verticalement?
svassr
50

Si vous utilisez Vim sous Windows, vous pouvez accéder au presse-papiers (copier / coller MS) en utilisant:

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

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

"*p - coller des lignes en ligne après le curseur

"*P - coller des lignes en ligne avant le curseur

Le vous permet de coller entre des fenêtres Vim distinctes ou entre des applications Vim et PC ( Bloc - notes , Microsoft Word , etc.).

JayG
la source
17
Utilisez-le +comme registre de presse-papiers du système multiplateforme (Windows et Linux) par rapport à *, qui est Windows uniquement ( +fonctionne de la même manière que sous Windows *).
Stephen Swensen
42

Utilisez les variations de dcomme ddpour couper.

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

:<n>,<m> w filename

<n>et où <m>sont les nombres (ou symboles) qui désignent une plage de lignes.

Pour utiliser le presse-papiers du bureau, jetez un œil aux +gcommandes.

Apalala
la source
Pour ce faire avec des repères, créez deux repères (a et b, par exemple) autour du texte que vous souhaitez écrire dans un fichier: passer à la première ligne ma,, passer à la dernière ligne mb,. Ajoutez ensuite a 'à la lettre de la marque lorsque vous utilisez la commande ci-dessus::'a,'b w filename
EchoLynx
une excellente solution pour les gammes larges!
Yasin Okumuş
29

Vous pouvez ouvrir l'autre fichier et taper :r file_to_be_copied_from. Ou vous pouvez mettre en mémoire tampon. Ou allez dans le premier fichier, allez sur la ligne que vous souhaitez copier, tapez "qY, allez dans le fichier que vous voulez coller et tapez "qP.

"buffer_name, copie dans le tampon. Yest sec et Pest mis. J'espère que cela pourra aider!

Win Man
la source
Merci! Cela m'a aidé des tonnes
Atsushi Yamamoto
28

Voici une façon de le faire;

  • Démarrez Vim et ouvrez le fichier1 qui est le fichier sur lequel vous travaillez.
  • :e file2 qui affichera file2, le fichier dont vous voulez copier les lignes.
  • localisez les lignes que vous souhaitez copier. Si c'est trois lignes, vous frappez3yy
  • :b1 cela passera au tampon 1, où file1 est
  • déterminer où vous voulez insérer les lignes que vous avez tirées et appuyez sur p

Vous pouvez également afficher les deux fichiers. Divisez l'écran avec par exemple Ctrl+ w s.

Quant à la coupe, dcoupe et place la matière coupée dans le tampon de tirage. dd"coupe" une ligne.

non
la source
2
hors sujet: comment puis-je obtenir ces choses comme des boutons de clavier?
vérifie le
Qu'en est-il des deux fichiers sur deux serveurs ssh différents, dans lesquels le même client est installé dans deux terminaux différents sous Linux / MacOS? Je veux dire, pas de mastic à utiliser, et les deux fichiers ne peuvent pas être ouverts dans la même session vi dans un terminal.
Qiang Xu
1
Si le client peut entrer ssh sur deux serveurs, il peut également utiliser scp ou sftp sur ces deux serveurs. Ainsi, le moyen le plus rapide consiste à simplement copier le fichier d'un serveur à l'autre afin qu'ils résident sur le même serveur, à modifier ces fichiers comme décrit et à recopier le fichier sur l'autre serveur lorsque vous en avez besoin.
nos
16

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.txtCela insérera 10 lignes dans un fichier déjà ouvert à la position actuelle du curseur.

malik
la source
bizarrement, j'ai obtenu un code de sortie de 1 lors de l'exécution de ce malheureusement sur os x, je ne sais pas pourquoi.
jayunit100
1
Merci pour cette suggestion! J'ai utilisé head au lieu de sed car je voulais les 2 premières lignes::r ! head -n2 file.py
Federico Ponzi
7

Lors de la modification du fichier, marquez l'endroit où vous souhaitez que le début et la fin soient utilisés

ma- amarque le coup

mb- bmarque le coup

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

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

Mise à jour 2017-05:

Je viens de découvrir que si vous ajoutez la ligne suivante dans votre fichier vimrc,

définir le presse-papiers = sans nom

alors Vim utilise le presse-papiers du système.


Je viens de découvrir que la méthode yank ne fonctionnera pas sur la façon dont 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 une autre façon de lui permettre de fonctionner).

La méthode yank ne fonctionne que sur la façon dont plusieurs fichiers sont ouverts dans la même fenêtre selon mon test.

Si vous voulez le faire, vous feriez mieux d'utiliser le système de coupe-copie-passé du système d'exploitation tel que Ctrl+ x, Ctrl+ c(sous Windows).

Lichader
la source
5

Ces remaps 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 j'appuie sur Ctrl+ cpuis sur Ctrl+ vpour insérer le texte dans le fichier récepteur. Vous pouvez également utiliser "* y, mais je pense que c'est parfois difficile à retenir.

Ceci est également utile pour copier du texte de Vim dans le presse-papiers.

Source: copier et coller entre les sessions à l'aide d'un fichier temporaire

rovitulli
la source
4

La copie de texte entre deux tampons (== fichiers) ouverts dans la même instance de Vim ne pose aucun problème:

Tirez simplement dans un tampon avec y(en supposant que vous avez marqué une zone à copier en mode visuel auparavant), puis collez-le dans l'autre tampon avec p. Il fonctionne également avec différents onglets tant qu'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:

  • Sur Win32, il y a une option dans le menu contextuel disant Modifier avec un 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, assurez-vous de spécifier l' --remote-silentoption 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 la première instance de Vim, tirez le texte dans le presse-papiers du système à l'aide de "+y(encore une fois, marquez la zone à tirer en mode visuel avant ), puis passez à la deuxième et collez le Vim presse - papier là - bas: "+p.

eckes
la source
: tabedit filename peut être utilisé pour ouvrir le fichier cible, puis juste p pour coller vos lignes. Je pense que c'est plus rapide.
jabalv
4

Objectif : enregistrer un morceau d'un fichier dans un autre fichier.

Solution :

  1. Sélectionnez le texte que vous souhaitez enregistrer:
    • Positionnez le curseur à l'endroit où vous souhaitez commencer la sélection
    • Appuyez vpour sélectionner des caractères OU en majuscules Vpour sélectionner des lignes entières
    • Déplacez le curseur à la fin de ce que vous souhaitez sélectionner
  2. Enregistrez le texte sélectionné dans le nouveau fichier. Tapez :wSpaceet le nom du nouveau fichier. En fait, vous verrez

    :'<,'>w new.txt

    Puis appuyez Enter

Lu55
la source
Comment coller à partir du fichier temporaire.?
Vineet
3

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

:'a,'bw /name/of/output/file.txt
Shyam S
la source
2
  1. Assurez-vous que la version de Vim est compilée avec le support du presse-papiers
    • :echo has('clipboard') devrait revenir 1
    • s'il revient 0(par exemple Mac OS X, au moins v10.11 (El Capitan), v10.9 (Mavericks) et v10.8 (Mountain Lion) - est livré avec une version Vim sans support de presse-papiers), vous devez installer un Version Vim avec prise en charge du presse-papiers, par exemple via brew install vim(n'oubliez pas de relancer votre (vos) terminal (s) après l'installation)
  2. Entrez dans un mode visuel ( V- multiligne, v- simple ou Ctrlv- bloc-visuel)
  3. Sélectionnez la ou les lignes que vous souhaitez copier
  4. "*y - copier la sélection
  5. "*p - coller copié

PS:

  • vous pouvez remplacer les étapes 2 à 5 par les instructions de la réponse de JayG , si vous devez copier et 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, tout en ne sélectionnant pas les éléments étrangers (comme les numéros de ligne, etc.) AVIS: cela bloquera la possibilité de copier le texte sélectionné par la souris dans le presse-papiers du système de Vim .
Peter Mortensen
la source
1

Exemple: fichierA et fichierB - commencez dans le fichierA à la ligne 25, copiez 50 lignes et collez-le dans le 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
Brenda
la source
1

L'option ci-dessous fonctionne la plupart du temps et également pour un collage ultérieur.

 "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 l'édition.

Pour coller des lignes dans l'autre fichier,

:e filename&location

Exemple: saisissez 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

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

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

-déplacez 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

Raams
la source
1

Si vous souhaitez copier une partie d'un fichier et coller ce contenu au milieu d'un autre fichier, vous pouvez procéder de cette façon.

: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 souhaitez supprimer ces lignes après la copie, vous pouvez le faire

:linenumber1,linenumber2 d

Ou

:'mark1,'mark2 d

Maintenant, allez dans un autre fichier. Gardez ensuite le curseur sur la ligne où vous souhaitez 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 vous aiderait si vous vouliez copier et coller plusieurs fois.

SibiCoder
la source
0

Une autre façon pourrait être d'ouvrir les deux fichiers dans deux tampons séparés et d'utiliser le "snippet" suivant après sélection visuelle des lignes d'intérêt.

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

Entrer en mode commande et exécuter

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

Par exemple, pour extraire des lignes 20-30du filenamefichier actuellement ouvert

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