在 bash 或 zsh 以及 Unix 上,您可以这样做:进程的当前工作目录表示/proc/{PID}/cwd
为指向真实目录的符号链接。谈到 zsh,下面的代码将完成这项工作:
function precmd()
{
emulate -L zsh
(( $#jobstates == 1 )) || return
local -i PID=${${${(s.:.)${(v)jobstates[1]}}[3]}%\=*}
cd $(readlink /proc/$PID/cwd)
}
. 注意:使用此代码,您将无法再在终端中永久切换目录,只能在 vim 中或在一个命令的持续时间内(使用cd other-dir && some command
)。
注 2:我不知道如何在 bash 中表达这一点。直接的方法是获取 shell 的所有子进程的 PID(使用ps --ppid $$ -o CMD
),过滤掉ps
进程(它也将显示为子进程),检查是否只有一个其他子进程,并像最后一行一样使用它的 PID以上。但我很确定有一种更好的方法可以使用一些 shell 内置函数,就像我对 zsh 的$jobstates
关联数组所做的那样。我也不记得precmd
bash 的类似物是什么。
另一个想法是让 vim 在你这样做时将其当前目录保存到某个文件中,<C-z>
并让 shell 在 precmd 中读取它:
" In .vimrc:
function s:CtrlZ()
call writefile([fnamemodify('.', ':p')], $CWDFILE, 'b')
return "\<C-z>"
endfunction
nnoremap <expr> <C-z> <SID>CtrlZ()
# In .zshrc
function vim()
{
local -x CWDFILE=~/.workdirs/$$
test -d $CWDFILE:h || mkdir $CWDFILE:h
vim $@
}
function precmd()
{
local CWDFILE=~/.workdirs/$$
test -e $CWDFILE && cd "$(cat $CWDFILE)"
}
. 将上面的代码移植到 bash 应该更容易。