在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
关联数组一样。我也不记得在bash中precmd
的模拟是什么。
另一个想法是让VIM保存其当前目录到某些文件,当你做<C-z>
,使壳牌在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 [email protected]
}
function precmd()
{
local CWDFILE=~/.workdirs/$$
test -e $CWDFILE && cd "$(cat $CWDFILE)"
}
。将上面的代码移到bash应该会更容易。
来源
2012-09-03 04:05:46
ZyX
什么':shell'?它在Vim的当前目录中打开一个新的shell。 – romainl
我解释得更清楚。 – tomekfranek