Istnieją trzy główne kroki w realizacji tego, o co pytasz:
- uzyskanie nazwy alternatywnego pliku
- otwieranie tego pliku w bieżącym oknie lub w innym oknie według potrzeb
- przywracanie pozycji kursora w tym pliku
Aby znaleźć alternatywną nazwę pliku, należy podzielić bieżącą nazwę pliku na „root” i „rozszerzenie”. Prostym sposobem na to jest:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Jeśli wiesz, że zawsze przełączasz się między plikami .h
i .cpp
, możesz łatwo zmienić rozszerzenie z jednego na drugi:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Alternatywnie, utwórz słownik mapujący znane rozszerzenia na potencjalnie ważne alternatywne rozszerzenia. Lub użyj, globpath()
aby uzyskać wszystkie możliwe alternatywy dla bieżącego pliku:
let alternates = globpath(expand("%:h"), root . ".*")
i wybierz pierwszy, czy cokolwiek innego. Wolę to globpath
podejście, z dodatkowymi sprytami opiszę później. Po wybraniu rozszerzenia docelowego utwórz pełną ścieżkę docelową:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Teraz możesz otworzyć alternatywny plik w bieżącym oknie:
execute "edit " . target
Lub użyj, winnr()
aby uzyskać numer „innego okna” ( winnr("#")
jest to okno, <C-W>p
do którego można by przeskoczyć, lub możesz go na stałe zakodować, jeśli wiesz, że zawsze będzie takie samo dla twojej konfiguracji) i zrobić coś takiego:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Daje to naprawdę podstawowe rozwiązanie do otwierania alternatywnych plików. W powyższym podejściu jest kilka niedociągnięć, ponieważ napisałem, że jest to proste i jest trochę nietypowe. Napisałem wtyczkę , która przełącza pliki na przemian „tak, jak chciałem” (przeglądając wszystkie dostępne globpath()
wyniki). Rozwiązuje niektóre problemy z prostotą powyższego, możesz sprawdzić jego implementację, jeśli chcesz dowiedzieć się więcej.
Na koniec punkt „przywróć pozycję kursora”. Zapisałem go na koniec, ponieważ jest prostopadły do alternatywnego przełączania (moja wtyczka nie obsługuje tego na przykład), ale możesz wprowadzić go do swojej funkcji, jeśli chcesz rzucić własny. :help line()
ma komendę automatyczną, która jest przydatna do przywracania pozycji kursora do miejsca, w którym znajdowała się w momencie ostatniego otwarcia pliku:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Po prostu włożyłem to lub coś bardzo podobnego, .vimrc
ponieważ wolę takie zachowanie przez cały czas. Możesz łatwo po prostu umieścić kod w innym miejscu.
:h line()
(ogólne rozwiązanie): „Ta komenda automatyczna przeskakuje do ostatniej znanej pozycji w pliku zaraz po jej otwarciu, jeśli ustawiony jest znak„ ”: au BufReadPost * if line („ ” \ "")> 1 && line ("'\" ") <= line (" $ ") | exe "normal! g` \" "| endif