git 分支在 VIM window 中显示我的分支名称,而不是在我当前的 iterm2 window 中

git branch displays my branch names in a VIM window, instead of in my current iterm2 window

不确定为什么会这样。

我用的是iterm2,还有.zshrc bash

当我运行git branch

它“在新 window 中显示我的分支”有没有办法解决这个问题?

我的配置:

alias projects="cd ~/Projects"


# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
export PATH=~/.node/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH="/Users/lgaban/.oh-my-zsh"

# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="robbyrussell"

# Set list of themes to pick from when loading at random
# Setting this variable when ZSH_THEME=random will cause zsh to load
# a theme from this variable instead of looking in $ZSH/themes/
# If set to an empty array, this variable will have no effect.
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"

# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"

# Uncomment the following line to disable bi-weekly auto-update checks.
# DISABLE_AUTO_UPDATE="true"

# Uncomment the following line to automatically update without prompting.
# DISABLE_UPDATE_PROMPT="true"

# Uncomment the following line to change how often to auto-update (in days).
# export UPDATE_ZSH_DAYS=13

# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS="true"

# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS="true"

# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE="true"

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"

# Uncomment the following line to display red dots whilst waiting for completion.
# Caution: this setting can cause issues with multiline prompts (zsh 5.7.1 and newer seem to work)
# See https://github.com/ohmyzsh/ohmyzsh/issues/5765
# COMPLETION_WAITING_DOTS="true"

# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"

# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# or set a custom format using the strftime function format specifications,
# see 'man strftime' for details.
# HIST_STAMPS="mm/dd/yyyy"

# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder

# Which plugins would you like to load?
# Standard plugins can be found in $ZSH/plugins/
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git)

source $ZSH/oh-my-zsh.sh

# User configuration

# export MANPATH="/usr/local/man:$MANPATH"

# You may need to manually set your language environment
# export LANG=en_US.UTF-8

# Preferred editor for local and remote sessions
# if [[ -n $SSH_CONNECTION ]]; then
#   export EDITOR='vim'
# else
#   export EDITOR='mvim'
# fi

# Compilation flags
# export ARCHFLAGS="-arch x86_64"

# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

我可以得到与 LESS= git branch 非常相似的结果。说 git help config 并查看 /pager 结果,还有控制寻呼机行为的各种(git 特定和非)环境变量,环境 git 和寻呼机它调用 运行 使寻呼机即使在短结果时也能提供完整的行为。

告诉 Git 仅当您 没有 默认值时始终使用它通常提供的选项的最简单选项是

git config core.pager 'less -FRX'

如果您愿意,您可以更精细地控制它,请参阅文档。

这实际上不是 new window,也不是 vim:它是 less,这是默认值寻呼机在很多系统上,包括你的系统。 git branch 命令现在默认使用寻呼机(从 Git 2.16 开始);具体参见 to .

这里还有一个更糟糕的交互,值得注意的是,它会影响那些使用 zsh 但不会影响那些使用 bash 的人,至少对于许多包含在这些贝壳。解释发生了什么需要一些背景知识,尽管标准修复很容易列出:

 export LESS=FRX

在你的 .zshrc 中(注意:有些人更喜欢 FRSX)。

背景

"glass ttys" (Wikipedia) 的旧时代,只有 屏幕 。如果您清除了 The Screen,它就很清楚了。如果你给它写了文字,它就有那个文字。这些东西只是模拟打印机,不使用纸张。但他们获得了新功能,例如突出显示或加粗或加下划线的文本、奇特的光标寻址系统等。

一些终端需要特殊的“启用光标移动”设置操作才能进行精美的屏幕绘制。 (还不是很清楚为什么:他们认为有人会错误地启动光标寻址模式吗?但他们确实这样做了。)因此 使用 这个东西的早期软件有一个特点:它会发送一个“初始化”序列。

