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.
Puisque vous savez déjà comment couper/tirer du texte, voici quelques idées pour le recoller dans un autre fichier:
: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 + w, Up/Down soit par:
vi -o /path/to/file1 /path/to/file2
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.).
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
Où <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
.
Voici une façon de le faire.
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.
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!
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.
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
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
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:
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
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).
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:
vim file1 file2
--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
.
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
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
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
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.
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
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
:echo has('clipboard')
devrait retourner 1
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)P.S:
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