VIM,将目录设置为从shell返回的目录

时间:2014-10-21 16:00:03

标签: shell vim

我对VIM有点新鲜,并且正在玩打开文件的方法(OS X)。

暂时退出到shell后返回VIM(ctrl + z,然后是fg),我认为如果VIM将当前的工作目录设置为我返回时的任何地方都会很方便。

这可能吗?我知道如何从VIM中手动更改工作目录。

谢谢,

1 个答案:

答案 0 :(得分:2)

检查您的Vim版本是否支持客户端 - 服务器功能::echo has('clientserver')

如果是这样,你可以写一个别名告诉Vim改变它的cwd:

在.bashrc中:

alias fg="$VIM --remote-send ':cd $PWD<CR>'; fg"

$ VIM为vimgvimmacvim

你需要冒号和<CR>,因为你发送Vim键击而不是命令(<CR>是“回车”的特殊符号)

当Vim被挂起时,我不确定--remote-send是否有效 - 如果你使用像screen或tmux这样的东西同时运行vim和你的shell,这种方法可能会更好。

否则,它有点棘手。

有一个:shell命令,类似于挂起和恢复,但我假设它分叉子进程,而不是让你返回到Vim的父进程。如果您对此感到满意,可以附加一个ShellCmdPost autocmd来加载信息。您可以将其与将$ CWD写入文件的别名相关联,以加载所需的目录并更改为该目录。

在.bashrc中:

alias fgv="echo $PWD > ~/.cwd; exit"

在.vimrc中:

autocmd ShellCmdPost * call LoadCWD()
function! LoadCWD()
    let lines = readfile('~/.cwd')
    if len(lines) > 0
        let cwd = lines[0]
        execute 'cd' cwd
    endif
endfunction

查看自动命令列表,当Vim被暂停并刚刚恢复时,我无法找到任何检测到的内容。您可以重新映射ctrl-z以首先设置标志变量然后执行未映射的ctrl-z。然后像以前一样编写一个shell脚本,将其$ CWD写入特定文件。然后,您可以设置autocmd来监视该文件以进行修改,并在处理程序中检查标志变量,如果已设置,则重置它,读取文件并切换到该目录。有点复杂,但它会起作用。

看起来像这样。您必须在启动Vim时加载该文件,以便它可以监视它以进行更改。您可能需要set hidden,以便可以保持缓冲区打开但隐藏它。

在.bashrc中:

alias fg="echo $PWD > ~/.cwd; fg"

在.vimrc中:

set hidden
edit ~/.cwd
enew
nnoremap <C-Z> :let g:load_cwd = 1<CR><C-Z>
autocmd FileChangedShell ~/.cwd call LoadCWD()
function! LoadCWD()
    if g:load_cwd
        let g:load_cwd = 0
        let lines = readfile('~/.cwd')
        if len(lines) > 0
            let cwd = lines[0]
            execute 'cd' cwd
        endif
    endif
endfunction