L'alias de commande dans vim

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

souvent, quand j'ai besoin rapidement de sauver le tampon et continuer à une autre tâche Divers, je fais le typique

:w

cependant, I – ce qui semble être plus de 50% du temps – parviennent toujours à capitaliser ce :w . Naturellement, vim me crie dessus parce que W est un invalide commande

E492: Not an editor command: W

ma question est comment peut-on alias colon-commandes dans vim . En particulier, pourriez-vous illustrer comment alias W à w .

je suis conscient de le processus de map à certains commandes . Malheureusement, ce n'est pas ce que je cherche.

126
demandé sur Sean 2010-10-07 08:31:47

7 réponses

pour laisser l'achèvement intact, essayez d'utiliser

cnoreabbrev W w

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

mise à Jour

Voici comment je l'écrirais maintenant :

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

en 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 , donc c'est plus sûr que juste cnoreabbrev W w .

106
répondu ZyX 2018-08-24 11:55:03

avec une recherche supplémentaire, j'ai trouvé que quelqu'un a demandé presque le même question que I.

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

fera l'affaire.

veuillez noter que, comme le souligne Richo , la commande Utilisateur doit commencer par une lettre majuscule.

80
répondu Sean 2017-05-23 11:47:20

je trouve que le mappage de la ; à la : serait une meilleure solution, et vous rendrait plus productif pour taper d'autres commandes.

nnoremap ; :
vnoremap ; :
15
répondu fent 2014-02-13 17:50:41

peut-être que vous aimeriez mapper une de vos touches de fonction (F1..F12) à: w ? Alors mettez ça dans votre .vimrc:

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

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

6
répondu Benoit 2010-10-07 06:36:10

la meilleure solution consiste à écrire une fonction personnalisée pour traiter les abréviations qui n'ont lieu qu'au début de la barre de commande.

pour cela, ajoutez le fichier vimrc suivant ou n'importe où 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 utile les abréviations de la matériel source où j'ai trouvé ce genre de choses:

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")
6
répondu Andy Terra 2012-05-22 19:22:13

supposons que vous voulez ajouter un alias pour la commande tabnew dans gvim. vous pouvez simplement taper la commande suivante dans votre .fichiers vimrc (si pas dans le dossier d'accueil que d'en créer un)

cabbrev t tabnew
6
répondu Sandip 2013-02-27 05:20:50

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

  • précédant les blancs ou les modificateurs tels que :sil(ent)(!) ou :redi(r) ,
  • modificateurs de portée tels que '<,'> pour la sélection visuelle actuelle,
  • échapper aux caractères spéciaux tels que les guillemets, et
  • vérifier si le pseudo est une ligne de commande valide abréviation.
2
répondu Enno 2016-04-11 17:45:57