Подтвердить что ты не робот

В Vim, как быстро переключаться между файлами .h и .cpp с тем же именем?

Предположим, у меня есть папка с большим количеством файлов .h и .cpp. Мне часто приходится делать следующее:

  • откройте файл prefix_SomeReallyLongFileName.h,
  • внести в него некоторые изменения,
  • а затем откройте prefix_SomeReallyLongFileName.cpp.

Я могу сделать это с помощью :e <filename>, используя автозаполнение, но поскольку префикс для многих файлов одинаковый, это становится неудобным.

Есть ли быстрый способ открыть файл с тем же именем, что и текущий файл, но другое расширение?

Другие люди тоже сталкиваются с этой ситуацией, и если да, то каков ваш предпочтительный способ навигации по файлам С++ в каталоге? Спасибо.

4b9b3361

Ответ 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 является вариантом.

После настройки рекурсивно выполняет поиск в текущем каталоге, а в каталоге, в котором находится исходный файл, находится файл, на который вы хотите переключиться.