Saya mencoba untuk meningkatkan fungsi penyelesaian lama. Saya ingin memperbarui pilihan yang ditampilkan di menu sembulan saat saya mengetik karakter baru
Fungsi penyelesaian saya adalah
function! lh#icomplete#ecm(findstart, base) abort
if a:findstart
let l = getline('.')
let startcol = match(l[0:col('.')-1], '\v\S+$')
if startcol == -1
let startcol = col('.')-1
endif
" let g:debug+= ["findstart(".a:base.") -> ".(startcol)]
return startcol
else
" let g:debug += ["matching(".a:base.")"]
let words = ['un', 'deux', 'trois', 'trente-deux', 'unité']
call filter(words, 'v:val =~ a:base')
" return { 'words' : words}
return { 'words' : words, 'refresh' : 'always'}
endif
endfunction
Yang saya gunakan dengan
:set completefunc=lh#icomplete#ecm
:inoremap µ <c-x><c-u><c-p>
Dari pemahaman saya tentang dokumentasi, fakta yang saya gunakan <c-p>
, saya masuk ke status ketiga (sesuai dengan | ins-completion-menu |), dan ketika saya mengetik "karakter apa pun yang dapat dicetak dan tidak putih" saya harus bisa "Tambah karakter ini dan kurangi jumlah kecocokan. "
Ketika saya mengetik dalam mode sisipkan uµ
, menu penyelesaian muncul seperti yang diharapkan. Sayangnya ketika saya mengetik x
(tepat setelah µ
), saya keluar dari mode penyelesaian dan ux
apa yang saya dapatkan di buffer saya.
Apa yang saya lakukan salah atau terlewatkan dalam dokumentasi?
NB: Saya sudah melihat bahwa tanpa refresh=always
, hasilnya disaring, kecuali saya ingin memanggil fungsi lagi untuk menerapkan filter khusus.
(Untuk berjaga-jaga, saya menggunakan gvim 7.4-908)
sumber
Jawaban:
Setelah penyelidikan lebih lanjut (dan beberapa rekayasa balik).
Saya tidak bisa menjelaskan mengapa penyelesaian tidak sepenuhnya mengikuti dokumentasi. Saya harus bertanya pada vim_dev saya kira.
Bagaimanapun, sepertinya cara untuk melakukannya terdiri dari mendaftarkan pendengar
CursorMovedI
yang akan memicu penyelesaian lagi setiap kali karakter dimasukkan.Kesulitannya adalah untuk mengetahui kapan harus berhenti.
CompletionDone
tidak ada gunanya karena akan dipicu setelah setiap tombol hit.InsertLeave
adalah awal yang baik, tetapi tidak mencakup semua kasus, yaituSaya tidak menemukan cara lain selain mengganti
<cr>
, dan<c-y>
.Kesulitan lain terdiri dari mendeteksi ketika tidak ada yang berubah untuk menghindari jenis loop tak terbatas dan seterusnya.
Bagaimanapun, ini adalah kode saya saat ini (yang akan digunakan dalam plugin lain). Versi terakhir akan dipertahankan di sini . Cukup panjang, tapi ini dia:
Yang dapat digunakan dengan:
Anda harus dapat mengamati (secara tidak langsung) hasil yang diterapkan pada pilihan snippet C ++ untuk plugin expander template saya pada screencast ini .
sumber