在Vim中如何在.h和.cpp文件之间快速切换同名?

时间:2013-06-18 13:59:03

标签: vim

假设我有一个包含大量.h和.cpp文件的文件夹。我经常需要做以下事情:

  1. 打开文件prefix_SomeReallyLongFileName.h
  2. 对其进行一些更改,
  3. 然后打开prefix_SomeReallyLongFileName.cpp
  4. 我可以使用自动完成使用:e <filename>来执行此操作,但由于许多文件的前缀相同,因此变得不方便。

    有没有一种快捷方式可以打开与当前文件同名的文件,但是扩展名不同?

    其他人是否也会遇到这种情况,如果是这样,您在目录中导航C ++文件的首选方式是什么?感谢。

6 个答案:

答案 0 :(得分:47)

您可以使用:r(根)文件名修饰符删除最后一个扩展名(有关详细信息,请查看:h filename-modifiers

:e %:r.cpp

,其中

  • %是当前文件名的简写。
  • :r删除了扩展程序
  • .cpp只是在最后添加该字符串。

这有效地将当前文件的扩展名替换为另一个,然后使用较新的扩展名打开该文件。


更短的方式(由Peter Rincker提供),

:e %<.cpp

:h extension-removal

的相关文档

答案 1 :(得分:23)

根据Vim wiki,有不少suggested ways

我将从文章中概述几个选项:

  • a.vimFSwitch.vim插件
  • 使用ctags
  • :e %<.c:e %<.h%<表示没有扩展名的当前文件
  • 快速映射nnoremap <F4> :e %:p:s,.h$,.X123X,:s,.cpp$,.h,:s,.X123X$,.cpp,<CR>。将其添加到您的~/.vimrc

答案 2 :(得分:8)

安装“未受损”,然后使用]f[f转到上一个和下一个文件。由于源和标题除了后缀之外都有相同的名称,因此它们是下一个和上一个文件。

答案 3 :(得分:4)

这只是使用简单的(?!)vimscript,所以你可以把它放到你的vimrc中, 现在它适用于.c个文件,但可以很容易地修改.cpp(显然),它甚至有一些&#34;错误处理&#34;在内部的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并调用上面的功能,您将会在文件之间切换。多田!

答案 4 :(得分:1)

https://github.com/ericcurtin/CurtineIncSw.vim是一个选项。

配置后,递归搜索当前目录,并递归查找源文件的目录,以查找要切换到的文件。

答案 5 :(得分:1)

将我的两美分;)添加到上述出色的答案中:

  1. 安装旺盛的Ctags
  2. 将以下代码放入您的.vimrc
" Jump to a file whose extension corresponds to the extension of the current
" file. The `tags' file, created with:
" $ ctags --extra=+f -R .
" has to be present in the current directory.
function! JumpToCorrespondingFile()
    let l:extensions = { 'c': 'h', 'h': 'c', 'cpp': 'hpp', 'hpp': 'cpp' }
    let l:fe = expand('%:e')
    if has_key(l:extensions, l:fe)
        execute ':tag ' . expand('%:t:r') . '.' . l:extensions[l:fe]
    else
        call PrintError(">>> Corresponding extension for '" . l:fe . "' is not specified") 
    endif
endfunct

" jump to a file with the corresponding extension (<C-F2> aka <S-F14>)
nnoremap <S-F14> :call JumpToCorrespondingFile()<CR>
inoremap <S-F14> <C-o>:call JumpToCorrespondingFile()<CR>

" Print error message.
function! PrintError(msg) abort
    execute 'normal! \<Esc>'
    echohl ErrorMsg
    echomsg a:msg
    echohl None
endfunction