Cmdline'daki seçenek değerleri için otomatik tamamlama


10

Bunu yapmaya çalıştığım sayısını sayamıyorum:

:set foldmethod=syn^I

Görünüşe göre tamamlama seçenek değerleri üzerinde çalışmıyor!

Bazı durumlarda, seçenekler tamamlamanın mantıklı olmayabileceği karmaşık dizelerdir. (Örn 'comments'.)

Ancak, yaygın kullanım örnekleri için wildchar-tamamlama sağlama yönünde herhangi bir çaba var mı?

Değilse, yukarıdaki örneği nasıl çalıştırabilirim? (Dizelerden birini tamamlamak istediğimi varsayarsak ['manual', 'indent', 'expr', 'marker', 'syntax'].)

Yanıtlar:


3

Aşağıdaki kodu deneyebilirsiniz:

let s:option_values = {'foldmethod'  : ['manual', 'indent', 'expr', 'marker', 'syntax'],
                     \ 'bufhidden'   : ['hide', 'unload', 'delete', 'wipe'],
                     \ 'virtualedit' : ['block', 'insert', 'all', 'onemore'] ,}

set wildcharm=<c-z>

cnoremap <expr> <tab>
            \ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
            \ '<c-z>' :
            \ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

function! s:SetComplete(A, L, P) abort
    let option = matchstr(a:A, '^.*\ze=')
    if !has_key(s:option_values, option)
        return
    endif
    let candidates = copy(s:option_values[option])
    call map(candidates, 'option . "=" . v:val')
    return filter(candidates, 'v:val =~ "^" . a:A')
endfunction

İlk olarak s:option_valuesamacı seçeneklerinizi (anahtarları olarak) ve değerlerini (listelerdeki değerleri olarak) içermek olan bir sözlük tanımlar . Burada bir örnek olarak, değerler + 3 seçenek saklanır:
'foldmethod', 'bufhidden', 'virtualedit'.

set wildcharm=<c-z>

Bu satır 'wildcharm'seçeneği ayarlar <c-z>ve Vim'e bir eşleme görürse wildmenü etkinleştirmesi gerektiğini söyler. Bu seçeneği ayarlamadan <tab>, bir eşleştirmeye yazarsanız , basit bir sekme karakteri ekleyecektir.

cnoremap <expr> <tab>

<tab>Komut satırına her bastığınızda bir ifadenin değerlendirmesini yazacak bir eşleme tanımına başlayın .

\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?

Eşleme, komut ^\s*set\s\+\w\+=satırının, formu izleyen bir çizgi set option=olan kalıpla eşleşip eşleşmediğini veya wildmenu'nun etkin olup olmadığını sınar.

\ '<c-z>' :

Önceki test başarılı olursa, haritalama wildmenu etkinleştirir.

\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'

Aksi takdirde, sistem komutunu :setözel komutla değiştirir :Setve wildmenü etkinleştirir.

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

Adı burada bulunan özel bir tamamlama işlevini kullanabilmesi dışında :Set, aynı şeyi yapan özel komutu tanımlayın .:sets:SetComplete()

function! s:SetComplete(A, L, P) abort

Özel tamamlama işlevinin tanımına başlayın.

Önerileri / adayları bir liste aracılığıyla döndürmelidir. Komut ağa otomatik olarak 3 argümanlar gönderecektir:
:Set

  • şu anda tamamlanmakta olan argümanın baş kısmı (yani option=...)
  • tüm komut satırı
  • içindeki imleç konumu

Daha :h :command-completion-customlistfazla bilgi için bakınız .

let option = matchstr(a:A, '^.*\ze=')

Tamamlanan bağımsız değişkenten seçeneğin adını çıkarın.

if !has_key(s:option_values, option)
    return
endif

optionSözlüğünüzde olup olmadığını kontrol edin . Değilse, işlev hiçbir şey döndürmez.

let candidates = copy(s:option_values[option])

Seçeneğin sözlüğünüzden alabileceği değerler listesinin bir kopyasını alın.

call map(candidates, 'option . "=" . v:val')

Listedeki her bir değer için candidates, dizeyi option=( optiondeğerlendirilecek olan) önüne ekleyin .

return filter(candidates, 'v:val =~ "^" . a:A')

candidatesBaşlangıcı tamamlanan bağımsız değişkenle eşleşmeyen öğeleri kaldırın ve sonucu döndürün.


2

AFAIK, bunu sağlamayan yerleşik komutlara cmdline-completion ekleyemeyiz. Ya "geçersiz kılma" tamamlama desteklemeyeceğiz başka biriyle komutu (burada, sen tanımlayabiliriz :Setbir sermaye ile S) veya kayıp olanı eklemek için vim kaynak koduna kesmek.

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.