Bagaimana saya mengelola dan mengingat banyak singkatan di vimrc saya?

10

Saya memiliki lebih dari 500 singkatan ( iabbr, abbr) dan beberapa pemetaan dalam file vimrc saya dari Java, PHP, C / C ++ dan Latex.

Tidak mudah untuk segera mengingat ketika saya tidak menggunakan bahasa untuk beberapa waktu.

Saya bertanya-tanya apakah saya bisa menyelesaikan nama singkatan. Apakah ada cara yang lebih baik untuk mengakses / mengelola semua singkatan ini?

1234
sumber

Jawaban:

10

Saya tidak tahu apa cara terbaik untuk mengelola lebih dari 500 singkatan. Mungkin dalam jangka panjang, seperti yang dijelaskan @statox, Anda dapat melihat potongan untuk mengurangi angka ini.

Dan jika Anda ingin melengkapi singkatan secara otomatis, Anda dapat mencoba kode berikut:

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

Untuk menggunakannya, Anda harus menekan C-x C-usetelah awal singkatan.


Autocmd mengatur variabel s:abbrev_listyang harus berisi semua singkatan Anda.

Fungsi CompleteAbbrev()harus mengembalikan daftar kandidat berdasarkan kata sebelum kursor.

Nilai 'completefunc'opsi memberi tahu Vim fungsi yang akan dipanggil saat Anda menekan C-x C-u.
Perhatikan bahwa opsi ini bersifat lokal untuk buffer, jadi Anda masih bisa menggunakan fungsi lain di berbagai jenis buffer, menggunakan autocmd dan FileTypeacara misalnya.

Lihat :h complete-functionsuntuk info lebih lanjut tentang cara fungsi bekerja.


Solusi lain adalah dengan menggunakan penyelesaian sinonim. Dari :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.

Untuk menggunakan solusi ini, Anda harus melakukan 3 hal:

  1. Tuliskan {lhs}semua singkatan Anda di dalam file khusus.
    Sebagai contoh /home/user/mysynonyms.txt,. Dan kelompokkan mereka di sekitar tema yang serupa.
  2. Tambahkan path ke file ini ke opsi 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Tekan C-x C-tsetelah awal nama singkatan di dalam grup.

Misalnya, anggap Anda memiliki singkatan berikut:

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

Anda dapat mengelompokkannya sesuai dengan bahasa pemrograman mereka.
Di dalam /home/user/mysynonyms.txt, Anda akan menulis:

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

Sekarang, setiap kali Anda menekan C-x C-tnama singkatan (atau hanya awal), Vim akan menampilkan, dalam menu popup, semua singkatan yang berada di baris yang sama.

Begini tampilannya:

masukkan deskripsi gambar di sini

Perhatikan bahwa singkatan tidak perlu dimulai dengan karakter yang sama untuk dikelompokkan, mereka bisa sangat berbeda. Selama mereka berada di baris yang sama dalam file sinonim Anda, Vim akan menunjukkan semuanya.

Dan Anda tidak harus menggunakan bahasa pemrograman untuk memutuskan di mana grup meletakkan singkatan. Anda dapat mengelompokkannya berdasarkan kesamaan / topik / kategori yang Anda pikirkan.

Jadi, ketika Anda lupa singkatan tertentu, Anda bisa mengetikkan huruf pertama dari suatu kategori, tekan C-x C-tdan pilih yang relevan di dalam menu.

Sunting:
Untuk membuang semua singkatan Anda di dalam /home/user/mysynonyms.txt, Anda bisa menggunakan 3 perintah Ex ini:

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

Sunting2:
Saya telah menambahkan bendera nketika substitute()fungsi dipanggil karena Anda tidak memerlukan substitusi apa pun. Satu-satunya tujuan adalah untuk menambahkan singkatan di dalam daftar setiap kali ditemukan.
Tetapi karena Anda memiliki banyak singkatan, itu bisa membuat prosesnya lambat, saya tidak tahu. Awalnya, saya tidak mengatakannya karena saya tidak tahu versi Vim yang Anda gunakan. Jika versi Anda lebih baru dari 7.3.627 , seharusnya tidak apa-apa, jika tidak, Anda harus menghapus nbendera.

