这个问题与这个。
因此我在各种操作系统(和 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-utf8
也utf8
已停用。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-option
和set-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
(例如仅限gawk
我mawk
已经测试过的命令)的人。
请注意对此答案的评论,以了解此方法的一些问题。