Bagaimana saya bisa menggunakan penyelesaian mode penyisipan di makro?

11

Saya mencoba mendefinisikan makro yang dengan cepat menghasilkan daftar kata-kata acak.
Saya ingin makro mengubahnya menjadi daftar seperti

a
b
c
d
e

dalam hal ini

arezzo
bywords
czars
détente
eyrie

Apa yang saya miliki sejauh ini:

  • letakkan kursor di atas huruf a
  • mulai merekam makro qq
  • a masuk ke mode insert
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the lettera`
  • <C-p>pilih item terakhir dalam daftar penyelesaian yang muncul, di sistem saya kata arezzo. (NB Saya telah longestmemasukkan dalam 'completeopt'pengaturan saya , yang diperlukan untuk <C-p>bekerja dengan cara ini selama penyelesaian:) 'set completeopt=longest,menuone,preview'.
  • <C-y> terima penyelesaiannya
  • ^[^[ keluar dari mode penyisipan
  • j pindah ke baris berikutnya, siap untuk melakukan operasi yang sama pada baris berikutnya
  • q berhenti merekam

ketika saya membuat makro dan melalui langkah-langkah secara manual, semuanya berfungsi dengan baik, namun ketika saya menjalankan makro, saya melihat pesan yang berkedip di baris perintah, seperti:

memindai file kamus

dan tidak ada yang terjadi, dari perintah-perintah di makro hanya jdijalankan, yaitu kursor bergerak ke bawah baris, tetapi tidak ada perintah penyelesaian berjalan.
Apakah mungkin untuk menggunakan penyelesaian mode penyisipan di makro, dan jika demikian, bagaimana saya bisa melakukannya?

the_velour_fog
sumber
Saya tidak mengerti <C-p>langkah Anda ... ketika saya melakukannya di vim saya, itu hanya memberikan pesan back at original- tidak memilih item terakhir .. Saya menggunakan tombol panah dua kali untuk memilih kata terakhir (kasus saya azures), tekan enter dan lalu Esc+j+q.. itu kemudian bekerja dengan sangat baik dalam menjalankan makro
Sundeep
1
@spasic titik ah baik, saya harus telah disebutkan, tapi aku menggunakan set completeopt=longest,menuone,previewnya yang longestpilihan yang menyebabkan <C-p>untuk segera memasukkan. Jika saya menghapus longestdari completeoptstring, saya mendapatkan perilaku yang sama seperti Anda. Juga, ya tombol panah berfungsi! terima kasih (saya lupa Anda dapat menggunakannya untuk menavigasi daftar penyelesaian)
the_velour_fog
Mungkin menu popup mengganggu. Mungkin mencoba :set completeopt=dan a<c-x><c-k><esc>jsebagai makro Anda.
Antony
@Antony Saya tidak yakin mengapa <Cp> tidak berfungsi, tetapi tombol panah arah berfungsi.
the_velour_fog

Jawaban:

2

EDIT : Benar-benar Anda setelah kamus selesai; Anda tidak perlu memasukkan mode (mode Ctrl + X) untuk melakukan ini. Ketika Anda menemukan, itu membuat bekerja dengan makro benar-benar menyakitkan. Skrip di bawah ini dapat digunakan untuk menyelesaikan kamus tanpa memasukkan mode, sehingga Anda dapat dengan mudah mengulanginya di dalam makro.

Tambahkan kode di bawah ini ke .vimrcfile Anda , tutup dan buka kembali jendela vim apa pun untuk mendapatkan fungsi baru, dan kemudian rekam diri Anda secara bergantian dengan menekan <C-k>untuk melakukan penyelesaian dan juntuk pindah ke baris berikutnya. Saya menambahkan tanda centang untuk longestopsi dan jika dinonaktifkan, ia memilih entri acak menggunakan waktu acak sistem. Jika menemukan longestopsi, itu secara manual mencari entri yang paling cocok dari kamus, dan memasukkannya.

Jika Anda tidak menyukai <C-k>pemetaan, silakan mengubahnya sesuai keinginan Anda. Ini harus bekerja dengan pemetaan apa pun yang Anda suka.

Juga, perintah untuk mengembalikan ekspresi pemetaan untuk mengevaluasi menambahkan \<esc>karakter ke akhir sehingga kita meninggalkan mode penyisipan secara otomatis setelah setiap penyisipan, dan sebuah 0cwdi depan untuk masuk ke mode penyisipan untuk memulai dan memastikan kita menimpa seluruh kata benar. Bergantung pada perilaku persis yang Anda inginkan (jika kata-kata Anda tidak bagus di depan setiap baris) Anda dapat menggunakan bcwsebagai gantinya untuk menemukan kata awal yang sebenarnya. Namun, kemudian Anda akan melihat beberapa keanehan ketika kembali ke kata-kata yang memulai garis tersebut. Mungkin ada perintah yang lebih maju untuk mengabaikan akhir baris dan melakukan keduanya sekaligus, tetapi saya tidak dapat menemukannya.

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

Selain itu, tidak akan sulit untuk memperluas logika di sini untuk membuat pemetaan alternatif (menggunakan, misalnya, parameter fungsi) yang melakukan fungsi apa pun yang disediakan oleh mode insert. Saya akan dengan senang hati membantu dengan persyaratan seperti itu dan memperbarui skrip ini karena saya punya waktu.

Tim
sumber
Ini kedengarannya seperti penjelasan yang masuk akal tentang masalah ini, tetapi saya mencoba kedua solusi yang Anda sarankan, dan sepertinya tidak ada yang membantu.
Kaya
Apakah Anda mencoba sleepperintah itu juga?
Tim
Ya, meskipun hanya dengan nilai yang disarankan 5 detik. Apakah Anda berhasil mendapatkan solusi untuk bekerja? Bisakah Anda memposting daftar langkah-langkah lengkap?
Kaya
Saya bukan orang yang menulis pertanyaan. Namun, saya dapat mereproduksi masalah: Anda harus menambahkan terpanjang untuk completeoptseperti yang dijelaskan di komentar (sekali lagi, bukan oleh saya). sunting : Ups, 'longest'diperlukan untuk ctrl-plangkah: tidak ctrl-y. Masih langkah-langkah yang dijelaskan oleh penanya bekerja untuk saya vim -Nu NONEdengan completeoptdiedit.
Kaya
Saya pikir saya telah menemukan solusi, beri saya beberapa menit untuk memperbarui jawaban saya dengannya.
Tim