Sorduğunuz şeyi gerçekleştirmenin üç ana adımı vardır:
- alternatif dosyanın adını almak
- o dosyayı geçerli pencerede veya istendiği gibi başka bir pencerede açma
- söz konusu dosyadaki imleç konumunu geri yükleme
Alternatif dosya adını bulmak için, geçerli dosya adını "kök" ve "uzantıya" bölmek istersiniz. Bunu yapmanın basit bir yolu:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Yalnızca dosyalar .h
ve .cpp
dosyalar arasında geçiş yaptığınızı biliyorsanız , uzantıyı birinden diğerine kolayca değiştirebilirsiniz:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Alternatif olarak, bilinen uzantıları potansiyel olarak geçerli alternatif uzantılarla eşleyen bir sözlük oluşturun . Veya geçerli dosya için olası tüm alternatifleri globpath()
almak için kullanın :
let alternates = globpath(expand("%:h"), root . ".*")
ve ilkini seçin, ya da her neyse. globpath
Yaklaşımı tercih ederim, daha sonra anlatacağım bazı ek akıllılar. Hedef uzantıyı seçtikten sonra, tam hedef yolu oluşturun:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Şimdi alternatif dosyayı geçerli pencerede açabilirsiniz:
execute "edit " . target
Veya winnr()
"diğer pencere" numarasını almak için kullanın ( atlayacağınız winnr("#")
penceredir <C-W>p
veya kurulumunuz için her zaman aynı olacağını biliyorsanız sabit kodlayabilirsiniz) ve şöyle bir şey yapın:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Bu, alternatif dosyaları açmak için gerçekten temel bir çözüm sağlar. Yukarıdaki yaklaşımda birkaç eksiklik var, çünkü bunu basit olarak yazdım ve biraz kelepçelendi. Alternatif dosya geçişi "istediğim gibi" yapan bir eklenti yazdım (mevcut tüm globpath()
sonuçlar arasında geçiş). Yukarıdakilerin basitliği ile ilgili bazı problemleri ele alır, daha fazlasını keşfetmek istiyorsanız uygulamasına göz atabilirsiniz.
Son olarak, "imleç konumunu geri yükle" noktası. Alternatif anahtarlama şeyine dik olduğu için son olarak sakladım (eklentim örneğin işlemez), ancak kendi başınıza yuvarlayacaksanız, işlevinize koyabilirsiniz. :help line()
imleç konumunu dosyanın son açıldığı andaki konumuna geri yüklemek için yararlı bir otomatik komut içerir:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
.vimrc
Davranışı her zaman tercih ettiğimden beri bunu ya da çok benzer bir şeyi koydum . Kodu kolayca başka bir yere koyabilirsiniz.
:h line()
(Genel çözüm): "Bu otomatik komut," "işareti ayarlanmışsa, dosyayı açtıktan hemen sonra son bilinen konuma atlar:: au BufReadPost * eğer satır (" ' \ "")> 1 && satırı ("'\" ") <= satır (" $ ") | exe "normal! g` \" "| endif