Existe-t-il un moyen dédié de fusionner deux blocs de texte en entrelacant des lignes, comme en passant de ceci:
a1
a2
a3
a4
b1
b2
b3
b4
pour que:
a1
b1
a2
b2
a3
b3
a4
b4
en quelques commandes?
EDIT : J'aime vraiment la solution de Sato Katsura , voici comment je l'ai mise en œuvre:
function! Interleave()
" retrieve last selected area position and size
let start = line(".")
execute "normal! gvo\<esc>"
let end = line(".")
let [start, end] = sort([start, end], "n")
let size = (end - start + 1) / 2
" and interleave!
for i in range(size - 1)
execute (start + size + i). 'm' .(start + 2 * i)
endfor
endfunction
" Select your two contiguous, same-sized blocks, and use it to Interleave ;)
vnoremap <pickYourMap> <esc>:call Interleave()<CR>
vimscript
formatting
merge
iago-lito
la source
la source
scroll-binding
deux fenêtres Vim.b1
, puis je tapevip
pour sélectionner le morceau entier, puis,it
qui est le<map-I've-Picked>
. Ça ne marche pas de votre côté?Réponses:
Il n'y a pas de moyen dédié pour le faire (pour autant que je sache), mais oui, cela peut être fait avec quelques commandes:
Vous pouvez l'exécuter avec
:call Interleave(5, 8, 1)
. Le premier paramètre est la première ligne à déplacer, le second la dernière ligne et le troisième où les déplacer. Vous voulez probablement activer les numéros de ligne pour voir ce que vous faites (:set number
).Cela suppose que les blocs ne se chevauchent pas. Voir
:help :move
et:help range()
comprendre comment fonctionne la fonction.Il existe probablement de meilleures façons de récupérer les deux blocs. Il y a un plugin flottant qui est censé vous permettre d'échanger deux blocs. Je ne me souviens pas du nom du plugin, mais l'auteur (peut-être le célèbre Dr. Chip?) A réfléchi plus que moi à la recherche d'une interface. :)
la source
start
etsize
. Avec une fonction homebrew qui récupère ces valeurs dans une sélection, ce sera parfait. J'y travaille. :)Voici une autre alternative:
Copiez d'abord les lignes qui se trouvent 4 lignes en dessous de la ligne actuelle (
:h :t
) puis supprimez les lignes b consécutives (:h :d
)Encore mieux est cette commande:
Cela signifie que, pour chaque ligne commençant par a, recherchez la ligne suivante commençant par «b» et déplacez-la en dessous de la ligne actuelle.
la source
.+,$d
place, et cela a fonctionné (comme l'a fait.+,.+4d
)./^\s*b
à une autre:range
. par exemple: sélectionnez le 1er bloc, exécutez'<,'>g/^/'>+1m.
'>+1
marque le début du 2e bloc.Si vous voulez vous amuser un peu avec les macros et les marques, vous pouvez essayer quelque chose comme ceci:
Mettez d'abord une marque (ici
a
) sur la ligne contenanta1
avecma
Accédez à la ligne contenant
b1
et marquez-la avecmb
Commencez à enregistrer une macro dans le registre que vous souhaitez (ici le registre
q
) avecqq
Insérez le suivant dans votre macro:
ddmb'apjma'b
Arrêtez l'enregistrement de la macro avec
q
Jouez-le autant de fois que nécessaire avec
X@q
oùX
est le nombre de fois pour le jouer.Pour détailler la macro:
Modifier Comme lago-lito l'a mentionné dans les commentaires, cette méthode écrasera les marques et les tampons.
Pour les marques, je ne pense pas que ce soit un vrai problème: j'utilise rarement les 26 marques dans un tampon et je pense que la plupart du temps, on trouvera 2 marques libres.
Pour le tampon, il est possible de l'enregistrer dans une variable temporaire: avant d'enregistrer la macro, utilisez
:let saveReg=getreg('"')
pour enregistrer le registre et une fois l'action terminée, utilisez:call setreg('"', saveReg)
pour ramener le registre à son état précédent.Quoi qu'il en soit, je dois admettre que cette solution n'est qu'une solution rapide et n'est pas optimale: à mon avis, la réponse de Christan est la meilleure et doit être acceptée car elle ne dérange pas les tampons et les marques, ne force pas l'utilisateur à créer une fonction et montre la puissance de la commande globale.
la source
getreg()
etsetreg()
pour enregistrer votre tampon. Mais je suis d'accord que ce n'est pas une solution optimale :-)Je viens de voir une autre question similaire et la solution consiste à:
Aller au milieu plus un:
Et courir:
la source