一小部分终端增加了备用屏幕VT100 和后续使用转义序列,ESC [ ? 4 7 h,进入Alternate Screen模式,同理但以小写L结尾(l) 而不是 h,以退出它。备用屏幕的字面意思是:切换到它会给你一个不同的屏幕,然后切换回来让你的旧屏幕内容恢复原状。

随着 windowing 系统变得司空见惯,terminal emulators running on pseudo-terminals 取代了旧的“玻璃 ttys”。您可以打开很多新的 windows 并拥有很多单独的迷你屏幕。每一个都可以模拟一些最喜欢的现有物理终端,例如 VT100 或 VT220。这些特殊的转义序列甚至被标准化(ANSI X3.64,ISO/IEC 6429),具有各种扩展。

这些变成了 xterm,用圣经的术语来说,它们产生了(至少间接地)了 iTerm 和 iTerm2 等。唉,有人 认为这是在 xterm 的 初始化 中进入光标定位屏幕编辑器模式的好主意,这应该包括“切换到备用屏幕”序列。退出此模式会切换回来。结果是您的编辑器会话不会打扰任何正在进行的命令会话——我猜有些人觉得这很好——但是这个决定的 附加结果 是当 less 发送同样的初始化序列,这个 翻转到备用屏幕。现在转义序列有时略有不同,1 但这是相同的潜在问题。

就我而言,这整个事情首先是一个可怕的想法(另见 this superuser.com question and this web site)。如果您可以像在 xterm 中那样完全关闭备用屏幕,那就是最终的解决方法。唉,现在你经常做不到。我使用的另一种方法是修改 termcap 或 terminfo 以删除 alt-screen 转义序列。这在许多系统上有点棘手。


1我不知道为什么。如果有人知道,那可能会成为有趣的传说。


这将我们带到 less 和 Git

less程序有自己的治疗交替屏幕蓝调的方法:-X命令行选项告诉less不发出初始化序列。这是一把相当大的锤子,但效果很好。

Git 有一个内置的默认寻呼机,由构建您的 Git 发行版的人设置。通常的默认值是 less.

为了less本身方便使用,less在启动时读取environment variableLESS。默认情况下应用此处设置的任何选项,除非您在命令行上覆盖它们。因此,您可以设置 FRS、and/or X——所有这些都是通常需要的选项——在 $LESSless 将使用这些设置。

Git会,如果LESS在环境中没有设置,自动设置为FRX。同样,this is actually a compiled-in default, but the "default default" is LESS=FRX LV=-c. (LV is for the lv command。)

奇怪的是,一些标准的 zshrc,分发 with zsh,显然做了一个 export LESS=R。这意味着 LESS 现在 在环境中设置的,并且 Git 小心地 打扰它: Git 假定您 的意思是 以这种方式设置它。当您切换到 bash 并且您的 bashrc 会 而不是 设置 LESS,Git 会为您设置它;当你切换到 zsh 并且你的 zshrc does set LESS, Git 不会覆盖它。

然后,解决方法是设置(并导出)您想要的 LESS 设置,假设您将继续使用 less。请注意,您可以使用 GIT_PAGERcore.pager 在 Git 中配置寻呼机;参见 the top level git command documentation。您也可以在那里设置选项;这些将覆盖 LESS 设置。例如,您可以将 core.pager 设置为 less -FRSX 以仅在 Git 中获得这四个选项,同时将 $LESS 设置为 R,以便当您 运行 less 自己时,只有一个选项。

这里是四个选项的意思:

  • F--quit-if-one-screen的缩写,这使得less立即退出,而不显示(END)或类似的。这对于短 git branch 输出非常有用。

  • R--RAW_CONTROL_CHARS 的缩写,这使得 less 识别 ANSI 颜色转义序列,以便 git branch 可以显示 current 例如,绿色分支,或显示彩色 git diff 输出。

  • S--chop-long-lines的缩写,这使得less t运行cate 长行,需要“横向滚动”。 S 确实代表 Side Scroll,至少在我自己看来是这样。默认情况下,没有 -S 是换行长行,因此不需要横向滚动。1

  • X--no-init 的缩写,这会抑制初始化(和最终的取消初始化)序列,这在 iTerm2 中是使您的 git branch退出寻呼机时输出消失。

请注意,如果您愿意,您可以完全禁用 Git 的寻呼机,并使用终端的回滚功能。


1几乎喜欢我自己的S设置,除了一个缺陷:没有迹象表明排长队得到 t运行cated 并且需要滚动。所以有人可以,例如,通过将秘密消息放在每行的右侧来隐藏它。在实践中,这意味着某些 git diff 输出有时会被切断,无论这种情况多么罕见,它 只是 烦人到足以阻止我设置 -S大多数时候。

这里有一个秘密:您可以在 内部 less 本身 中打开和关闭这些选项!如果你有很长的行,现在打开横向滚动会很好,只需打开它。键入 - S 并按 RETURNENTER 在冒号提示符下关闭和打开设置。