tmux man-page 搜索高亮显示

31

tmux会话中搜索,例如 man ls,搜索字符串不会被高亮显示 - 页面跳转到缓冲区的顶部行,但没有高亮显示搜索字符串。

在没有tmux会话的情况下,在同一shell中执行相同的操作会导致高亮显示的搜索字符串。

我不知道从哪里开始解决这个问题。任何提示都将不胜感激。


最有可能的解释是tmux将TERM环境变量设置为screen。由于某种原因,screen类型的终端在您的系统上不支持高亮显示。我刚刚在我的旧Ubuntu框中使用tmux 1.6和PuTTY进行了尝试,至少这个组合可以正常工作。 - Casper
你可以尝试使用 tmux -2 运行 tmux,看看是否能解决问题。 - Casper
@Casper,我在screen会话中得到了高亮字符串,其中$TERM=screen。运行tmux -2tmux -8似乎没有帮助。 - simont
是的。一定是在tmux中出了问题。我找到了一台机器,可以半复制你的问题。当我在这台机器上运行tmux时,所有的颜色功能都消失了。但对于你来说,在这台机器上运行screen也可以,但tmux不行。 - Casper
3个回答

22

参考 Less Colors For Man Pages 作者 Gen2ly 的方法,下面是我的 man 手册和如何实现:

预览

这是一个Shell,不是网页!在 man 手册中自定义搜索高亮

方法

  1. (可选)我使用Tomorrow 主题用于 Konsole/Yakuake
  2. 编辑你的 ~/.bashrc 或者 ~/.zshrc 等文件并添加:

    # Colored man pages: http://linuxtidbits.wordpress.com/2009/03/23/less-colors-for-man-pages/
    # Less Colors for Man Pages
    export LESS_TERMCAP_mb=$'\E[01;31m'       # begin blinking
    export LESS_TERMCAP_md=$'\E[01;38;5;74m'  # begin bold
    export LESS_TERMCAP_me=$'\E[0m'           # end mode
    export LESS_TERMCAP_se=$'\E[0m'           # end standout-mode
    export LESS_TERMCAP_so=$'\E[38;5;016m\E[48;5;220m'    # begin standout-mode - info box
    export LESS_TERMCAP_ue=$'\E[0m'           # end underline
    export LESS_TERMCAP_us=$'\E[04;38;5;146m' # begin underline
    
    重新加载您的配置并尝试进行手册页搜索:
  3. . ~/.bashrc && man ls
    

$'\E[01;31m' 是什么意思?我正在尝试在 csh/tcsh shell 中设置此环境变量。 - Kaushal Modi
我能够使用lesstcsh上使用这个解决方案获取man中的颜色,而不是使用转义代码,而是使用tput。 对于tcsh,请用<backtick>foo<backtick>替换$(foo) - Kaushal Modi
我仍然想学习如何将 export LESS_TERMCAP_mb=$'\E[01;31m' 转换为 tcsh 中的 setenv 命令.. 其中的 $ 字符令人困惑。 - Kaushal Modi
谷歌无法找到一种等效的方式来表示tcsh中的ANSI字符串。我很高兴tput方法存在 :) - Kaushal Modi
谢谢,这正是我一直在寻找的东西,我搜索了很多次。已添加到我的~/.zshrc.local文件,并包含了对这篇文章的引用。https://github.com/flakrat/dotfiles/blob/master/zsh/.zshrc.local - FlakRat
显示剩余4条评论

19

问题已解决。问题与screen $TERM处理斜体字的方式有关,来自tmux FAQ:

vim显示反色而不是斜体字,而less显示斜体字(或普通文本)而不是反色。怎么了?

这正好符合我的问题。通过默认使用lessman使用less来显示手册页面的内容。在我的情况下,less没有突出显示文本,只显示普通文本。

发生这种情况的原因是:

Screen的terminfo描述缺乏斜体模式,它的替代品是突出模式,但使用urxvt用于斜体的相同转义序列。这意味着寻找斜体字的应用程序(如vim)将找不到它,并且可能会将其替换为反向,而请求突出的应用程序(如less)最终将获得斜体字而不是反向。

解决方案是为tmux创建一个新的terminfo文件,让它知道支持斜体字。解决方案在目前写作时(非常非常底部)概述在tmux FAQ中。

创建新的terminfo文件后,在tmux中执行以下命令:C-b :source-file /absolute/path/to/.tmux.conf(参考这个问题)。这个命令应该会使tmux重新加载.tmux.conf文件。然而,对我而言这并没有生效,只有在重启tmux服务器(关闭所有tmux会话,然后重新打开)后,更改才会应用。

2
关于将设置应用于正在运行的tmux实例:它重新加载并应用配置,但问题在于已经在该tmux实例的窗口和面板中运行的客户端程序从它们启动时读取的TERM环境变量初始化其终端设置,而新启动的客户端将在其环境中看到新的终端名称,但是那些已经在运行中的客户端无法获得它并更新其设置——除了重新运行它们(以及它们所启动的 shell(如果有的话))。 - kostix
1
在Debian 8 Jessie上,原始的FAQ建议不起作用。症状:终端'tmux-256color':use=xterm+256setaf的分辨率失败。在这种情况下,@Christy的解决方案解决了问题。 - sphakka

14
这个帖子已经有几年了,但仍然是最好的搜索结果,所以我会回答最终对我有用的内容。这是基于tmux FAQ的。

...但说明并不完全清楚何时或在何处替换-256color字符串。我使用gnome-terminal(v 3.16.2)与tmux,这对我有用:

$ mkdir $HOME/.terminfo/
$ screen_terminfo="screen-256color"
$ infocmp "$screen_terminfo" | sed \
  -e 's/^screen[^|]*|[^,]*,/screen-256color|screen with italics support,/' \
  -e 's/%?%p1%t;3%/%?%p1%t;7%/' \
  -e 's/smso=[^,]*,/smso=\\E[7m,/' \
  -e 's/rmso=[^,]*,/rmso=\\E[27m,/' \
  -e '$s/$/ sitm=\\E[3m, ritm=\\E[23m,/' > /tmp/screen.terminfo
$ tic /tmp/screen.terminfo

并告诉tmux在~/.tmux.conf中使用它:

set -g default-terminal "screen-256color"

注意:我曾经尝试过不加上“-256color”,但由于仍然看到斜体而非高亮显示,所以在使用infocmp之前,我必须删除.terminfo目录下的所有内容(另一个名为's'的目录)。

1
当我使用less查看日志时,我仍然看到斜体而不是突出显示/高亮,后来我意识到这是因为我正在使用sudo(因为它们在/var/log下)。要解决问题:~> sudo rsync -rP ~/.terminfo /root/. 发送增量文件列表 .terminfo/ .terminfo/s/ .terminfo/s/screen-256color 1,560 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/3) ~> sudo cp ~/.tmux.conf /root/. - Christy
2
对我来说没问题。我创建了这个一行代码,这样我就可以快速地将它添加到新服务器上了。 - Stuart Carnie

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