Vimrc'imdeki birçok kısaltmayı nasıl yönetir ve hatırlarım?


10

Java, PHP, C / C ++ ve Lateks'ten vimrc dosyamda 500'den fazla kısaltma ( iabbr, abbr) ve bazı eşlemeler var.

Bir süre dil kullanmadığımda hatırlamak kolay değil.

Kısaltma adı üzerinde tamamlama yapıp yapamayacağımı merak ediyorum. Tüm bu kısaltmalara erişmenin / bunları yönetmenin daha iyi bir yolu var mı?

Yanıtlar:


10

500'den fazla kısaltmayı yönetmenin en iyi yolunun ne olduğunu bilmiyorum. Belki uzun vadede, @statox'un açıkladığı gibi, bu sayıyı azaltmak için parçacıklara bakabilirsiniz.

Kısaltmaları otomatik olarak tamamlamak istiyorsanız, aşağıdaki kodu deneyebilirsiniz:

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

Kullanmak için C-x C-ubir kısaltmanın başlangıcından sonra vurmanız gerekir .


Autocmd s:abbrev_list, tüm kısaltmalarınızı içermesi gereken değişkeni ayarlar .

İşlev CompleteAbbrev(), imleçten önceki sözcüğe göre adayların listesini döndürmelidir.

'completefunc'Seçeneğin değeri vurduğunda işlevin çağrılacağı Vim söyler C-x C-u.
Seçeneğin arabellek için yerel olduğuna dikkat edin, bu nedenle yine de bir autocmd ve FileTypeolay kullanarak farklı türde arabelleklerde diğer işlevleri kullanabilirsiniz .

:h complete-functionsİşlevin nasıl çalıştığı hakkında daha fazla bilgi için bkz .


Başka bir çözüm eş anlamlı tamamlama kullanmak olacaktır. Gönderen :h i_^x^t:

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

Bu çözümü kullanmak için 3 şey yapmanız gerekir:

  1. Yaz {lhs}özel bir dosya içindeki tüm kısaltmaların.
    Örneğin /home/user/mysynonyms.txt,. Ve benzer temalar etrafında gruplandırın.
  2. Bu dosyanın yolunu seçeneğe ekleyin 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. C-x C-tBir grup içindeki herhangi bir kısaltmanın adının başlangıcından sonra vurulur .

Örneğin, aşağıdaki kısaltmalara sahip olduğunuzu varsayalım:

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

Bunları ait oldukları programlama diline göre gruplandırabilirsiniz.
İçeride /home/user/mysynonyms.txtşunları yazardınız:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

Şimdi, C-x C-tbir kısaltmanın adından (veya sadece başlangıcından) sonra her vurduğunuzda , Vim açılır menüde aynı satırdaki tüm kısaltmaları görüntülemelidir.

İşte böyle görünecekti:

resim açıklamasını buraya girin

Kısaltmaların gruplanmak için aynı karakterlerle başlaması gerekmediğini, tamamen farklı olabileceğini unutmayın. Eş anlamlılar dosyanızda aynı satırda oldukları sürece, Vim hepsini gösterecektir.

Ve hangi grubun bir kısaltma koyduğuna karar vermek için programlama dilini kullanmak zorunda değilsiniz. Bunları aklınızdaki herhangi bir anlamlı benzerlik / konu / kategoriye göre gruplandırabilirsiniz.

Belirli bir kısaltmayı unuttuğunuzda, bir kategorinin ilk harflerini yazabilir C-x C-t, menüye girip ilgili olanı seçebilirsiniz.

Düzenleme:
Tüm kısaltmalarınızı içine dökmek /home/user/mysynonyms.txtiçin şu 3 Ex komutlarını kullanabilirsiniz:

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

Edit2:
Ben bayrak ekledik nzaman substitute()herhangi ikame gerekmez çünkü fonksiyon denir. Tek amacı, bulunduğunda listeye bir kısaltma eklemektir.
Ancak birçok kısaltmanız olduğu için, bu işlemi gereksiz yere yavaşlatabilir, bilmiyorum. Başlangıçta koymadım çünkü hangi Vim sürümünü kullandığınızı bilmiyorum. Sürümünüz 7.3.627'den daha yeni ise , tamam olmalıdır, aksi takdirde nbayrağı kaldırmanız gerekir .


