Aliasowanie polecenia w vimie

151

Vim jest moim ulubionym edytorem tekstu podczas programowania, dlatego zawsze napotykam na szczególnie irytujący problem.

Często, gdy muszę szybko zapisać bufor i przejść do innego zadania, wykonuję typowe

:w

Jednak ja - co wydaje się być ponad 50% przypadków - zawsze udaje mi się to wykorzystać :w. Oczywiście Vim wrzeszczy na mnie, ponieważ Wjest to niepoprawne polecenie

E492: Not an editor command: W

Moje pytanie brzmi: jak można aliasować polecenia dwukropka w vimie . W szczególności, czy mógłbyś zilustrować, jak utworzyć alias Wdo w.

Jestem świadomy procesu mapowania kluczy do niektórych poleceń . Niestety nie tego szukam.

Sean
źródło
1
możliwy duplikat poleceń Czy mogę (ponownie) mapować w vimie?
Chris Morgan
1
Aby tego uniknąć, :Wmożesz przypisać klucz do wykonania zapisywania. Jeśli jesteś przyzwyczajony do jakiegoś programu, który zapisuje za pomocą Ctrl-s, istnieją następujące mapowania z $ 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
Podobne pytanie na giełdzie Vi Stack: vi.stackexchange.com/q/2665/7244
Flimm

Odpowiedzi:

127

Aby pozostawić uzupełnienie nietknięte, spróbuj użyć

cnoreabbrev W w

, zostanie zastąpiony Ww wierszu poleceń wznakiem, ale tylko wtedy, gdy nie jest poprzedzony ani poprzedzony znakiem słowa, więc :W<CR>zostanie zastąpiony przez :w<CR>, ale :Writenie będzie. (Zauważ, że ma to wpływ na wszystkie pasujące polecenia, w tym te, których możesz się nie spodziewać, na przykład polecenie :saveas W Zzostanie zastąpione przez :saveas w Z, więc bądź ostrożny.)

Aktualizacja

Oto jak bym to teraz napisał :

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

Jako funkcja:

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

Sprawdza, czy typ polecenia to :i polecenie to W, więc jest bezpieczniejsze niż zwykłe cnoreabbrev W w.

ZyX
źródło
2
Ta odpowiedź jest dla mnie najbezpieczniejsza i najbardziej wiarygodna.
Sean
2
Jeśli używasz zalecanego rozwiązania, pamiętaj, że oba poniższe polecenia będą działać jako niższe, co może dać nieoczekiwany wynik w zależności od rzeczywistej zawartości bufora i ustawień VIM::%s/W/foo/g<CR> :%s/w/foo/g<CR>
cprn
2
Właściwie oznaczałoby to, że W zostanie zastąpione w dowolnym miejscu paska poleceń, w tym na przykład w wyszukiwaniach, więc s / W foo / bar / g zostanie zamienione na s / w foo / bar / g. może to szybko stać się irytujące. zobacz moją odpowiedź na kompleksowe rozwiązanie.
nalot
4
Absolutnie; to okropny pomysł. Powinieneś nigdy , kiedykolwiek , kiedykolwiek to zrobić.
Chris Morgan
4
:cnoreabbrev <expr> W getcmdtype()==':'&&getcmdline()=~#'^W'?'w':'W'
kev
97

Dzięki dodatkowemu wyszukiwaniu stwierdziłem, że ktoś zadał prawie to samo pytanie co ja.

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

da rade.

Należy pamiętać, że jak podkreśla Richo , polecenie użytkownika musi zaczynać się wielką literą.

Sean
źródło
5
Użycie: polecenie jest dobrym rozwiązaniem. : cnoreabbrev nie rozumie cmd1 | cmd2,: polecenie nie.
Pavel Strakhov,
1
Mniej zagmatwanym sposobem zapisania tego jest::command AliasName string of command to be aliased
Alec Jacobson,
8
To nie będzie obsługiwać / przedstawił żadnych commandargumentów, jak -nargs, -completeitp
blueyed
A co z :Q!lub :W!?
Jack
5
Żeby być bardzo dosłownym: wstaw :command W wdo .vimrcpliku.
isomorphismes
20

Uważam, że odwzorowanie ;klucza na :byłoby lepszym rozwiązaniem i zwiększyłoby produktywność podczas wpisywania innych poleceń.

nnoremap ; :
vnoremap ; :
fent
źródło
To najlepsza wskazówka dla vima. Jestem do tego tak przyzwyczajony, że za każdym razem, gdy napotykam normalne zachowanie, kilka razy próbuję przekwalifikować swój umysł.
nalot
To nie jest odpowiedź na pytanie.
Flimm
5
@Flimm Nie, ale to sprawia, że ​​problem OP znika.
Duncan X Simpson
1
Używając tlub f, zwykle można ;przejść do następnego wystąpienia. Można bezpiecznie odwzorować to w drugą stronę, nawet jeśli zamapujesz średnik na dwukropek. Nie będzie pętli aliasów. nnoremap : ;
Luc
9

Najlepszym rozwiązaniem jest napisanie niestandardowej funkcji do obsługi skrótów, które mają miejsce tylko na początku paska poleceń.

W tym celu dodaj następujący plik vimrc lub gdziekolwiek indziej.

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

Kilka przydatnych skrótów z materiału źródłowego, w którym znalazłem te rzeczy:

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")
nalot
źródło
1
Jest wbudowana funkcja, string()która robi to samo, co twoja Single_quote().
ZyX
6

Może chciałbyś zmapować jeden ze swoich klawiszy funkcyjnych (F1..F12) do: w? Następnie umieść to w swoim .vimrc:

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

(ctrl-o w trybie wstawiania przełącza tymczasowo do trybu normalnego).

Benoit
źródło
6

Załóżmy, że chcesz dodać alias do polecenia tabnew w gvim. możesz po prostu wpisać następujące polecenie w swoim pliku .vimrc (jeśli nie w folderze domowym, utwórz je)

cabbrev t tabnew
Sandip
źródło
1
Spowoduje to :saveas t examplezastąpienie polecenia takiego jak:saveas tabnew example
Flimm
5

Najbezpieczniejsza i najłatwiejsza jest wtyczka taka jak cmdalias.vim lub moja ostatnia aktualizacja vim-alias tego, która bierze pod uwagę

  • poprzedzające puste miejsca lub modyfikatory, takie jak :sil(ent)(!)lub :redi(r),
  • modyfikatory zakresu, takie jak '<,'>dla bieżącej selekcji wizualnej,
  • unikaj znaków specjalnych, takich jak cudzysłowy i
  • sprawdź, czy wybrany alias jest poprawnym skrótem w linii poleceń.
Enno
źródło