Existe-t-il un objet texte pour l'ensemble du tampon?

28

Je me retrouve souvent à taper des commandes comme gg"+yGou ggdGet je voudrais un moyen plus efficace de le faire sans avoir à déplacer le curseur deux fois. Existe-t-il une commande que je peux utiliser, par exemple y[movement]pour copier la totalité du tampon sans déplacer le curseur?

Aléatoire832
la source

Réponses:

36

Étant donné que vim utilise le signe de pourcentage pour référencer le tampon actuel, vous pouvez l'utiliser pour obtenir tout rapidement.

:%ytirera le tampon entier :%y+vers le +registre (et probablement le presse-papiers, à condition que vim ait été compilé avec les options appropriées).

:%det :%d+fera de même pour la suppression.

Dans chacun de ces cas, le curseur reste en place.

SnoringFrog
la source
Wow, tout ce temps que j'utilisais mmgg"+yG`met je n'y ai jamais pensé. Merci, cela se passe directement dans le .vimrc.
Poignée de porte
@Doorknob au lieu de définir et d'utiliser des marques que vous pourriez simplement utiliser C-odeux fois pour revenir en arrière.
Ruslan
10

Une autre solution consiste à utiliser un plugin appelé vim-textobj-whole . Par défaut, ce plugin fournit l'objet texte aepour tout le tampon, iepour tout le tampon, sauf les lignes vides de début et de fin.

Ce plugin dépend de vim-textobj-user du même auteur, ce qui permet aux utilisateurs de définir n'importe quel objet texte confortablement. Il existe de nombreux plugins qui en font bon usage.

Yosh
la source
8

Il n'y a pas d'objet texte pour tout le fichier par défaut, mais il est possible de les créer à l'aide omap. Dans ce cas, cela ressemblerait à ceci:

onoremap f :<c-u>normal! mzggVG<cr>`z

Voici une ventilation de son fonctionnement:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Remarques:

Ctrlupeut être utilisé en mode ligne de commande pour supprimer tout ce qui se trouve à gauche de la position du curseur. La raison pour laquelle cela est fait est que si vous entrez la ligne de commande directement depuis le mode visuel, elle sera automatiquement insérée '<,'>sur la ligne de commande, et ce n'est pas ce que nous voulons. Je suggère également que vous utilisiez autre chose que f, car il fest normalement utilisé pour passer au caractère recherché suivant sur la ligne. Par exemple, fiira au suivant isur la ligne actuelle.

Rubriques d'aide pertinentes:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:
Arbre à feuilles persistantes
la source
Existe-t-il un moyen de le faire en laissant le curseur seul?
Random832
@ Random832 L'ajout d'un ``à la fin ramènera le curseur à l'emplacement précédent.
SnoringFrog
Je crains que cela n'empêche d'appliquer la sélection à la commande yank. J'en expérimenterai aujourd'hui.
Random832
1
J'ai ajouté une commande de marqueur au mappage, elle devrait laisser le curseur où il est maintenant.
EvergreenTree
2

Voici quelques mappages rapides et nuls pour accomplir la tâche:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Vous pouvez maintenant utiliser yYet dDpour tirer / supprimer respectivement. Ce n'est pas aussi agréable que d'utiliser un objet texte complet, mais parfois les solutions les plus simples sont les meilleures.

Pour plus d'aide, voir:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Peter Rincker
la source