Ada tiga langkah utama dalam mencapai apa yang Anda tanyakan:
- mendapatkan nama file alternatif
- membuka file itu di jendela saat ini atau di jendela lain seperti yang diinginkan
- mengembalikan posisi kursor dalam file itu
Untuk menemukan nama file alternatif, Anda ingin memecah nama file saat ini menjadi "root" dan "ekstensi." Cara sederhana untuk melakukan ini adalah:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Jika Anda tahu Anda hanya pernah beralih antara .h
dan .cpp
file, Anda dapat mengubah ekstensi dari satu ke yang lain dengan mudah:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Atau, buat kamus yang memetakan ekstensi yang dikenal ke ekstensi alternatif yang berpotensi valid. Atau gunakan globpath()
untuk mendapatkan semua alternatif yang memungkinkan untuk file saat ini:
let alternates = globpath(expand("%:h"), root . ".*")
dan pilih yang pertama, atau apa pun. Saya lebih suka globpath
pendekatannya, dengan beberapa kecerdasan ekstra yang akan saya jelaskan nanti. Setelah Anda memilih ekstensi target, bentuk jalur target lengkap:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Sekarang Anda dapat membuka file alternatif di jendela saat ini:
execute "edit " . target
Atau gunakan winnr()
untuk mendapatkan nomor "jendela lain" ( winnr("#")
adalah jendela yang <C-W>p
akan melompat ke, atau Anda dapat membuat kode-keras jika Anda tahu itu akan selalu sama untuk pengaturan Anda) dan melakukan sesuatu seperti:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Ini memberi Anda solusi yang sangat mendasar untuk membuka file alternatif. Ada beberapa kekurangan dengan pendekatan di atas, karena saya menulisnya dengan terus terang dan itu agak tidak jelas. Saya telah menulis sebuah plugin yang melakukan penggantian file alternatif "seperti yang saya inginkan," (bersepeda melalui semua globpath()
hasil yang tersedia ). Ini mengatasi beberapa masalah dengan kesederhanaan di atas, Anda dapat memeriksa implementasinya jika Anda tertarik untuk mengeksplorasi lebih lanjut.
Akhirnya, titik "kembalikan posisi kursor". Saya menyimpannya untuk yang terakhir karena itu ortogonal ke hal switching alternatif (plugin saya tidak menanganinya misalnya), tetapi Anda bisa memasukkannya ke dalam fungsi Anda jika Anda ingin menggulirkannya sendiri. :help line()
memiliki perintah otomatis yang berguna untuk mengembalikan posisi kursor ke posisi saat file dibuka terakhir:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Saya hanya menempatkan itu, atau sesuatu yang sangat mirip, di saya .vimrc
karena saya lebih suka perilaku sepanjang waktu. Anda dapat dengan mudah menaruh kode di tempat lain.
:h line()
(solusi umum): "Perintah otomatis ini melompat ke posisi terakhir yang diketahui dalam sebuah file tepat setelah membukanya, jika tanda" "diset:: au BufReadPost * if line (" ' \ "")> 1 && baris ("'\" ") <= baris (" $ ") | exe "normal! g` \" "| endif