Bagaimana cara mengubah jendela tempat ctrl + w, ctrl + p akan melompat?
Yang saya cari adalah cara terprogram untuk mengubah jendela mana Ctrl+ w, Ctrl+ pakan melompat ke.
Alasan mengapa saya ingin melakukan ini adalah karena saya memiliki yang autocmd
seperti berikut ini
autocmd BufEnter SpecialWindow call MyFunction()
dimana
function! MyFunction()
let current_win_id = win_getid()
windo ...
call win_gotoid(current_win_id)
endfunction
oleh karena itu, segera setelah saya melompat ke SpecialWindow
dari AnotherWindow
, arti dari Ctrl+ w, Ctrl+ padalah sedemikian rupa sehingga tidak melompat ke AnotherWindow
( perilaku yang diinginkan ), tetapi melompat ke jendela kanan bawah, yang terakhir dikunjungi oleh windo
.
Jika Anda tertarik dengan mengapa saya menanyakan pertanyaan ini, silakan lihat ini .
Jawaban
Salah satu opsinya adalah Anda menyimpan jendela sebelumnya sebelum windo
perintah. Kemudian, nanti, lompat ke jendela itu sebelum melompat ke jendela target Anda.
fungsi! Fungsi Saya () biarkan before_win_id = win_getid (winnr ('#')) biarkan current_win_id = win_getid () windo ... panggil win_gotoid (before_win_id) panggil win_gotoid (current_win_id) fungsi akhir
Solusi yang lebih baik, bagaimanapun, adalah dengan menggunakan win_execute()fungsi daripada windo
perintah. The win_execute()
fungsi mencegah efek samping dari memasuki jendela saat mengeksekusi perintah di jendela itu, yang mencakup memperbarui jendela sebelumnya (dan jendela saat juga.)
Anda perlu menggunakan for
loop eksplisit untuk menjalankan perintah di setiap jendela. Anda dapat menggunakan gettabinfo()untuk menemukan id jendela jendela di tab saat ini.
fungsi! MyFunction () untuk winid di gettabinfo (tabpagenr ()) [0] ['windows'] panggil win_execute (winid, '...') endfor fungsi akhir
Jika Anda ingin mengulang setiap jendela di setiap tab, Anda dapat menggunakan gettabinfo()
tanpa argumen (untuk mendapatkan info untuk semua tab) dan dua for
loop bersarang (satu untuk daftar tab, lalu satu lagi untuk jendela di tab itu. Atau Anda dapat menggunakan getwininfo()
secara langsung, yang mengembalikan informasi untuk semua jendela di semua tab dalam daftar yang diratakan, jadi Anda memerlukan satu for
putaran.
Jika Anda hanya mencoba menyetel variabel atau opsi di jendela lain (mis. Nonaktifkan 'relativenumber'
), Anda dapat menggunakan setwinvar()untuk windows di tab aktif, atau settabwinvar()lebih umum lagi.
Misalnya, untuk menonaktifkan 'relativenumber'
di semua jendela semua tab:
fungsi! MyFunction () untuk tabinfo di gettabinfo () biarkan tabnr = tabinfo ['tabnr'] untuk winid di tabinfo ['windows'] panggil settabwinvar (tabnr, winid, '& relativenumber', 0) endfor endfor fungsi akhir