Vim'de bir komutun takma adı


151

Vim programladığımda tercih ettiğim metin editörü ve bu yüzden her zaman özellikle can sıkıcı bir sorunla karşılaşıyorum.

Sıklıkla, arabelleği hızla kaydetmem ve diğer çeşitli görevlere devam etmem gerektiğinde, tipik

:w

Bununla birlikte, ben - zamanın% 50'sinden fazlası gibi görünen - her zaman bunu büyük harfle kullanmayı başarabilirim :w. Doğal olarak, vim bana bağırıyor çünkü Wgeçersiz bir komut

E492: Not an editor command: W

Benim sorum vim içinde nasıl iki nokta üst üste kolon komutları olabilir . Özellikle, nasıl takma ad atabileceğinizi örnekler Wmisiniz w?

Anahtarları belirli komutlarla eşleştirme sürecinin farkındayım . Ne yazık ki, aradığım şey bu değil.



1
Bundan kaçınmak için :Wbir haritayı kaydederek bir anahtar kaydedebilirsiniz. Ctrl-s ile kaydeden bazı programlara alışkınsanız, $ VIM / mswin.vim adresinden bu eşlemeler vardır:" 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

Benzer soru Vi Stack exchange: vi.stackexchange.com/q/2665/7244
Flimm

Yanıtlar:


127

Tamamlamayı el değmeden bırakmak için şunu kullanmayı deneyin:

cnoreabbrev W w

, Wkomut satırında yerini alacaktır w, ancak yalnızca kelime karakterinden sonra ne takip edilmez ne de kelime karakteri :W<CR>gelirse değiştirilir :w<CR>, ancak değiştirilmez :Write. (Bunun, beklemeyeceğiniz komutlar da dahil olmak üzere eşleşen tüm komutları etkilediğini unutmayın; örneğin, komutun :saveas W Zyerini alacaktır :saveas w Z, bu nedenle buna dikkat edin.)

Güncelleme

İşte ben bunu yazardım nasıl şimdi :

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

İşlev olarak:

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

Bu kontroller komut türü olduğunu :ve komut Wsadece daha güvenli, böylece cnoreabbrev W w.


2
Bu cevap benim için en güvenli ve en güvenilir cevaptır.
Sean

2
Önerilen çözümü kullanırsanız, lütfen aşağıdaki iki komutun her ikisinin de gerçek arabellek içeriğine ve VIM ayarlarına bağlı olarak beklenmedik bir sonuç sunabilecek şekilde altta çalışacağını unutmayın::%s/W/foo/g<CR> :%s/w/foo/g<CR>
cprn

2
Aslında bu, W'nin, örneğin aramalar da dahil olmak üzere komut çubuğunun herhangi bir yerinde değiştirileceği anlamına gelir, bu nedenle s / W foo / bar / g, s / w foo / bar / g'ye dönüştürülür. bu çok hızlı can sıkıcı olabilir. kapsamlı bir çözüm için cevabımı görün.
hava saldırısı

4
Kesinlikle; bu korkunç bir fikir. Sen gerektiğini asla , hiç , hiç bunu.
Chris Morgan

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

97

Tamamlayıcı arama ile, birisinin benimle neredeyse aynı soruyu sorduğunu gördüm .

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

hile yapacak.

Richo'nun belirttiği gibi , kullanıcı komutunun büyük bir harfle başlaması gerektiğini lütfen unutmayın .


5
: Komutunu kullanmak iyi bir çözümdür. : cnoreabbrev cmd1 | cmd2'yi anlamıyor,: komutu anlıyor.
Pavel Strakhov

1
Bunu yazmak için daha az kafa karıştırıcı bir yol,:command AliasName string of command to be aliased
Alec Jacobson

8
Bu , vb. commandGibi herhangi bir argümanı ele almaz / -nargs-complete
iletmez

Peki :Q!ya :W!?
Jack

5
Koyun: Sadece çok edebi olmaya :command W wiçinde .vimrcdosyanın.
izomorfizmalar

20

;Anahtarın eşlenmesinin :daha iyi bir çözüm olacağını ve sizi diğer komutları yazmak için daha verimli hale getireceğini düşünüyorum.

nnoremap ; :
vnoremap ; :

Bu vim için en iyi ipucudur. Şimdi o kadar alışkınım ki, her zaman normal davranışla karşılaştığımda, zihnimi yeniden eğitmek için birkaç tane almam gerekiyor.
hava saldırısı

Bu sorunun cevabı değil.
Flimm

5
@Flimm Hayır, ancak OP'nin sorununu ortadan kaldırıyor.
Duncan X Simpson

1
tVeya kullanılırken f, genellikle bir ;sonraki tekrarlamaya gitmek için kullanılabilir . Noktalı virgül ile iki nokta üst üste eşlemiş olsanız bile, bunu güvenli bir şekilde başka bir şekilde eşleyebilirsiniz. Bir takma ad döngüsü olmayacak. nnoremap : ;
Luc

9

En iyi çözüm, yalnızca komut çubuğunun başında yer alan kısaltmaları işlemek için özel bir işlev yazmayı içerir .

Bunun için aşağıdaki vimrc dosyanızı veya başka bir yere ekleyin.

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

Bu malzemeyi bulduğum kaynak malzemeden birkaç yararlı kısaltma :

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()Sizinkiyle aynı şeyi yapan yerleşik bir işlev var Single_quote().
ZyX

6

Belki fonksiyon tuşlarınızdan birini (F1..F12) şuna eşlemek istersiniz: w? Sonra bunu .vimrc'nize koyun:

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

(ekleme modundaki ctrl-o geçici olarak normal moda geçer).


6

Gvim'de tabnew komutu için takma ad eklemek istediğinizi varsayalım. .vimrc dosyanıza aşağıdaki komutu yazmanız yeterlidir (ana klasörde değilse bir tane oluştur)

cabbrev t tabnew

1
Bu, bir komutun :saveas t exampledeğiştirilmesine neden olacak:saveas tabnew example
Flimm

5

Güvenli ve kolay olarak bir eklentisi şekildedir cmdalias.vim ya da benim son güncelleme vim-takma bunun dikkate aldığından emin

  • önceki boşluklar veya değiştiriciler :sil(ent)(!)veya :redi(r),
  • '<,'>geçerli görsel seçim gibi aralık değiştiriciler ,
  • tırnak işareti gibi özel karakterlerden kaçma ve
  • seçilen takma adın geçerli bir komut satırı kısaltması olup olmadığını kontrol edin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.