基于 Tmux 版本的 tmux 配置节

基于 Tmux 版本的 tmux 配置节

这个问题与这个

因此我在各种操作系统(和 Linux 发行版)上使用 1.5 到 2.2 之间的一系列 Tmux 版本。

我的~/.tmux.conf版本已针对早期版本进行了定制,但在 Tmux 2.2 上出现了以下三行警告:

/home/username/.tmux.conf:34: unknown option: mode-mouse
/home/username/.tmux.conf:70: unknown option: status-utf8
/home/username/.tmux.conf:71: unknown option: utf8

粗略浏览一下该man页面,你会发现这些配置选项已经停用。然而,Tmux 并没有默默忽略它们,而是抱怨这些“未知”选项。

与上述警告对应的行是:

set-window-option -g mode-mouse off
set-option -g status-utf8 on
set-window-option -g utf8 on

该选项mode-mouse在 Tmux 2.1 中已停用,在 Tmux 2.2 中status-utf8utf8已停用。CHANGES源树中的文件详细说明了已删除的选项以及简短说明。

有什么方法可以抑制此输出?更好的是,是否有可能根据 Tmux 版本有条件地执行配置文件节,而无需单独的配置文件片段(必须是source-d)?

.tmux.conf简而言之:在多个 Tmux 版本中使用完全相同功能的直接方法是什么?


原因:这个问题困扰着我,因为 Tmux 会显示这些警告每次会话开始时。并且它需要我执行一个操作(按下一个键)才能进入 shell。但是,在较旧的 Tmux 版本上我没有遇到问题,但我想在这些较旧的 Tmux 版本上设置相应的选项。


摘自旧man页面:

status-utf8 [on | off]

指示 tmux 将 status-left 和 status-right 字符串中最高位设置的字符视为 UTF-8;值得注意的是,这对于宽字符很重要。此选项默认为关闭。

和:

utf8 [on | off]

指示 tmux 期望 UTF-8 序列出现在此窗口中。

答案1

基于@ericx 的回答@thiagowfx 的回答我整理了以下内容,涵盖了列出的不兼容性从 2.0 版开始:

# Version-specific commands [grumble, grumble]
# See: https://github.com/tmux/tmux/blob/master/CHANGES
run-shell "tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-)"

if-shell -b '[ "$(echo "$TMUX_VERSION < 2.1" | bc)" = 1 ]' " \
    set -g mouse-select-pane on; set -g mode-mouse on; \
    set -g mouse-resize-pane on; set -g mouse-select-window on; \
    set -g message-fg red; \
    set -g message-bg black; \
    set -g message-attr bright; \
    set -g window-status-bg default; \
    set -g window-status-fg default; \
    set -g window-status-current-attr bold; \
    set -g window-status-current-bg cyan; \
    set -g window-status-current-fg default; \
    set -g window-status-bell-fg red; \
    set -g window-status-bell-bg black; \
    set -g window-status-activity-fg white; \
    set -g window-status-activity-bg black"

# In version 2.1 "mouse" replaced the previous 4 mouse options
if-shell -b '[ "$(echo "$TMUX_VERSION >= 2.1" | bc)" = 1 ]' \
  "set -g mouse on"

# UTF8 is autodetected in 2.2 onwards, but errors if explicitly set
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.2" | bc)" = 1 ]' \
  "set -g utf8 on; set -g status-utf8 on; set -g mouse-utf8 on"

# bind-key syntax changed in 2.4 -- selection / copy / paste
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.4" | bc)" = 1 ]' " \
   bind-key -t vi-copy v   begin-selection; \
   bind-key -t vi-copy V   send -X select-line; \
   bind-key -t vi-copy C-v rectangle-toggle; \
   bind-key -t vi-copy y   copy-pipe 'xclip -selection clipboard -in'"

# Newer versions
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.9" | bc)" = 1 ]' " \
   bind-key -T copy-mode-vi v   send -X begin-selection; \
   bind-key -T copy-mode-vi V   send -X select-line; \
   bind-key -T copy-mode-vi C-v send -X rectangle-toggle; \
   bind-key -T copy-mode-vi y   send -X copy-pipe-and-cancel 'xclip -selection clipboard -in'"

if-shell -b '[ "$(echo "$TMUX_VERSION >= 2.9" | bc)" = 1 ]' \
   "set -g message-style fg=red,bg=black; \
    set -g message-style bright; \
    set -g window-status-style          fg=default,bg=default; \
    set -g window-status-current-style  fg=default,bg=cyan,bold; \
    set -g window-status-bell-style     fg=red,bg=black; \
    set -g window-status-activity-style fg=white,bg=black"

tmux我提出了一个关于不向后兼容的问题这里。总结来说,tmux开发人员将不支持向后兼容,也不会采用突出显示哪些版本包含重大更改的版本编号方案。

答案2

有什么方法可以抑制这种输出吗?

是的。set-optionset-window-option命令带有一个-q(“quiet”)标志,可抑制有关未知选项的错误。 这应该涵盖您:

set-window-option -gq mouse off
set-window-option -gq mode-mouse off
set-option -gq status-utf8 on
set-window-option -gq utf8 on

答案3

在这种情况下,我喜欢上面建议的“安静”答案;但如果您有真正的版本条件配置更改,请考虑与您自己的答案类似的解决方案:

# grab version info about the tmux currently running
run-shell "tmux setenv -g TMUX_VERSION_MAJOR $(tmux -V | cut -d' ' -f2 | cut -d'.' -f1 | sed 's/[^0-9]*//g')"
run-shell "tmux setenv -g TMUX_VERSION_MINOR $(tmux -V | cut -d' ' -f2 | cut -d'.' -f2 | sed 's/[^0-9]*//g')"

然后我进行了各种if-shell检查;因此在这种情况下:

if-shell \
    '[ $TMUX_VERSION_MAJOR -le 1 -o \
         \( $TMUX_VERSION_MAJOR -eq 2 -a $TMUX_VERSION_MINOR -lt 1 \) ]' \
    "set-window-option -g mode-mouse off" \
    "set-window-option -g mouse off"

if-shell \
    '[ $TMUX_VERSION_MAJOR -le 1 -o \
         \( $TMUX_VERSION_MAJOR -eq 2 -a $TMUX_VERSION_MINOR -lt 2 \) ]' \
    "set-option -g status-utf8 on; set-window-option -g utf8 on" \
    ""

我不记得我在哪儿找到这个;但功劳属于别人。

答案4

是我最喜欢的解决方案,它也避免了if-shell旧版 Tmux 可靠性较低的问题。


作为临时的解决方法,我使用了以下配置节:

if-shell "tmux -V|awk '{if($2 < 2.1) {exit 0} else {exit 1}}'" "set-window-option -g mode-mouse off" "set-window-option -g mouse off"
if-shell "tmux -V|awk '{if($2 < 2.2) {exit 0} else {exit 1}}'" "set-option -g status-utf8 on"
if-shell "tmux -V|awk '{if($2 < 2.2) {exit 0} else {exit 1}}'" "set-window-option -g utf8 on"

代替原来的诗节:

set-window-option -g mode-mouse off
set-option -g status-utf8 on
set-window-option -g utf8 on

我不确定这是否适用于awk我所使用的所有操作系统和 Linux 发行版的所有版本,但也许它可以帮助那些只能依赖一组狭窄版本awk(例如仅限gawkmawk已经测试过的命令)的人。

请注意对此答案的评论,以了解此方法的一些问题。

相关内容