web-dev-qa-db-fra.com

Aliasing d'une commande dans vim

Vim est mon éditeur de texte préféré lors de la programmation. Je rencontre donc toujours un problème particulièrement gênant.

Souvent, lorsque j’ai rapidement besoin de sauvegarder le tampon et de passer à une autre tâche, je fais la tâche

:w

Cependant, je - ce qui semble être plus de 50% du temps - réussis toujours à capitaliser ça :w. Naturellement, vim me crie parce que W est une commande invalide

E492: Not an editor command: W

Ma question est la suivante: comment peut-on alias deux-commandes-commandes dans vim. En particulier, pourriez-vous illustrer comment alias W à w.

Je suis conscient du processus pour mapper les clés pour certaines commandes . Malheureusement, ce n'est pas ce que je recherche.

141
Sean

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

cnoreabbrev W w

, il remplacera W dans la ligne de commande par w, mais uniquement s’il n’est ni suivi ni précédé par un caractère Word, donc :W<CR> sera remplacé par :w<CR>, mais :Write ne le fera pas. (Notez que cela concerne 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, alors 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")

Ceci vérifie que le type de commande est : et la commande est W, il est donc plus sûr que simplement cnoreabbrev W w.

117
ZyX

Avec la recherche supplémentaire, j'ai trouvé que quelqu'un demandait à peu près la même chose question comme I.

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

fera l'affaire.

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

91
Sean

Je trouve que mapper le ; la clé de : serait une meilleure solution et vous rendrait plus productif pour taper d’autres commandes.

nnoremap ; :
vnoremap ; :
19
fent

La meilleure solution implique écriture d'une fonction personnalisée pour la gestion des abréviations qui ne se produisent qu'au début de la barre de commandes.

Pour cela, ajoutez ce qui suit votre fichier vimrc ou ailleurs.

" cabs - less stupidity                                                      {{{
fu! Single_quote(str)
  return "'" . substitute(copy(a:str), "'", "''", 'g') . "'"
endfu
fu! Cabbrev(key, value)
  exe printf('cabbrev <expr> %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s',
    \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key))
endfu
"}}}

" use this custom function for cabbrevations. This makes sure that they only
" apply in the beginning of a command. Else we might end up with stuff like
"   :%s/\vfoo/\v/\vbar/
" if we happen to move backwards in the pattern.

" For example:
call Cabbrev('W', 'w')

Quelques abréviations utiles du matériel source où j'ai trouvé ce matériel:

call Cabbrev('/',   '/\v')
call Cabbrev('?',   '?\v')

call Cabbrev('s/',  's/\v')
call Cabbrev('%s/', '%s/\v')

call Cabbrev('s#',  's#\v')
call Cabbrev('%s#', '%s#\v')

call Cabbrev('s@',  's@\v')
call Cabbrev('%s@', '%s@\v')

call Cabbrev('s!',  's!\v')
call Cabbrev('%s!', '%s!\v')

call Cabbrev('s%',  's%\v')
call Cabbrev('%s%', '%s%\v')

call Cabbrev("'<,'>s/", "'<,'>s/\v")
call Cabbrev("'<,'>s#", "'<,'>s#\v")
call Cabbrev("'<,'>s@", "'<,'>s@\v")
call Cabbrev("'<,'>s!", "'<,'>s!\v")
9
Andy Terra

Vous souhaitez peut-être mapper l'une de vos touches de fonction (F1..F12) sur: w? Puis mettez ceci dans votre .vimrc:

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

(ctrl-o en mode insertion bascule temporairement en mode normal).

6
Benoit

Supposons que vous souhaitiez ajouter un alias pour la commande tabnew dans gvim. vous pouvez simplement taper la commande suivante dans votre fichier .vimrc (sinon dans le dossier de base que d'en créer un)

cabbrev t tabnew
6
Sandip

Le plus sûr et le plus facile est un plugin tel que cmdalias.vim ou ma récente mise à jour vim-alias de celui-ci qui prend en compte

  • des espaces ou des modificateurs précédents tels que :sil(ent)(!) ou :redi(r),
  • les modificateurs de plage tels que '<,'> pour la sélection visuelle en cours,
  • échappe aux caractères spéciaux tels que les guillemets et
  • vérifie si l'alias choisi est une abréviation de ligne de commande valide.
3
Enno