Bagaimana cara mengubah jendela tempat ctrl + w, ctrl + p akan melompat?

Aug 15 2020

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 autocmdseperti 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 SpecialWindowdari 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

1 filbranden Aug 15 2020 at 22:50

Salah satu opsinya adalah Anda menyimpan jendela sebelumnya sebelum windoperintah. 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 windoperintah. 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 forloop 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 forloop 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 forputaran.

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