Git分支在VIM窗口中显示,而不是在我的当前iterm2窗口中显示

7

不确定为什么会出现这种情况。

我使用iterm2,并有.zshrc bash文件

当我运行git branch命令时,它会在"新窗口"中显示我的分支,是否有办法修复这个问题?

enter image description here

我的配置:

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"

2
当你说“在一个新窗口中”时,你是指你当前的iterm2显示会被清除,然后显示上面的内容,当你输入q退出less时,旧的显示会回来,不留下git branch输出的痕迹吗? - torek
请注意,这种清除显示效果是由于iterm2的terminfo使用了(在我看来不幸且需要销毁的)交替屏幕选项。将-X添加到您的LESS选项中将防止less调用备用屏幕设置和拆卸。这并不能解决其他仍具有alt-screen效果的程序问题,而且terminfo使其难以纠正;一个好的xterm/iterm/终端仿真器应该有一个“禁用alt屏幕”复选框,但很多都没有。 - torek
1
你可能也想设置 -F-R 选项。是否设置 -S 更多是个人口味。在你的 .zshrc 中导出 LESS=FRXLESS=FRSX 来设置这些选项。 - torek
@torek 就是这样!谢谢!!!你想发布你的答案吗? - Leon Gaban
2个回答

13
这实际上不是一个新窗口,也不是vim:它是less,它是包括您的许多系统中的默认分页器。现在(从Git 2.16开始),git branch命令默认使用分页器;请参见this answerGit branch command behaves like 'less'
此外,这里还有一个值得注意的进一步错误交互,影响那些使用zsh但不是使用bash,至少使用这些shell之一的许多默认设置。虽然解释正在发生什么需要一些背景知识,但标准修复易于列出。
 export LESS=FRX

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

背景

"glass ttys"Wikipedia)的旧时代,只有屏幕。如果你清除了屏幕,它就变成了空白。如果你往屏幕上写入文本,它就会显示这段文本。这些都只是模拟打印机,没有使用纸张。但是他们获得了新的功能,比如高亮、加粗或者下划线文本,复杂的光标寻址系统等等。

一些终端需要在进行复杂的屏幕绘制之前进行特殊的“启用光标移动”设置操作。(不太清楚为什么要这样做:他们认为有人会误操作开始光标寻址模式吗?但他们确实这么做了。)因此,早期的用于使用这些功能的软件有一个特点:它会发送一个“初始化”序列。

一小部分终端增加了一个备用屏幕VT100和后续版本使用了一个转义序列ESC [ ? 4 7 h,进入备用屏幕模式,使用同样的序列但以小写字母L(l)结尾来退出。备用屏幕就是这样:切换到备用屏幕会得到一个不同的屏幕,切换回去会恢复旧屏幕的内容。

随着窗口系统的普及,运行在pseudo-terminals上的终端仿真器代替了旧的“glass ttys”。你可以打开许多新窗口,并拥有许多个独立的迷你屏幕。每个屏幕都可以模拟一些喜欢的现有物理终端,如VT100或VT220。这些特定的转义序列甚至被标准化了(ANSI X3.64,ISO/IEC 6429),并具有各种扩展功能。

这些演化出了xterm,在圣经中,它至少间接地产生了iTerm和iTerm2等其他终端。不幸的是,某些人认为在xterm的初始化中将光标定位到屏幕编辑器模式是个好主意,并且应该包括“切换到备用屏幕”的序列。退出此模式会切换回来。结果是,您的编辑器会话不会干扰任何正在进行的命令会话,这对某些人来说可能很好,但这一决定的附加后果是,当less发送此相同的初始化序列时,它也会翻转到备用屏幕。现在逃逸序列有时略有不同,但根本问题是相同的。
就我而言,这整个想法本身就是一个可怕的想法(参见this superuser.com questionthis web site)。如果您可以完全杀死备用屏幕-正如您可以在xterm中那样-那就是最终的解决方案。不幸的是,现在你经常做不到。我使用的另一种选择是修改termcap或terminfo以删除alt-screen逃逸序列。在许多系统上这有点棘手。

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


这让我们想到了less和Git

less是一个程序,它有自己的解决方案来解决备用屏幕的问题:在命令行中使用-X选项告诉less不要发出初始化序列。这是一个相当大的工具,但它可以很好地工作。

Git有一个内置的默认分页器,由构建Git分发版的人设置。通常的默认值是less

为了方便使用less本身,less在启动时读取环境变量LESS。这里设置的任何选项都将默认应用,除非您在命令行上覆盖它们。因此,您可以在$LESS中设置FRS和/或X,所有这些选项都是常见的可选项,less将使用这些设置。

如果环境中没有设置LESS,Git会自动将其设置为FRX。再次强调,这实际上是一个编译时的默认值,但“默认默认”是LESS=FRX LV=-c。(LVlv命令。)

有趣的是,某些标准的zshrc与zsh一起分发,显然会执行export LESS=R。这意味着LESS现在已经在环境中设置了,并且Git小心地不会干扰它:Git假定您希望以这种方式设置它。当您切换到bash并且您的bashrc没有设置LESS时,Git会为您设置它;当您切换到zsh并且您的zshrc设置了LESS时,Git不会覆盖它。

因此,解决方法是设置(并导出)您想要的LESS设置,假设您将继续使用less。 请注意,您可以在Git中配置您的分页器,使用GIT_PAGERcore.pager;请参见顶级 git 命令文档。 您也可以在那里设置选项;这些将覆盖LESS设置。例如,您可以将core.pager设置为less -FRSX,以在Git中获取这四个选项,同时在运行less时仅保留$LESS设置为,比如只有R,以在自己运行less时获得该选项。

下面是这四个选项的含义:

  • F: 等同于--quit-if-one-screen,这使得less立即退出,而不显示(END)或类似内容。 这在短git branch输出中非常有用。

  • R: 等同于--RAW_CONTROL_CHARS,这使得less能够识别ANSI颜色转义序列,以便git branch可以以绿色显示当前分支,或者显示带颜色的git diff输出。

  • S: 等同于--chop-long-lines,这使得less截断长行,需要“横向滚动”。 S在我的脑海中实际上是指Side Scroll。没有使用-S时,默认情况下会换行,因此不需要横向滚动。1

  • X: 等同于--no-init,这会抑制初始化(和最终的去初始化)序列,在iTerm2中它会使您的git branch输出在退出分页器时消失。

请注意,如果您更喜欢使用终端的滚动回退,则可以完全禁用Git的分页器。


1我个人几乎都喜欢使用S设置,除了一个缺陷:没有指示是否截断了长行并需要滚动。这意味着有些git diff输出有时会被截断,虽然很少见,但足以让我大部分时间都不使用-S

但是这里有一个秘密:你可以在less内部打开和关闭这些选项!如果您需要换行长行并且现在需要侧向滚动,则只需打开它。在冒号提示处键入-S,然后按RETURNENTER以切换设置的开/关状态。


6
我可以使用LESS= git branch获得非常相似的结果。 查看/pager结果,也查看控制分页器行为的各种(特定于Git和非特定于Git的)环境变量,运行git和调用它的分页器的环境会使分页器即使在短结果上也能提供完整的行为。
告诉Git始终使用它通常仅在没有默认选项时提供的选项的最简单选择是。
git config core.pager 'less -FRX'

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


谢谢!对于我的原始问题的评论是export LESS=FRX Torek,或者您可以添加这个,我会接受 :) - Leon Gaban
1
考虑到它不会改变LESS的行为(如果开发人员以某种方式使用),这是一个更好的答案。 - Ankitz007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接