165 votes

Comment créer un alias pour une commande dans Vim ?

Vim est mon éditeur de texte préféré lorsque je programme, et je rencontre donc toujours un problème particulièrement ennuyeux.

Souvent, lorsque j'ai besoin de sauvegarder rapidement la mémoire tampon et de poursuivre une autre tâche diverse, je procède de la façon suivante

:w

Cependant, je parviens toujours - ce qui semble être plus de 50 % du temps - à tirer parti de ce fait.  :w . Naturellement, Vim me crie dessus parce que W est une commande non valide :

E492: Not an editor command: W

Ma question est la suivante : comment peut-on alias colon-commandes dans Vim . En particulier, pourriez-vous exemplifier comment aliaser W a w .

Je suis conscient de la procédure à suivre pour les clés cartographiques à certains commandes mais ce n'est pas ce que je recherche.

1 votes

1 votes

Pour éviter :W vous pouvez mapper une touche pour effectuer la sauvegarde. Si vous êtes habitué à un programme qui enregistre avec Ctrl-s, il y a ces mappings de $VIM/mswin.vim : " Use CTRL-S for saving, also in Insert mode noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <C-O>:update<CR>

0 votes

Question similaire sur Vi Stack exchange : vi.stackexchange.com/q/2665/7244

140voto

ZyX Points 26516

Pour ne pas toucher à l'achèvement, essayez d'utiliser

cnoreabbrev W w

Il remplacera  W en ligne de commande avec  w mais seulement s'il n'est ni suivi ni précédé d'un caractère de mot, donc :W<CR> sera remplacé par :w<CR> mais :Write ne le fera pas. (Notez que cela affecte toutes les commandes qui correspondent, y compris celles auxquelles vous ne vous attendez pas. Par exemple, la commande :saveas W Z sera remplacé par :saveas w Z donc faites attention à cela).

Mise à jour

Voici comment je l'écrirais maintenant :

cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))

En tant que fonction :

fun! SetupCommandAlias(from, to)
  exec 'cnoreabbrev <expr> '.a:from
        \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
        \ .'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")

Cela vérifie que le type de commande est  : et la commande est  W donc c'est plus sûr que de simplement cnoreabbrev W w .

2 votes

Cette réponse est la plus sûre et la plus fiable pour moi.

2 votes

Si vous utilisez la solution recommandée, sachez que les deux commandes ci-dessous fonctionneront comme la commande inférieure, ce qui peut donner un résultat inattendu selon le contenu réel du tampon et les paramètres VIM : :%s/W/foo/g<CR> :%s/w/foo/g<CR>

2 votes

En fait, cela voudrait dire que W sera remplacé partout dans la barre de commande, y compris, par exemple, dans les recherches, de sorte que s/W foo/bar/g serait transformé en s/w foo/bar/g. cela peut devenir très vite ennuyeux. voyez ma réponse pour une solution complète.

109voto

Sean Points 1766

En faisant des recherches supplémentaires, j'ai trouvé que quelqu'un avait posé presque la même question. question comme moi.

:command <AliasName> <string of command to be aliased>

fera l'affaire.

Veuillez noter que, comme Richo souligne que la commande de l'utilisateur doit commencer par une lettre majuscule.

5 votes

L'utilisation de :command est une bonne solution. :cnoreabbrev ne comprend pas cmd1|cmd2, :command le fait.

1 votes

Une façon moins confuse d'écrire ceci est, :command AliasName string of command to be aliased

8 votes

Cela ne permettra pas de gérer/transférer les command des arguments, comme -nargs , -complete etc.

26voto

DeaDEnD Points 6890

Je trouve que la cartographie de la ; pour : serait une meilleure solution, et vous rendrait plus productif pour taper d'autres commandes.

nnoremap ; :
vnoremap ; :

1 votes

C'est le meilleur conseil pour vim. Je suis tellement habitué maintenant que chaque fois que je rencontre le comportement normal, il me faut quelques essais pour me réhabituer.

0 votes

Ce n'est pas une réponse à la question.

9 votes

@Flimm Non, mais cela fait disparaître le problème de l'OP.

7voto

Sandip Points 31

Supposons que vous vouliez ajouter un alias pour la commande tabnew dans gvim. Vous pouvez simplement taper la commande suivante dans votre fichier .vimrc (s'il n'est pas dans votre dossier personnel, créez-en un)

cabbrev t tabnew

1 votes

Cela entraînera une commande comme :saveas t example à remplacer par :saveas tabnew example

6voto

Benoit Points 35553

Peut-être souhaitez-vous affecter une de vos touches de fonction (F1..F12) à :w ? Ajoutez ceci à votre fichier .vimrc :

noremap  <f1> :w<return>
inoremap <f1> <c-o>:w<return>

(ctrl-o en mode insertion permet de passer temporairement en mode normal).

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