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内で、または1つのコマンド(を使用)の間のみ、ターミナル内のディレクトリを永続的に切り替えることができなくなりますcd other-dir && some command
。
注2:これをbashで表現する方法がわかりません。簡単な方法は、シェルのすべての子のPIDを取得し(を使用ps --ppid $$ -o CMD
)、ps
プロセスをフィルターで除外し(子としても表示されます)、他の子が1つしかないことを確認し、最後の行のようにそのPIDを使用することです。その上。しかし、zshの$jobstates
連想配列で行ったように、いくつかのシェルビルトインを使用するより良い方法があると確信しています。precmd
また、bashの類似物が何であるかを覚えていません。
もう1つのアイデアは、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 $@
}
function precmd()
{
local CWDFILE=~/.workdirs/$$
test -e $CWDFILE && cd "$(cat $CWDFILE)"
}
。上記のコードをbashに移植する方が簡単なはずです。