VIM 改变路径到它被调用的地方

VIM 改变路径到它被调用的地方

我真的很喜欢我的 vim 将其工作目录更改为我当前正在处理的文件。为此,我在 vimrc 中使用: autocmd BufEnter * if bufname("") !~ "^\[A-Za-z0-9\]*://" | lcd %:p:h | endif

我还喜欢在 vim 中使用gF(*) 在新缓冲区中打开光标下的文件。

然而,这种组合在我所偏好的工作流程中引发了一个问题:

  1. 假设我想在项目中查找所有出现的“foo”,因此我使用 shellcd进入文件夹path/to/project/src并执行:grep -Ern 'foo' * | vim -。为了便于说明,在 vim 中打开的输出为: a/file1.c:42: foo b/file2.c:13: foo
  2. 现在我想检查命中,file1因此我使用gF跳转到它。此操作将工作目录更改为path/to/project/src/a

  3. 当我返回到grep工作目录输出的选项卡时,它停留在,path/to/project/src/a因为%:p:h显然无法解析从标准输入读取的内容的路径。

  4. 问题:我现在无法跳转到file2via,gF因为相对路径现在是错误的。

如果能让 vim 在切换到缓冲区时自动将其工作目录更改为调用它的位置,那就太好了。对于此示例,这意味着当切换到缓冲区时,grep我希望我的工作目录是path/to/project/src

如果您能就如何实现这一目标提出任何想法,我将不胜感激。

(*)全面披露:我使用spf-13 vim但基本问题应该适用于一般的 vim。

答案1

  • 除了你的:autocmd,你也可以直接:set autochdir在 中使用~/.vimrc。Vim 从许多版本开始就内置了此功能。
  • 不要使用grep外部命令,尝试使用内置:grep(或:vimgrep)命令。结果将填充快速修复列表;这样做的好处是路径将自动适应工作目录中的变化。

相关内容