pengguna9433424
sumber
jawaban yang fantastis dan komprehensif. you Rock
1234
\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <expr \> | \ <buffer \>) \ s +) {, 2} ( \ k +) tidak berfungsi pada file vimrc saya
1234
@ JoobLee Ini berfungsi di sistem saya, apakah Anda memiliki pesan kesalahan? Apakah ini berfungsi dengan regex yang lebih sederhana (tapi kurang dapat diandalkan) \vi?abbr\s+(\k+)? Bisakah Anda memberi saya tautan dengan kutipan singkatan Anda, untuk melihat apakah saya dapat mereproduksi masalah Anda?
user9433424
@ JoobLee Jika versi Vim Anda cukup baru, tambahkan nbendera ke panggilan pengganti (saya sudah mengedit jawaban untuk memasukkannya). Jika Anda melakukan pencarian di vimrcdan menyalin-paste ini \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, apakah ini menyoroti singkatan Anda?
user9433424
9

Tip wikia menyarankan metode untuk menampilkan singkatan Anda secara selektif:

Anda dapat membuat daftar semua singkatan Anda dengan

:ab<CR>

(ganti aboleh iabke daftar hanya menyisipkan singkatan mode)

Dan Anda dapat membuat daftar semua singkatan dengan awalan yang sama dengannya

:ab prefix<CR>

Ini tidak semudah penyelesaian pada singkatan tapi itu bisa menjadi cara yang baik untuk secara cepat memiliki daftar singkatan yang ada.

Untuk membuat solusi ini lebih efisien, praktik yang baik adalah membuat singkatan khusus untuk tipe file. Misalnya, singkatan ini hanya berguna dalam buffer java:

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

Jadi, baik untuk mendefinisikannya seperti ini:

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

Bagian perintah otomatis memungkinkan untuk membuat singkatan hanya ketika Anda berada di buffer java dan <buffer>opsi membuat singkatan hanya dapat diakses dari buffer ini.

Cara ini hanya :iabakan menampilkan singkatan ketika Anda berada di buffer java. Jika Anda memiliki banyak singkatan, mungkin menarik untuk membuat fungsi berdasarkan tipe file yang akan mendefinisikan semua singkatan dan membiarkan perintah otomatis memanggil fungsi. Sesuatu seperti:

autocmd! FileType latex call CreateLatexAbbrev()

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

Solusi lain dapat membuat fungsi pelengkapan otomatis Anda sendiri menggunakan daftar singkatan Anda sebagai sumber kata kunci.

Akhirnya saya harus mengatakan bahwa saya cukup terkesan dengan "lebih dari 500 singkatan", saya tidak tahu yang mana yang Anda gunakan tetapi mungkin akan menarik bagi Anda untuk melihat pada konsep snippet jika Anda tidak terbiasa dengan mereka. Karena ini adalah templat yang dipicu dengan memasukkan kata kunci dan menekan tombol pintas, mereka lebih fleksibel daripada singkatan, mungkin memungkinkan Anda untuk mengurangi jumlah singkatan yang Anda gunakan. Lihat di sini untuk pengantar yang menarik.

statox
sumber
1

Bagaimana dengan mengelompokkan singkatan berdasarkan jenis file?

Alih-alih memiliki semuanya dalam ~/.vimrcfile Anda , pisahkan dan letakkan di lokasi yang tepat di direktori runtime Anda, yang ada ~/.vimdi sistem operasi mirip Unix.

Misalnya, singkatan Markdown Anda akan terletak di file ~/.vim/after/ftplugin/markdown.vim, yang Vim cek setelah plugin filetype Markdown dimuat.

Ternyata kita seharusnya tidak memiliki .vimrcfile besar ; Anda mendapatkan lebih banyak fleksibilitas menggunakan $VIMRUNTIME. Jalan runtime didokumentasikan dalam sistem bantuan Vim ini: :h 'runtimepath'.

Saya pertama kali belajar tentang ini dari artikel yang bagus Dari .vimrc ke .vim pada Vimways kalender bertema Vim .

alwillis
sumber