Згладжування команди в vim


151

Vim є моїм кращим текстовим редактором, коли я програмую, і тому я завжди стикаюся з особливо прикрою проблемою.

Часто, коли мені швидко потрібно зберегти буфер і продовжувати виконувати інші завдання, я виконую типове

:w

Однак мені - як здається, більше 50% часу - завжди вдається скористатися цим :w. Природно, vim кричить на мене, тому що Wце недійсна команда

E492: Not an editor command: W

Моє запитання - як можна створювати псевдоніми двокрапкових команд у vim . В Зокрема, ви могли б служити прикладом , як псевдонім Wдля w.

Мені відомо про процес відображення ключів до певних команд . На жаль, це не те, що я шукаю.



1
Щоб уникнути, :Wви могли б зіставити ключ для збереження. Якщо ви звикли до якоїсь програми, яка зберігає за допомогою Ctrl-s, є такі відображення від $ 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

Аналогічне запитання щодо обміну Vi Stack: vi.stackexchange.com/q/2665/7244
Flimm

Відповіді:


127

Щоб залишити незавершене завершення, спробуйте скористатися

cnoreabbrev W w

, він замінить Wу командному рядку на w, але лише у тому випадку, якщо за ним не дотримується і не передує символ слова, тому :W<CR>він буде замінений :w<CR>, але :Writeне буде. (Зверніть увагу, що це впливає на будь-які команди, які відповідають, включаючи ті, яких ви можете не очікувати. Наприклад, команду :saveas W Zбуде замінено :saveas w Z, тому будьте обережні з цим.)

Оновлення

Ось як я б написати його прямо зараз :

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

Як функція:

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

Це перевіряє, що тип команди є, :а команда - Wце безпечніше, ніж просто cnoreabbrev W w.


2
Ця відповідь для мене найбезпечніша та найнадійніша.
Шон

2
Якщо ви користуєтесь рекомендованим рішенням, будь ласка, пам’ятайте, що обидві команди нижче будуть працювати як нижня, що може призвести до несподіваного результату залежно від фактичного вмісту буфера та налаштувань VIM::%s/W/foo/g<CR> :%s/w/foo/g<CR>
cprn

2
Власне, це означатиме, що W буде замінено в будь-якому місці командного рядка, включаючи, наприклад, в пошуку, тому s / W foo / bar / g буде перетворено на s / w foo / bar / g. це може отримати роздратування дуже швидко. дивіться мою відповідь на комплексне рішення.
авіаудар

4
Абсолютно; це жахлива ідея. Ви повинні ніколи , ніколи , ніколи НЕ робити цього.
Кріс Морган

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

97

За допомогою додаткового пошуку я виявив, що хтось задав майже те саме питання, що і я.

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

зробить трюк.

Зауважте, що, як вказує Річо , команда користувача повинна починатися з великої літери.


5
Використання: команда - це гарне рішення. : cnoreabbrev не розуміє cmd1 | cmd2,: команда робить.
Павло Страхов

1
Менш заплутаний спосіб написати це:command AliasName string of command to be aliased
Алек Джейкобсон,

8
Це не обробляє / не command-nargs-complete
передає

Що про :Q!або :W!?
Джек

5
Просто бути дуже буквальним: покладіть :command W wу .vimrcфайл.
ізоморфізми

20

Я вважаю, що відображення ;ключа для :було б кращим рішенням, і зробило б вас більш продуктивними для введення інших команд.

nnoremap ; :
vnoremap ; :

Це найкраща порада для vim. Я зараз так звик до цього, що кожного разу, коли я стикаюся з нормальною поведінкою, мені потрібно кілька спроб перевчити розум.
авіаудар

Це не відповідь на запитання.
Flimm

5
@Flimm Ні, але це призводить до того, що проблема ОП відходить.
Duncan X Simpson

1
Під час використання tабо f, зазвичай, ;можна перейти до наступного явища. Можна сміливо відображати це іншим способом, навіть якщо ви вказали крапку з комою до двокрапки. Не буде циклу псевдоніму. nnoremap : ;
Люк

9

Найкраще рішення передбачає написання спеціальної функції для обробки скорочень, які мають місце лише на початку командної панелі.

Для цього додайте наступний файл vimrc або деінде.

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

Кілька корисних скорочень із вихідного матеріалу, де я знайшов цей матеріал:

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
Існує вбудована функція, string()яка робить те саме, що і ваша Single_quote().
ZyX

6

Можливо, ви хочете зіставити одну зі своїх функціональних клавіш (F1..F12) на: w? Потім вставте це у свій .vimrc:

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

(ctrl-o в режимі вставки тимчасово переходить у звичайний режим).


6

Припустимо, ви хочете додати псевдонім для команди tabnew в gvim. ви можете просто ввести таку команду у вашому файлі .vimrc (якщо не в домашній папці, ніж створити)

cabbrev t tabnew

1
Це призведе до того, що команду, :saveas t exampleяку потрібно замінити на:saveas tabnew example
Flimm

5

Найбезпечнішим і найпростішим є плагін, такий як cmdalias.vim або моє недавнє оновлення vim-alias його, яке враховує

  • попередні заготовки або модифікаторів , такі як :sil(ent)(!)або :redi(r),
  • модифікатори діапазону, такі як '<,'>для поточного візуального вибору,
  • уникати спеціальних символів, таких як цитати та
  • перевірте, чи вибраний псевдонім є дійсною абревіатурою командного рядка.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.