Есть три основных шага в выполнении того, что вы просите:
- получение альтернативного имени файла
- открывая этот файл в текущем окне или в другом окне по желанию
- восстановление позиции курсора в этом файле
Чтобы найти альтернативное имя файла, вы хотите разбить текущее имя файла на «корень» и «расширение». Простой способ сделать это:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Если вы знаете, что переключаетесь только между файлами .h
и .cpp
файлами, вы можете легко изменить расширение с одного на другое:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Или создайте словарь, сопоставляющий известные расширения с потенциально допустимыми альтернативными расширениями. Или используйте, globpath()
чтобы получить все возможные альтернативы для текущего файла:
let alternates = globpath(expand("%:h"), root . ".*")
и выберите первый или что-то еще. Я предпочитаю globpath
подход, с некоторыми дополнительными умами, которые я опишу позже. Как только вы выбрали целевое расширение, сформируйте полный целевой путь:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Теперь вы можете открыть альтернативный файл в текущем окне:
execute "edit " . target
Или используйте, winnr()
чтобы получить номер «другого окна» ( winnr("#")
это окно, к <C-W>p
которому нужно перейти, или вы можете жестко закодировать его, если вы знаете, что оно всегда будет одинаковым для ваших настроек) и сделать что-то вроде:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Это дает вам действительно простое решение для открытия альтернативных файлов. Есть несколько недостатков с вышеупомянутым подходом, так как я написал это, чтобы быть простым, и это немного не в манере. Я написал плагин, который выполняет альтернативное переключение файлов "так, как я хотел" (циклически просматривая все доступные globpath()
результаты). Он решает некоторые проблемы с простотой вышеперечисленного, вы можете проверить его реализацию, если вы заинтересованы в изучении большего.
Наконец, точка «восстановить позицию курсора». Я сохранил его напоследок, так как он ортогонален альтернативному переключению (мой плагин, к примеру, не обрабатывает его), но вы можете использовать его в своей функции, если вы собираетесь выполнить свою собственную. :help line()
имеет автокоманду, которая полезна для восстановления позиции курсора туда, где она была, когда файл последний раз открывался:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Я просто включил это, или что-то очень похожее, в мое, .vimrc
так как я все время предпочитаю поведение. Вы можете легко разместить код в другом месте.
:h line()
(универсальное решение): «Эта автокоманда переходит на последнюю известную позицию в файле сразу после его открытия, если установлена метка« »: au BufReadPost * if line (») \ "")> 1 && line ("'\" ") <= line (" $ ") | exe "normal! g` \" "| endif