В Vim, как быстро переключаться между файлами .h и .cpp с тем же именем?
Предположим, у меня есть папка с большим количеством файлов .h и .cpp. Мне часто приходится делать следующее:
- откройте файл
prefix_SomeReallyLongFileName.h
,
- внести в него некоторые изменения,
- а затем откройте
prefix_SomeReallyLongFileName.cpp
.
Я могу сделать это с помощью :e <filename>
, используя автозаполнение, но поскольку префикс для многих файлов одинаковый, это становится неудобным.
Есть ли быстрый способ открыть файл с тем же именем, что и текущий файл, но другое расширение?
Другие люди тоже сталкиваются с этой ситуацией, и если да, то каков ваш предпочтительный способ навигации по файлам С++ в каталоге? Спасибо.
Ответы
Ответ 1
Вы можете использовать модификатор имени :r
(root), который удаляет последнее расширение (посмотрите :h filename-modifiers
для получения дополнительной информации)
:e %:r.cpp
где
-
%
является сокращением для текущего имени файла.
-
:r
удаляет расширение
-
.cpp
просто добавляет эту строку в конец.
Это эффективно заменяет текущее расширение файла другим, а затем открывает файл с более новым расширением.
Еще более короткий путь (любезно предоставлен Peter Rincker),
:e %<.cpp
Соответствующая документация на :h extension-removal
Ответ 2
В соответствии с Vim wiki существует немало предложенных способов.
Я расскажу несколько вариантов из статьи:
- a.vim или FSwitch.vim плагины
- Использование ctags
-
:e %<.c
или :e %<.h
. %<
представляет текущий файл без расширения
- Быстрое сопоставление
nnoremap <F4> :e %:p:s,.h$,.X123X,:s,.cpp$,.h,:s,.X123X$,.cpp,<CR>
. Добавьте это в свой ~/.vimrc
.
Ответ 3
Установите "unimpaired", а затем используйте ]f
и [f
, чтобы перейти к предыдущему и следующему файлу. Поскольку источник и заголовок имеют одно и то же имя, кроме суффикса, это следующие и предыдущие файлы.
Ответ 4
Это просто использует простой (!) vimscript, поэтому вы можете поместить его в свой vimrc
,
теперь он работает для файлов .c
, но может быть легко изменен для .cpp
(очевидно), он даже имеет некоторую "обработку ошибок" во внутренних операторах if (это, вероятно, бессмысленно), но если кому-то это нужно, эй, это там! Без него он намного короче (просто оставьте :e %<.h
, например), поэтому выберите все, что захотите.
function! HeaderToggle() " bang for overwrite when saving vimrc
let file_path = expand("%")
let file_name = expand("%<")
let extension = split(file_path, '\.')[-1] " '\.' is how you really split on dot
let err_msg = "There is no file "
if extension == "c"
let next_file = join([file_name, ".h"], "")
if filereadable(next_file)
:e %<.h
else
echo join([err_msg, next_file], "")
endif
elseif extension == "h"
let next_file = join([file_name, ".c"], "")
if filereadable(next_file)
:e %<.c
else
echo join([err_msg, next_file], "")
endif
endif
endfunction
затем добавьте еще к вашему vimrc
что-то вдоль этих строк:
let mapleader = "," " <Leader>
nnoremap <Leader>h :call HeaderToggle()<CR>
Теперь, когда вы находитесь в нормальном режиме, вы нажимаете запятую ,
(это наша кнопка <Leader>
), затем h
и функция из вышеперечисленного вызывается, и вы будете переключаться между файлами. Тада!
Ответ 5
https://github.com/ericcurtin/CurtineIncSw.vim является вариантом.
После настройки рекурсивно выполняет поиск в текущем каталоге, а в каталоге, в котором находится исходный файл, находится файл, на который вы хотите переключиться.