我真的很喜欢我的 vim 将其工作目录更改为我当前正在处理的文件。为此,我在 vimrc 中使用:
autocmd BufEnter * if bufname("") !~ "^\[A-Za-z0-9\]*://" | lcd %:p:h | endif
我还喜欢在 vim 中使用gF
(*) 在新缓冲区中打开光标下的文件。
然而,这种组合在我所偏好的工作流程中引发了一个问题:
- 假设我想在项目中查找所有出现的“foo”,因此我使用 shell
cd
进入文件夹path/to/project/src
并执行:grep -Ern 'foo' * | vim -
。为了便于说明,在 vim 中打开的输出为:a/file1.c:42: foo b/file2.c:13: foo
现在我想检查命中,
file1
因此我使用gF
跳转到它。此操作将工作目录更改为path/to/project/src/a
当我返回到
grep
工作目录输出的选项卡时,它停留在,path/to/project/src/a
因为%:p:h
显然无法解析从标准输入读取的内容的路径。问题:我现在无法跳转到
file2
via,gF
因为相对路径现在是错误的。
如果能让 vim 在切换到缓冲区时自动将其工作目录更改为调用它的位置,那就太好了。对于此示例,这意味着当切换到缓冲区时,grep
我希望我的工作目录是path/to/project/src
。
如果您能就如何实现这一目标提出任何想法,我将不胜感激。
(*)全面披露:我使用spf-13 vim但基本问题应该适用于一般的 vim。
答案1
- 除了你的
:autocmd
,你也可以直接:set autochdir
在 中使用~/.vimrc
。Vim 从许多版本开始就内置了此功能。 - 不要使用
grep
外部命令,尝试使用内置:grep
(或:vimgrep
)命令。结果将填充快速修复列表;这样做的好处是路径将自动适应工作目录中的变化。