fantastik ve kapsamlı bir cevap. you Rock
1234

\ v (% ^ | \ n) \ s * ı (% nore) ab% [brev] \ s +% (% (\ <İfade \> | \ <tampon \>) \ s *)? {2} ( \ k +) vimrc dosyamda çalışmıyor
1234

@JoobLee Sistemimde çalışıyor, herhangi bir hata mesajınız var mı? Daha basit (ancak daha az güvenilir) bir regex ile çalışır \vi?abbr\s+(\k+)mı? Sorununuzu yeniden üretip üretemeyeceğimi görmek için bana kısaltmalarınızdan bir alıntıyla bir bağlantı verebilir misiniz?
user9433424

@JoobLee Eğer Vim sürümünüz yeteri kadar yakınsa, nbayrağı yedek çağrıya ekleyin (yanıtı eklemek için yanıtı düzenledim). Aramanızda arama vimrcyaparsanız ve bunu kopyalayıp yapıştırırsanız \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, kısaltmalarınızı vurgulıyor mu?
user9433424

9

Bir wikia ipucu , kısaltmalarınızı seçici olarak görüntülemek için bir yöntem önerir:

Tüm kısaltmalarınızı şununla listeleyebilirsiniz:

:ab<CR>

(yerine abgöre iabsadece mod kısaltmalar uç listesine)

Ve tüm kısaltmaları aynı önekle listeleyebilirsiniz

:ab prefix<CR>

Bu, kısaltmaların tamamlanması kadar ideal değildir, ancak mevcut kısaltmalarınızın bir listesini hızlı bir şekilde almanın iyi bir yolu olabilir.

Bu çözümü daha verimli hale getirmek için iyi bir uygulama, bir dosya türüne özgü kısaltma oluşturmak olacaktır. Örneğin, bu kısaltma yalnızca bir java ara belleğinde yararlıdır:

iabbrev syso System.out.println("");

Bu yüzden bunu şöyle tanımlamak iyidir:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

Autocommand kısmı, yalnızca bir java arabelleği içindeyken kısaltmanın oluşturulmasına izin verir ve <buffer>seçenek, kısaltmaya yalnızca bu arabellekten erişilebilir olmasını sağlar.

Bu şekilde :iab, kısaltma yalnızca bir java arabelleğinde olduğunuzda görüntülenir. Çok fazla kısaltmanız varsa, filetype ile tüm kısaltmaları tanımlayacak ve otomatik komutun işlevi çağırmasına izin verecek bir işlev oluşturmak ilginç olabilir. Gibi bir şey:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

Başka bir çözüm, anahtar kelime kaynağı olarak kısaltmanızın bir listesini kullanarak kendi otomatik tamamlama işlevinizi oluşturmak olabilir.

Son olarak, "500'den fazla kısaltma" dan oldukça etkilendiğimi söylemeliyim, hangilerini kullandığınızı bilmiyorum ama belki aşina değilseniz snippet kavramına bir göz atmanız ilginç olacaktır. onlarla. Bir anahtar kelime girerek ve bir kısayol tuşuna basarak tetiklenen şablonlar olduğu için kısaltmalardan daha esnektirler, kullandığınız kısaltma sayısını azaltmanıza izin verebilir. İlginç bir tanıtım için buraya bakın .


1

Kısaltmaları filetype ile gruplandırmaya ne dersiniz?

Hepsini ~/.vimrcdosyanızda kullanmak yerine, bunları parçalayın ve ~/.vimUnix benzeri işletim sistemlerinde bulunan çalışma zamanı dizininizdeki uygun konumlara yerleştirin .

Örneğin, Markdown kısaltmalarınız ~/.vim/after/ftplugin/markdown.vimVim'in Markdown dosya türü eklentisi yüklendikten sonra kontrol ettiği dosyada bulunur .

Çok büyük .vimrcdosyalara sahip olmamamız gerektiği ortaya çıktı ; kullanarak daha fazla esneklik elde edersiniz $VIMRUNTIME. Çalışma zamanı yolu Vim'ın yardım sistemine belgelenmiştir: :h 'runtimepath'.

Ben ilk mükemmel makaleden bu konuda öğrenilen .vim için .vimrc itibaren Vim temalı gelişiyle takvim üzerinde Vimways .

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.