2017-03-28 75 views
0

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

更确切地说,我想要做的是为特定文件类型提供自动命令,当包含该文件类型的缓冲区处于活动状态时,它将更改当前工作目录。在与其他缓冲区一起工作时将其改回。

我有这样的事情,在我的vimrc:

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

这里的想法是,我想对Python的文件时,切换到文件所在的目录和别的东西,例如工作时切换到以前的目录文本,vimL等。显然,它没有工作。我也尝试使用BufWinLeave,但它没有改变任何东西。

你能指出这里有什么问题吗?或者也许有一个更简单的解决方案呢?

+0

如果':lcd'只影响* .py文件,那么你为什么会甚至尝试恢复的CWD其他缓冲区?如果该缓冲区的CWD从未改变过,那么你将恢复到什么状态? –

+0

请注意':lcd'是窗口本地的,而不是缓冲区本地的。 – romainl

+0

@ work.bin as romainl said window-local,not buffer- or file-local。在同一个窗口中,我可以有几个不同文件类型的缓冲区。而且我希望cwd对于所有缓冲区都是相同的,除了.py文件,我想将CWD更改为包含.py文件的dir。 – mfedoten

回答

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 
+0

那真的不行。它按预期工作,但不是我想要的。我不想进入主目录,我想转到打开文件(而不是.py)的目录。 ':当我手动尝试时,lcd -'没有问题。但在我的问题自动命令它不,似乎cwd多次更改为相同的目录,因为'ICD - '返回相同的目录(封装python文件)。 – mfedoten

+0

@mfedoten我已经改为使用':lcd!'来为非python窗口使用全局当前工作目录。这可能不是你想要的。您可能希望对某些特定的非python缓冲区使用':lcd'。如果是这种情况,您可能需要一些机制将正确的目录存储在缓冲区变量中,并将其用于::lcd到正确的目录。或者依靠某些命令将':lcd'重新设置到正确的位置(例如fugitive.vim的':Glcd') –

相关问题