Alias ​​di un comando in vim


151

Vim è il mio editor di testo preferito quando programmo, e quindi ho sempre un problema particolarmente fastidioso.

Spesso, quando ho bisogno di salvare rapidamente il buffer e continuare con altre attività varie, faccio il tipico

:w

Tuttavia, io - quello che sembra essere più del 50% delle volte - riesco sempre a capitalizzarlo :w. Naturalmente, Vim mi urla perché Wè un comando non valido

E492: Not an editor command: W

La mia domanda è come si possono alias i due punti in vim . In particolare, si potrebbe esemplificare come alias Wper w.

Sono a conoscenza del processo per mappare le chiavi a determinati comandi . Sfortunatamente, non è quello che sto cercando.



1
Per evitare :Wche potresti mappare una chiave per eseguire il salvataggio. Se sei abituato a qualche programma che salva con Ctrl-s, ci sono questi mapping da $ 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>
mMontu,

Domanda simile sullo scambio di stack Vi: vi.stackexchange.com/q/2665/7244
Flimm

Risposte:


128

Per lasciare intatto il completamento, prova a utilizzare

cnoreabbrev W w

, sostituirà Wnella riga di comando con w, ma solo se non è seguito né preceduto da un carattere parola, quindi :W<CR>verrà sostituito con :w<CR>, ma :Writenon lo farà. (Si noti che ciò influisce su tutti i comandi corrispondenti, inclusi quelli che non ci si potrebbe aspettare, ad esempio il comando :saveas W Zverrà sostituito da :saveas w Z, quindi fare attenzione con questo.)

Aggiornare

Ecco come lo scriverei ora :

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

Come una funzione:

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

Questo verifica che il tipo di comando sia :e il comando sia W, quindi è più sicuro del semplice cnoreabbrev W w.


2
Questa risposta è la più sicura e affidabile per me.
Sean,

2
Se si utilizza la soluzione consigliata, tenere presente che entrambi i due comandi seguenti funzioneranno come quello inferiore che potrebbe presentare un risultato imprevisto a seconda del contenuto del buffer e delle impostazioni VIM effettivi::%s/W/foo/g<CR> :%s/w/foo/g<CR>
cprn

2
In realtà, ciò significherebbe che W verrà sostituito ovunque nella barra dei comandi, incluso, ad esempio, nelle ricerche, quindi s / W foo / bar / g verrebbe trasformato in s / w foo / bar / g. questo può diventare fastidioso molto velocemente. vedi la mia risposta per una soluzione completa.
attacco aereo

4
Assolutamente; questa è un'idea orribile . Non dovresti mai , mai , mai farlo.
Chris Morgan,

4
:cnoreabbrev <expr> W getcmdtype()==':'&&getcmdline()=~#'^W'?'w':'W'
kev,

97

Con ricerche supplementari, ho scoperto che qualcuno ha fatto quasi la stessa domanda di I.

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

farà il trucco.

Si noti che, come sottolinea Richo , il comando utente deve iniziare con una lettera maiuscola.


5
Utilizzando: il comando è una buona soluzione. : cnoreabbrev non capisce cmd1 | cmd2, il comando fa.
Pavel Strakhov,

1
Un modo meno confuso per scrivere questo è::command AliasName string of command to be aliased
Alec Jacobson,

8
Questo non gestirà / inoltrerà alcun commandargomento, come -nargs, -completeecc.
blueyed

Che dire di :Q!o :W!?
Jack

5
Giusto per essere molto letterali: inserisci :command W wil .vimrcfile.
Isomorfismi,

20

Trovo che mappare la ;chiave :sarebbe una soluzione migliore e ti renderebbe più produttivo digitando altri comandi.

nnoremap ; :
vnoremap ; :

Questo è il miglior suggerimento per vim. Sono così abituato ora che ogni volta che incontro il comportamento normale, ci sono alcuni tentativi di riqualificare la mia mente.
attacco aereo

Questa non è una risposta alla domanda.
Flimm,

5
@Flimm No, ma risolve il problema di OP.
Duncan X Simpson,

1
Quando si usa to f, di solito si può usare ;per passare alla ricorrenza successiva. Si può tranquillamente mappare l'altro modo, anche se si è mappato il punto e virgola ai due punti. Non ci sarà un ciclo alias. nnoremap : ;
Luc

9

La soluzione migliore prevede la scrittura di una funzione personalizzata per la gestione delle abbreviazioni che si verificano solo all'inizio della barra dei comandi.

Per questo, aggiungi il seguente file vimrc o altrove.

" 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')

Alcune abbreviazioni utili dal materiale di origine in cui ho trovato questa roba:

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")

1
C'è una funzione integrata string()che fa la stessa cosa della tua Single_quote().
ZyX,

6

Forse desideri mappare uno dei tuoi tasti funzione (F1..F12) su: w? Quindi inseriscilo nel tuo .vimrc:

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

(ctrl-o in modalità inserimento passa temporaneamente alla modalità normale).


6

Supponiamo di voler aggiungere un alias per il comando tabnew in gvim. puoi semplicemente digitare il seguente comando nel tuo file .vimrc (se non nella cartella home di crearne uno)

cabbrev t tabnew

1
Questo farà sì che un comando simile :saveas t examplevenga sostituito con:saveas tabnew example
Flimm,

5

Il più sicuro e semplice è un plugin come cmdalias.vim o il mio aggiornamento recente vim-alias che ne tiene conto

  • spazi vuoti o modificatori precedenti come :sil(ent)(!)o :redi(r),
  • modificatori di portata come '<,'>per l'attuale selezione visiva,
  • sfuggire a caratteri speciali come virgolette e
  • controlla se l'alias scelto è un'abbreviazione della riga di comando valida.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.