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.



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.


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ą.


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 ; :

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

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


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

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ń.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.