5

我想我的终端当前目录跟随我的 VIM 之一。

例子:

在终端:

> 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

挂起 Vim 后,你在 shell 中发出什么样的命令?Vim:!command还不够吗?

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

另一个有用的设置是set tags=./tags,tags;$HOME告诉 Vimtags在当前文件的目录中查找文件,然后在“当前目录”中查找,直到找到您的~/. 您可以修改端点以满足您的需要。这允许您tags在编辑属于项目的任何文件时在项目的根目录使用 a。

所以,基本上,你可以在不离开 Vim 的情况下走很长一段路。

如果你真的需要回到 shell 来发出你的命令,:shell(或:sh)用 Vim 的当前目录启动一个新的 shell。完成后,您只需$ exit返回 Vim:

$ pwd
/home/romainl
$ vim
:cd Projects
:sh
$ pwd
/home/romainl/Projects
$ exit
于 2012-09-03T13:50:41.557 回答
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关联数组所做的那样。我也不记得precmdbash 的类似物是什么。


另一个想法是让 vim 在你这样做时将其当前目录保存到某个文件中,<C-z>并让 shell 在 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 回答
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<c-z>(with mapand getpwd()).
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()

这是为 bash https://stackoverflow.com/a/12241861/2544873编辑的 ZyX 答案

于 2017-11-22T21:55:11.633 回答