假设我有一个包含大量.h和.cpp文件的文件夹。我经常需要做以下事情:
prefix_SomeReallyLongFileName.h
,prefix_SomeReallyLongFileName.cpp
。 我可以使用自动完成使用:e <filename>
来执行此操作,但由于许多文件的前缀相同,因此变得不方便。
有没有一种快捷方式可以打开与当前文件同名的文件,但是扩展名不同?
其他人是否也会遇到这种情况,如果是这样,您在目录中导航C ++文件的首选方式是什么?感谢。
答案 0 :(得分:47)
您可以使用:r
(根)文件名修饰符删除最后一个扩展名(有关详细信息,请查看:h filename-modifiers
)
:e %:r.cpp
,其中
%
是当前文件名的简写。:r
删除了扩展程序.cpp
只是在最后添加该字符串。这有效地将当前文件的扩展名替换为另一个,然后使用较新的扩展名打开该文件。
更短的方式(由Peter Rincker提供),
:e %<.cpp
:h extension-removal
答案 1 :(得分:23)
根据Vim wiki,有不少suggested ways。
我将从文章中概述几个选项:
: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)
将我的两美分;)添加到上述出色的答案中:
.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