web-dev-qa-db-fra.com

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

Le titre est très descriptif. Juste 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 tire en appuyant sur y
  3. Comment enregistrer le BLOCK1 dans un autre fichier?

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

:w new.txt

C'est ce que vous tapez, mais vous ne verrez pas exactement ce qui précède. Lorsque vous appuyez sur :, vous accédez à la ligne de commande qui sera automatiquement renseignée avec les informations de sélection. Ça va ressembler à quelque chose comme ça:

:'<,'>

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

:'<,'>w new.txt

... et appuyez sur Entrée.

122
Rook

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

16
ephemient

Il existe probablement un moyen plus simple de procéder, mais je créerais un nouveau tampon (ou onglet), puis le collerais avec p. Vous pouvez créer un nouveau tampon avec :new ou un nouvel onglet avec :tabnew. Vous pouvez écrire le tampon/onglet dans un fichier comme d'habitude avec :w filename.

5
rmeador

Comme @dronus mentionné dans les commentaires, les suggestions :w !pbcopy ne sont pas copiées correctement car elles copient toute la ligne. Si je veux copier uniquement l'URL dans une ligne, je ne pourrai pas. Voici une ligne que vous pouvez ajouter à votre fichier .vimrc pour 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 lire des détails sur ce que cela fait, vous pouvez en savoir plus sur mon blog

C'est la même implémentation que ce que @rmeador a suggéré.

2
songz

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>
1
chenkaie

En plus de sélectionné répondre ci-dessus,

  • lorsque vous utilisez la souris pour sélectionner (1),

  • et le problème de ne copier que les lignes entières mentionnées par le commentaire de @dronus, alors que je voulais juste copier en partie les lignes (2):

(1) Sur mon système DietPi (Raspberry Pi) basé sur Debian, vim agit légèrement de la même manière que dans la solution préférée ci-dessus lorsque vous utilisez la souris pour entrer et sélectionner "MODE VISUEL" sur mon poste de travail Ubuntu 16.04. ensuite

  • y tirer

mais si je tape ':' pour commande, il ne s'affichera pas avec le

'<,'>

où je peux simplement ajouter mon

w new.txt

après ça. Donc, je viens de le taper moi-même et cela a fonctionné:

'<,'>w new.txt

et il copie la totalité du contenu extrait dans mon fichier 'new.txt', alors que '<' semble signifier 'copier les lignes sélectionnées et'> 'le rediriger vers le fichier référencé de la commande d'écriture.

(2) Et au problème de ne pas coller une partie des lignes, comme dans @dronus commentaire mentionné, ceci solution (celle sélectionnée, première alternative) a fonctionné pour moi:

Éditez le premier fichier, en tirant le texte que vous voulez. Ensuite, ouvrez votre deuxième fichier depuis vi (: e/chemin/vers/autre/fichier) et collez-le (en tapant p). Enregistrez-le (comme ci-dessus ': w new.txt'.

Il ne vous restera alors qu'à copier la partie des lignes marquées par la souris ou par "y" avec les curseurs.

[EDIT] Sur mon système Ubuntu: Parfois, le fait de sélectionner une souris n'entre PAS en "VISUAL MODE" dans vim. Ensuite, le copier/coller normal peut être sélectionné à l’aide du menu contextuel ... Je n’ai pas trouvé la raison pour laquelle Ubuntu a changé son comportement, passant d’un comportement d’hôte à un comportement "hôte" (avec Ubuntu hébergeant la fenêtre ssh bash sur mon Client')...

0
pedda

Vim récupère la sélection visuelle et l'enregistre dans un fichier:

function! Get_visual_selection()
    #Get the position of left start visual selection
    let [line_start, column_start] = getpos("'<")[1:2]
    #Get the position of right end visual selection
    let [line_end, column_end] = getpos("'>")[1:2]
    #gotta catch them all.
    let lines = getline(line_start, line_end)
    if len(lines) == 0
        return ''
    endif
    #Edge cases and cleanup.
    let lines[-1] = lines[-1][: column_end - 2]
    let lines[0] = lines[0][column_start - 1:]
    return join(lines, "\n")
endfunction

function Save_visually_selected_text_to_file()
    let selected_text = Get_visual_selection()
    call writefile(split(selected_text, "\n"), "/tmp/something.txt")
endfunction

#the c-u does a union of all lines in visual selection.
#this goes in the vimrc
vnoremap <F10> :<c-u>call Save_visually_selected_text_to_file()<cr>
0
Eric Leschinski

Se baser sur la variante de @ chenkaie me convient parfaitement:

let mapleader = "," let g:mapleader = "," vmap <leader>y y:new ~/.vbuf<CR>VGp:x<CR> nmap <leader>p :r ~/.vbuf<CR>

0
Jaime Asm