78 votes

Comment enregistrer un bloc de texte en mode visuel dans un fichier dans Vim ?

Le titre est très descriptif. Au cas où, je vais donner un exemple :

START BLOCK1
something
END BLOCK1

START BLOCK2
something
somenthing...
END BLOCK2
  1. Je sélectionne le BLOCK1 en mode visuel
  2. Je le tire en appuyant sur y
  3. Comment puis-je sauver le yanked ? BLOCK1 vers un autre fichier ?

141voto

ldigas Points 19740

Sélectionnez le texte que vous souhaitez enregistrer, en mode visuel de ligne ou de bloc, et

:w new.txt

C'est ce que vous tapez, mais vous ne le ferez pas. voir exactement ce qui précède. Lorsque vous appuyez sur : vous accéderez à la ligne de commande qui sera automatiquement remplie avec les informations de sélection. Cela ressemblera à quelque chose comme ceci :

:'<,'>

Continuez à taper le reste ( w new.txt ) pour obtenir

:'<,'>w new.txt

...et appuyez sur la touche Entrée.

19 votes

Cette méthode ne donne pas le résultat escompté, car elle n'écrit que des lignes complètes, sans tenir compte des positions de début et de fin de la sélection à l'intérieur de la ligne. Y a-t-il une solution à ce problème ? Sinon, je me permets de reposer la question principale.

2 votes

@dronus - Je ne comprends pas bien votre question. Cela répond à la demande de l'OP, pour autant que je comprenne la question.

7 votes

Si vous effectuez une sélection dans un mode visuel autre que la ligne, :w écrit toujours les lignes entières touchées par la plage sélectionnée, mais pas la plage exacte commençant ou se terminant à l'intérieur des lignes. Par exemple, si vous sélectionnez une colonne étroite en mode de sélection par bloc, ou une partie d'une ligne en mode de sélection visuelle, la ligne complète sera écrite par :w même si y copierait les parties correctes de la ligne.

17voto

ephemient Points 87003

Lorsque le bloc est sélectionné, vous pouvez :'<,'>w other-file qui n'écrira que le bloc sélectionné dans other-file . Frapper : en mode visuel devrait placer '<,'> dans la ligne de commande pour vous, de sorte que vous n'avez qu'à taper :w other-file .

3 votes

Vim sélectionne toujours des lignes entières pour les transférer à une commande externe, vous pouvez donc utiliser la commande 'cut' de Unix/cygwin pour sélectionner un rectangle de la colonne N à M, de chaque ligne de la sélection : :'<,'>w !cut -cN-M > new.txt . Surpris que la réponse la plus votée et que les lecteurs ne semblent pas comprendre la question.

0 votes

@mosh mais lorsque le texte sélectionné n'est pas aligné sur une colonne, cela ne fonctionnerait pas non plus.

7voto

rmeador Points 15107

Il y a probablement une façon plus simple de procéder, mais ce que je ferais, c'est créer un nouveau tampon (ou un nouvel onglet) et le coller avec p . Vous pouvez créer un nouveau tampon avec :new ou un nouvel onglet avec :tabnew . Vous pouvez écrire le tampon/l'onglet dans un fichier comme d'habitude avec :w filename .

2 votes

Veillez à supprimer la ligne supplémentaire en haut ! (Le collage dans un tampon vide crée une ligne supplémentaire en haut, ou si l'on utilise la fonction P au bas de la page).

3voto

songz Points 1320

Comme @dronus l'a mentionné dans les commentaires, la :w !pbcopy Les suggestions ne sont pas copiées correctement parce qu'elles copient la ligne entière. Si je veux copier uniquement l'url d'une ligne, je ne pourrai pas le faire. Voici une ligne que vous pouvez ajouter à votre .vimrc afin que chaque fois que vous appuyez sur CTRL-C, la ligne sélectionnée dans votre vim soit copiée dans le presse-papiers :

map <C-c> y:e ~/clipsongzboard<CR>P:w !pbcopy<CR><CR>:bdelete!<CR>

Si vous souhaitez en savoir plus, vous pouvez consulter le site suivant mon blog

Il s'agit de la même implémentation que celle suggérée par @rmeador.

3voto

chenkaie Points 141

Similaire à la solution de @songz, je préfère le faire comme ceci en utilisant ":new"

vmap <C-c> y:new ~/.vimbuf<CR>VGp:x<CR>:!pbcopy < ~/.vimbuf<CR><CR>

0 votes

Pbcopy n'existe, à ma connaissance, que sous OSX. Il existe des programmes similaires sous Linux et d'autres systèmes, mais ils portent des noms différents et fonctionnent différemment.

0 votes

Oui, cela ne fonctionne que si pbcopy est exécutable :) Il n'y a donc aucun mal à cela

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X