tmux 与 vim 开启 true-color 支持
受 http://blog.acgtyrant.com/%E5%9C%A8-Linux-%E4%B8%8B%E5%85%A8%E9%9D%A2%E4%BD%BF%E7%94%A8%E7%9C%9F%E5%BD%A9.html这篇文章启发,知道了在终端的世界里有高于256色的True-Color的存在1。
对于常年不离开终端的重度Vim用户来讲,这种多色彩的支持的吸引力也是致命的。
概览
想要真正的多色彩支持,需要 模拟终端
+ tmux
+ vim
三重的支持。这里说明下我的编程环境:windows 虚拟机(Ubuntu 18.04) + SecureCrt + Tmux + Vim 8.1。
于是我要做的就是在这几点上分别做True-Color支持。
模拟终端
我在Windows上偏爱使用的模拟终端是 SecureCrt,但,我在查阅 True-Color 支持列表时https://gist.github.com/XVilka/8346728#now-supporting-truecolour却发现 SecureCrt 不在支持之列。在试了几个Windows支持的虚拟终端之后,最终选定了 MobaXTerm
。
至于原因,无外乎其与 SecureCrt 相似的操作逻辑,以及提供 Personal Edition。
至于配色偏好,我依然选了墨绿色背景的 solarized 主题。
tmux
这里采用网上常规的方法没有行得通,经多方搜寻,找到了 http://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00635.html 更改 terminfo 使得 tmux 支持 Tc (True-Color) 的方法。(这里我采用了git上最新的 tmux 源码编译的 tmux)
常规方法,更改 $HOME/.tmux.conf
文件:
# !!!importent!!! 开启24 bit color 其他方式都无效
set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",*256col*:Tc"
更改 Terminfo 方法(实测有效):
/usr/bin/infocmp > /tmp/.infocmp
echo " Tc," >> /tmp/.infocmp
/usr/bin/tic -x /tmp/.infocmp
校验 True-Color 的方法:
awk 'BEGIN{
s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
for (colnum = 0; colnum<77; colnum++) {
r = 255-(colnum*255/76);
g = (colnum*510/76);
b = (colnum*255/76);
if (g>255) g = 510-g;
printf "\033[48;2;%d;%d;%dm", r,g,b;
printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
printf "%s\033[0m", substr(s,colnum+1,1);
}
printf "\n";
}'
效果图:
vim
这里要改的点主要有三个:
- 按照文档中方法的更改
.vimrc
文件
if has("termguicolors")
" fix bug for vim
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
" enable true color
set termguicolors
endif
- 安装适合自己的支持真彩色的vim 主题,我这里选用的是相同配色的
solarized8
主题
Plugin 'lifepillar/vim-solarized8'
" 这里增强了对比度
set background=dark
colorscheme solarized8_high
let g:solarized_extra_hi_groups=1
- 在进入 vim 的 VISUAL 模式后,发现选定的行不能反色显示,而仅是失去了高亮,这很容易看不清选中的具体字符(比如注释也是没有高亮的,这里就很容易找不到选中边界)。
搜寻的结果则是终端的支持问题,无法识别hi Visual gui=reverse
这个反色指令,于是手动调整了被选中文字的配色。
hi Visual gui=reverse guifg=Black guibg=Grey
(依然在 .vimrc 文件中修改,具体位置则是紧接着主题配色后面)
before:
after:
这里同样是选中 358-363 行
补充
在使用过程中,还发现了 vim 8.1 中支持的 termdebug 与 true-color 的一个冲突:在 packadd termdebug
之后做了 set termguicolors
的操作的话,在实际调试代码时,正在执行的行就没办法高亮了。而正确的做法则是将 packadd termdebug
放在 set termguicolors
之后。
意义
由 256 色支持到 16万色支持,字面意义上就是颜色过渡更平滑了。而在 vim 中,就是代码看着更舒服了(不知道这里的代码颜色高亮有没有相应的True-color扩展)