5

ターミナルの現在のディレクトリをVIMのディレクトリの後にしたいと思います。

例:

TERMINALの場合:

> pwd
=> /Users/rege
> vim

次にVIMで

:cd /Users/rege/project
<Ctrl-z>(for suspend)

ターミナルで

> pwd
=> /Users/rege/project

MacOS、zsh、tmuxを使用しています。

これが必要なのは、VIMでタグを使用しようとすると、vimではなくターミナルディレクトリからプロジェクトにタグがチェックインされるためです。

そのため、VIMの現在のディレクトリを変更するときは、常にターミナルの現在のディレクトリを変更する必要があります。

4

4 に答える 4

2

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に移植する方が簡単なはずです。

于 2012-09-03T04:05:46.153 に答える
2

Vimを一時停止した後、シェルでどのようなコマンドを発行しますか?Vimで:!command十分ではありませんか?

を使用set autochdirすると、ファイルからファイルにジャンプするときにVimの現在のディレクトリが続きます。この設定では、simple:!ctags -R .は常にtags現在のファイルのディレクトリにファイルを作成します。

もう1つの便利な設定はset tags=./tags,tags;$HOME、Vimにtags現在のファイルのディレクトリでファイルを検索し、次に「現在のディレクトリ」でファイルがに到達するまで検索するように指示すること~/です。ニーズに合わせてエンドポイントを変更できます。これによりtags、プロジェクトに属するファイルを編集しながら、プロジェクトのルートでを使用できます。

つまり、基本的には、Vimをまったく離れることなく長い道のりを進むことができます。

コマンドを発行するために本当にシェルに戻る必要がある:shell場合は、 (または:sh)Vimの現在のディレクトリで新しいシェルを起動します。終わったら、$ exitVimに戻るだけです。

$ pwd
/home/romainl
$ vim
:cd Projects
:sh
$ pwd
/home/romainl/Projects
$ exit
于 2012-09-03T13:50:41.557 に答える
0

このような新しいターミナルを開くことができます

:!xterm -e bash -c "cd %:p:h;bash" &

実際、これを.vimrcに書き込みます

nmap <F3> :!xterm -e bash -c "cd %:p:h;bash" &<CR> | :redraw!
于 2012-09-02T22:52:35.093 に答える
0

来たるbashユーザーの場合:

Vim :(とで)で 保存pwdします。Bash:プロンプトコマンドの前に、vimで示されるディレクトリに移動します。<c-z>mapgetpwd()
PROMPT_COMMAND

.bashrc

PROMPT_COMMAND='read -r line 2>/dev/null </tmp/cd_vim'\
'&& > /tmp/cd_vim && cd ${line##\r};'$PROMPT_COMMAND

vimrc

function! s:CtrlZ() call writefile([getcwd(),''], '/tmp/cd_vim', 'b')
    return "\<C-z>"
endfunction
nnoremap <expr> <C-z> <SID>CtrlZ()

これはbash用に編集されたZyXの回答ですhttps://stackoverflow.com/a/12241861/2544873

于 2017-11-22T21:55:11.633 に答える