Існує три основні кроки у виконанні того, що ви просите:
- отримання альтернативного імені файлу
- відкривши цей файл у поточному вікні або в іншому вікні за бажанням
- відновлення позиції курсора у цьому файлі
Щоб знайти альтернативне ім'я файлу, вам потрібно розбити поточне ім'я файлу на "корінь" та "розширення". Простий спосіб зробити це:
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 && рядок ("'\" ") <= рядок (" $ ") | exe "нормально! g` \" "| endif