5

我经常:sh在 vim 中编辑文件时使用,这样我就可以在返回编辑文件之前执行 git 提交等小任务。但是,有时我会混淆我的 shell 是由终端仿真器启动还是作为 vim 子 shell 启动,因此exit在提示符下键入总是冒着意外关闭终端仿真器的风险,而不是回到我的 vim 编辑会话。当我从 vim 启动 shell 时,有没有办法让 vim 修改我的提示符,也许是通过$PS1环境变量,以便我知道我是否在由 vim 启动的子 shell 中?

4

4 回答 4

9

当你这样做时:sh,你可以使用一些额外的 Vim 特定的 shell 变量。在这台机器上,我有:

$MYVIMRC
$VIM
$VIMRUNTIME

$VIM例如,您可以在文件中使用,*rc如下所示:

if [ $VIM ]
then
  # set your vim-specific PS1 here
else
  # set your normal PS1 here
fi

奖励:在 GVim/MacVim 中,您获得的伪终端:sh无法显示颜色。因为 Vim 将其导出为dumb,所以您可以使用与上述相同的逻辑在 GVim/MacVim 中使用单色提示,并在您的 shell 中使用颜色提示:

if [ $TERM == 'dumb' ]
then
  # no colors
else
  # colors
fi
于 2013-10-01T19:41:18.683 回答
3

您需要创建一个 rc 文件来设置不同的 $PS1 并像这样在 vim 中获取它

set shell=/bin/bash\ --rcfile\ ~/.bashforvimrc

在这里查看http://nothingtobedoneforall.wordpress.com/2007/02/25/setting-shell-prompt-for-vim/

Neatu Qvidiu Gabriel 的评论更新,

最好在分配给 PS1 之前执行 source ~/.bashrc。因为否则您会丢失 bashrc 中的所有预定义配置

于 2013-10-01T15:55:11.787 回答
0

我使用这两个函数,一个用于 git(始终打开),一个用于 vim(在由 :sh 生成的 shell 中可见):

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
is_vim_sh() {
    if [ "x$VIM" != "x" ]; then
        echo " [vim]"
    fi
}
export PS1="\u@\h\[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\$(is_vim_sh)$ "
于 2017-02-23T09:54:04.727 回答
0

说到 GVim/MacVim,:h guioptions 现在支持以下标志:

  '!'   External commands are executed in a terminal window.  Without
        this flag the MS-Windows GUI will open a console window to
        execute the command.  The Unix GUI will simulate a dumb
        terminal to list the command output.
        The terminal window will be positioned at the bottom, and grow
        upwards as needed.

设置:set go+=!:sh在 GVim/MacVim 中运行,然后感到惊讶 :)。

于 2019-03-06T08:11:59.743 回答