Aliasing polecenia w Vimie

Vim jest moim preferowanym edytorem tekstu, gdy programuję, a więc zawsze napotykam szczególnie irytujący problem.

Często, gdy szybko muszę zapisać bufor i kontynuować inne różne zadania, wykonuję typowe

:w

Jednak ja – co wydaje się być ponad 50% czasu-zawsze udaje mi się to wykorzystać :w. Oczywiście, vim krzyczy na mnie, ponieważ W jest nieprawidłowym poleceniem

E492: Not an editor command: W

Moje pytanie brzmi, jak można alias dwukropek-polecenia w vim . W szczególności, czy mógłbyś zilustrować, jak alias W do w.

Jestem świadomy procesu mapowanie kluczy do pewnych poleceń. Niestety, nie tego Szukam.

Author: Sean, 2010-10-07

7 answers

Aby pozostawić zakończenie nietknięte, spróbuj użyć

cnoreabbrev W w

, zastąpi W w wierszu poleceń na w, ale tylko wtedy, gdy nie jest poprzedzone ani poprzedzone znakiem słowa, Więc :W<CR> zostanie zastąpione :w<CR>, ale :Write nie będzie. (zauważ, że dotyczy to wszystkich poleceń, które pasują, w tym tych, których możesz się nie spodziewać, na przykład polecenie :saveas W Z zostanie zastąpione przez :saveas w Z, więc bądź ostrożny z tym.)

Update

Oto jak bym to napisał teraz :

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 :, A polecenie to W, więc jest bezpieczniejsze niż tylko cnoreabbrev W w.

 106
Author: ZyX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 11:55:03

Z dodatkowych poszukiwań, znalazłem, że ktoś zadał prawie to samo pytanie Jak Ja.

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

Da radę.

Należy pamiętać, że jak wskazuje Richo, polecenie użytkownika musi zaczynać się od dużej litery.

 80
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:20

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

nnoremap ; :
vnoremap ; :
 15
Author: fent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 17:50:41

Może chciałbyś zmapować jeden ze swoich klawiszy funkcyjnych (F1..F12) do: w ? Więc włóż to do swojego .vimrc:

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

(ctrl-o w trybie wstawiania przełącza się tymczasowo na tryb normalny).

 6
Author: Benoit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-07 06:36:10

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 użytecznych skrótów z materiału źródłowego gdzie znalazłem to:

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
Author: Andy Terra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-22 19:22:13

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

cabbrev t tabnew
 6
Author: Sandip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 05:20:50

Najbezpieczniejszy i najłatwiejszy jest plugin taki jak cmdalias.vim lub moja ostatnia aktualizacja vim-alias z tego, że wziąć pod uwagę

  • poprzedzające spacje lub modyfikatory, takie jak :sil(ent)(!) LUB :redi(r),
  • modyfikatory zakresu, takie jak '<,'> dla bieżącego wyboru wizualnego,
  • unikaj znaków specjalnych, takich jak cudzysłowy i
  • sprawdź, czy wybrany alias jest prawidłowym skrótem wiersza poleceń.
 2
Author: Enno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 17:45:57