如何总是在VIM和终端相同的当前目录?(How to always have the same cu

2019-09-22 02:23发布

我想我的终端当前目录下面我VIM之一。

例:

在终端:

> pwd
=> /Users/rege
> vim

然后,在VIM

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

在终端

> pwd
=> /Users/rege/project

我真的使用的MacOS,zsh的,TMUX。

我需要这个,因为当我试着在VIM使用标签,标签是从我的终端目录未VIM一个检查项目。

所以,我需要随时改变终端的当前目录当我改变VIM当前目录。

Answer 1:

你在你的shell发出什么样的指令,你挂起Vim后? 是不是Vim的:!command就够了吗?

随着set autochdir ,Vim的当前目录跟着你,你从文件跳转到文件中。 使用此设置,一个简单的:!ctags -R . 总是会创建一个tags在当前文件的目录文件。

另一个有用的设置被set tags=./tags,tags;$HOME它告诉Vim寻找一个tags在当前文件的目录文件,然后在“当前目录”,并一直上升,直到达到您的~/ 。 你可能会修改,以满足您的需求的端点。 这使您可以使用一个tags在你的项目的根在编辑属于该项目的任何文件。

所以,基本上,你可以走很长的路要走,而完全不离开Vim的。

如果你真的需要返回到shell发出你的命令, :shell (或:sh )launchs与Vim的当前目录中一个新的外壳。 当你完成,你只需要$ exit回到Vim的:

$ pwd
/home/romainl
$ vim
:cd Projects
:sh
$ pwd
/home/romainl/Projects
$ exit


Answer 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)
}

。 注:此代码,你将无法pernamently切换的终端目录了,只在vim或者一个命令的持续时间(使用cd other-dir && some command )。

注2:我不知道如何在bash来表达这一点。 直接的方法是(使用获得的外壳所有儿童的PID ps --ppid $$ -o CMD ),滤出ps处理(它会显示为一个孩子为好),确认只有一条其他孩子在上面的最后一行使用其PID等。 但我敢肯定有使用一些shell内建的像我一样的zsh有一个更好的方法$jobstates关联数组。 我也不记得是什么的模拟precmd在bash。


另一个想法是让VIM保存其当前目录到某些文件,当你做<Cz> ,使壳牌在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)"
}

。 它应该是更容易口上面的代码打坏。



Answer 3:

你可以打开这样的新终端

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

其实我在写的.vimrc这

nmap <F3> :!xterm -e bash -c "cd %:p:h;bash" &<CR> | :redraw!


Answer 4:

对于bash用户的未来:

VIM:保存pwd<cz>mapgetpwd()
击:prompt命令前,通过VIM表示与转到目录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()

这是ZYX答案编辑对于bash https://stackoverflow.com/a/12241861/2544873



文章来源: How to always have the same current directory in VIm and in Terminal?