2012-09-02 34 views
4

我想我的终端当前目录跟随我的VIM之一。如何在VIm和终端中始终拥有相同的当前目录?

实施例:

在TERMINAL:

> pwd 
=> /Users/rege 
> vim 

然后在VIM

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

在终端

> pwd 
=> /Users/rege/project 

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

我需要这个,因为当Im试图在VIM中使用标签时,标签从我的终端目录中检入项目而不是vim一个。

所以我需要改变终端当前目录总是当我更改VIM当前目录。

+0

什么':shell'?它在Vim的当前目录中打开一个新的shell。 – romainl

+0

我解释得更清楚。 – tomekfranek

回答

2

在暂停Vim后,在shell中发出什么样的命令? Vim的:!command够了吗?

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

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

所以,基本上,你可以走很长一段路而不离开Vim。

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

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

可以打开这样

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

一个新的终端其实我写这在我的.vimrc

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

对不起,但这不是我想要实现的。 – tomekfranek

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或一个命令的持续时间内使用(使用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应该会更容易。

+0

'/ proc'在Mac OS X上不可用。您的第二个想法看起来不错。 – romainl

+0

看起来不错,但我想把这个不在上,但是当我在VIM中运行''''cd method''' – tomekfranek

+0

@regedarek为什么?它不会改变目录,直到你在任何情况下挂起vim为止(在前台进程运行时shell不做任何事情),在':cd'上运行只会产生一堆无用的写入。 – ZyX

0

对bash用户的未来:

的Vim:保存pwd<c-z>(与mapgetpwd())。
Bash:在提示命令之前,在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

相关问题