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

hwamh0ep  于 2022-11-11  发布在  其他
关注(0)|答案(7)|浏览(207)

假设我有一个文件夹,里面有很多.h和.cpp文件。我经常需要执行以下操作:
1.打开一个文件prefix_SomeReallyLongFileName.h
1.对它进行一些更改,
1.然后打开prefix_SomeReallyLongFileName.cpp
我可以使用:e <filename>自动完成,但由于前缀是相同的许多文件,这变得不方便。

是否有快速打开与当前文件同名但扩展名不同的文件的方法?

其他人也遇到过这种情况吗?如果有,你更喜欢用什么方式来导航目录中的C++文件?谢谢。

1szpjjfi

1szpjjfi1#

您可以使用:r(root)文件名修饰符,它会删除最后一个扩展名(查看:h filename-modifiers以了解更多信息)

:e %:r.cpp

其中

  • %是当前文件名缩写
  • :r删除扩展名
  • .cpp只是将该字符串追加到末尾。

这会有效地将当前文件的扩展名替换为另一个扩展名,然后使用较新的扩展名打开该文件。
更短的方法(由Peter Rincker提供),

:e %<.cpp

相关文件:h extension-removal

iszxjhcz

iszxjhcz2#

根据Vim wiki,有相当多的suggested ways
我将从这篇文章中概述几个选项:

  • a.vimFSwitch.vim插件
  • 使用ctags
  • :e %<.c:e %<.h%<表示不带扩展名的当前文件
  • 一个快速Mapnnoremap <F4> :e %:p:s,.h$,.X123X,:s,.cpp$,.h,:s,.X123X$,.cpp,<CR>。将此添加到您的~/.vimrc
vwoqyblh

vwoqyblh3#

安装“unimpaged”,然后使用]f[f转到上一个文件和下一个文件。由于源文件和头文件除了后缀外都有相同的名称,所以它们是下一个文件和上一个文件。

flseospp

flseospp4#

这只是使用简单的(?!)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和上面的函数被调用,你将在文件之间切换。

1szpjjfi

1szpjjfi5#

加上我的两分钱;)对上述伟大的回答:
1.安装Exuberant Ctags
1.将以下代码放入.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
8tntrjer

8tntrjer6#

https://github.com/ericcurtin/CurtineIncSw.vim是一个选项。
配置后,将递归搜索当前目录和源文件所在的目录,以查找要切换到的文件。

nhn9ugyo

nhn9ugyo7#

您可以使用:VH从.cc文件切换到.h文件。

相关问题