我想我的终端当前目录下面我VIM之一。
例:
在终端:
> pwd
=> /Users/rege
> vim
然后,在VIM
:cd /Users/rege/project
<Ctrl-z>(for suspend)
在终端
> pwd
=> /Users/rege/project
我真的使用的MacOS,zsh的,TMUX。
我需要这个,因为当我试着在VIM使用标签,标签是从我的终端目录未VIM一个检查项目。
所以,我需要随时改变终端的当前目录当我改变VIM当前目录。
你在你的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
在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)"
}
。 它应该是更容易口上面的代码打坏。
你可以打开这样的新终端
:!xterm -e bash -c "cd %:p:h;bash" &
其实我在写的.vimrc这
nmap <F3> :!xterm -e bash -c "cd %:p:h;bash" &<CR> | :redraw!
对于bash用户的未来:
VIM:保存pwd
在<cz>
与map
和getpwd()
击: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