VIM:仅针对当前缓冲区更改工作目录

4

我如何为特定缓冲区更改当前工作目录,并将其他缓冲区的值更改为先前的值?

更精确地说,我想做的是针对特定文件类型设置自动命令,当包含该文件类型的缓冲区处于活动状态时,更改当前工作目录。并在处理其他缓冲区时将其改回。

我的vimrc文件中有类似以下的设置:

autocmd BufEnter *.py :lcd%:p:h
autocmd BufLeave *.py :lcd-

这里的想法是,我想在处理Python文件时切换到文件所在的目录,在处理其他类型的文件(例如文字、vimL等)时切换回之前的目录。但很明显这没有起作用。我尝试使用 BufWinLeave,但是没有改变任何东西。
你能指出这里有什么问题吗?或者也许有更简单的解决方案?

如果 :lcd 只影响 *.py 文件,那么为什么你还要尝试恢复其他缓冲区的 CWD 呢?如果该缓冲区的 CWD 从未更改,那么你要恢复到什么位置呢? - work.bin
1
请注意,:lcd 是窗口本地的,而不是缓冲区本地的。 - romainl
正如romainl所提到的,@work.bin是窗口本地的,而不是缓冲区或文件本地的。在同一个窗口中,我可以有几个不同文件类型的缓冲区。我希望所有缓冲区的cwd都相同,除了.py文件,我希望将CWD更改为包含.py文件的目录。 - mfedoten
我使用带选项卡的Gvim,所以从来没有遇到过这个问题。对我来说,缓冲区和选项卡几乎是相同的东西。而且,:lcd 明确是针对特定选项卡的本地命令。 - work.bin
1个回答

0

我认为你可以通过以下方式实现类似的功能:

augroup CDRooter
  autocmd!
  autocmd BufWinEnter * if &filetype == 'python' | lcd %:p:h | else | lcd! | endif
augroup END

注意:我不确定:lcd -会很好用。相反,我使用:lcd!来简单地将窗口恢复为使用全局当前工作目录。
基本思路是每当您进入一个窗口时,嗅探文件类型并相应地执行:lcd命令。
更多帮助请参见:
:h 'filetype'
:h BufWinEnter
:h :lcd
:h :augroup
:h :autocmd
:h :if

那不太行。它确实按预期工作,但这不是我想要的。我不想去到主目录,我想进入打开一个(非 .py)文件的目录。当我手动尝试:lcd -时,它运行得很好。但在我的问题的自动命令中,它不起作用,似乎 cwd 多次更改为相同的目录,因为 lcd - 返回相同的目录(包含 Python 文件)。 - mfedoten
@mfedoten 我已经改用 :lcd! 来使用全局当前工作目录,以供非 Python 窗口使用。这可能不是您想要的。您可能需要在某些特定的非 Python 缓冲区中使用 :lcd。如果是这种情况,您可能需要一些机制来将正确的目录存储在缓冲区变量中,并使用它来 :lcd 到正确的目录。或者依赖某个命令重新 :lcd 到正确的位置(例如 fugitive.vim 的 :Glcd)。 - Peter Rincker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接