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
BLOCK1
en mode visuelBLOCK1
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.
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
.
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
.
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é.
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>
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
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')...
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>
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>