rxvt-unicode
rxvt-unicode (urxvt) 是一个从 rxvt 分叉而来的 终端模拟器,可以通过源代码 补丁、#X 资源 和 #Perl 扩展 进行自定义。
安装
安装 以下之一
- rxvt-unicode,
- rxvt-unicode-truecolor-wide-glyphsAUR — 改进的字体渲染,增强的 字形 支持,应用了 真彩色 支持,
或在 Arch 用户仓库 中搜索带有不同补丁和配置选项的意见驱动的 构建。
| 文件名 | 描述 |
|---|---|
7-bit-queries.patch
|
|
24-bit-color.patch
|
|
256color.patch
|
|
background-opacity.patch
|
|
clear.patch
|
|
enable-wide-glyphs.patch
|
|
font-width-fix.patch
|
|
improve-font-rendering.patch
|
|
line-spacing-fix.patch
|
|
lines-rewrap.patch
|
|
matcher-vi-bindings.patch
|
|
noinc.diff
|
|
popup-menu-hang.diff
|
|
rxvt-unicode-sixel.patch
|
|
rxvt-unicode-truecolor.patch
|
|
secondaryWheel.patch
|
|
starttop.patch
|
|
| 文件名, 链接 |
软件包 (Package) | 描述 |
|---|---|---|
| keyboard-select | urxvt-perls |
|
| resize-font | urxvt-resize-font-gitAUR |
|
配置
X 资源
Rxvt-unicode 由命令行参数或 X 资源 控制。命令行参数会覆盖资源设置并具有更高的优先级。
资源的第一个组件是 类 — URxvt — 或一个 应用程序(实例)名称。应用程序名称可以通过 urxvt(1) § name 命令行选项指定,默认设置为 urxvt — 一个 basename(1) — 二进制文件。对于给定的实例,使用应用程序名称定义的资源会覆盖使用类名称定义的资源,并具有更高的优先级。
*)用法示例可以在 urxvt(7) § Terminal Configuration 部分找到。有关可用设置、X 资源和值的更多信息,请参阅 urxvt(1) 和 urxvt(7)。此外,urxvt --help 会将所有可用资源打印到 标准错误。每个资源都可以用作长命令行选项。
使用由 xorg-xrdb 包提供的 xrdb(1) — 来应用配置:xrdb ~/.Xresources。
-merge 选项。字体
Rxvt-unicode 不使用 fontconfig 库 进行字体替换,当缺少字体或单个字符时。也就是说,你必须在相应 资源 中提供所有字体名称 — 为你感兴趣的所有 字形 设置 字体集。
- 使用非等宽字体的能力 — 例如 Nerd Font 与 Nerd Font Mono — 很大程度上取决于你的环境(参见 #间距)和字体本身。
- 如果字形无法显示或找不到,它将被替换为空方块。
Rxvt-unicode 支持 X FreeType (Xft) 和 X Logical Font Description (XLFD);urclock(1) 仅 支持 XLFD。
永久
~/.Xresources
URxvt.font: xft:Input Mono:size=13:style=Regular,\
xft:Font Awesome 6 Free:style=Solid
URxvt.boldFont: xft:Input Mono:size=13:style=Medium
URxvt.italicFont: xft:Input Mono:size=13:style=Italic
URxvt.boldItalicFont: xft:Input Mono:size=13:style=Medium Italic
-),则必须用反斜杠(\)将其转义两次。这与 urxvt -fn 选项的使用以及 fc-list 返回的结果不同,后者只有一个反斜杠。非永久性
你可以使用 Xterm 操作系统命令 (OSC) 来更改当前实例的字体。使用 数字 (Ps) 参数 710–713 后面跟着相应的 文本 (Pt) 参数,如下所示(也请参阅 urxvt(1) § CHANGING FONTS)
$ printf '\x1b\x5d710;%s\x1b\x5c' "xft:Terminus:pixelsize=22" $ printf '\e]711;%s\a' "xft:Terminus:pixelsize=22:bold"
要使用键盘快捷键更改当前实例的字体大小,请使用 resize-font Perl 扩展。
间距
你可能需要使用 letterSpace 来调整字符之间的水平距离,和/或使用 urxvt(1) § lineSpace: 来调整行之间的垂直距离。这些需求取决于
- 使用渲染改进补丁,例如 enable-wide-glyphs.patch, improve-font-rendering.patch, font-width-fix.patch 或 line-spacing-fix.patch,
- 使用字形与英文字母差异很大的语言,例如阿拉伯语、中文、希伯来语、日语或韩语,
- 你的字体及其大小。
滚动回退缓冲区
接收新输出时的行为
默认情况下,当 Shell 输出出现时,滚动回退视图会自动跳转到缓冲区底部以显示新输出。
如果你想在 伪 TTY 仍在接收新行时查看之前的输出(例如编译器消息),并在按下按键时跳转到滚动回退缓冲区的底部,请使用以下选项
URxvt.scrollTtyOutput: False URxvt.scrollWithBuffer: True URxvt.scrollTtyKeypress: True
辅助屏幕
当你滚动 辅助屏幕 中的分页器(例如,使用 less(1) 而不使用 -X/--no-init 选项)时,禁用辅助屏幕滚动可能是一个好主意,以便能够滚动分页器 本身,而不是终端的缓冲区。
这在 Konsole 和 基于 VTE 的终端模拟器中是默认的且不可更改的行为。要在 urxvt 中实现相同的行为,请使用以下设置
URxvt.secondaryScroll: False
上述配置工作正常,除了使用鼠标滚轮滚动时。当你在 辅助屏幕 中使用鼠标滚轮滚动分页器时,并且滚动回退缓冲区中有内容 — 鼠标滚轮会滚动 滚动回退缓冲区,而不是分页器 本身。
为了解决这个问题,有必要在 urxvt 中引入 一个新选项。使用像 rxvt-unicode-better-wheel-scrolling-unicode3AUR 或 rxvt-unicode-fontspacing-noinc-vteclear-secondarywheelAUR 这样的包,或应用 secondaryWheel.patch。安装后,设置以下选项
URxvt.secondaryWheel: True
清除
重置为初始状态 (RIS) ESC 06/03 控制函数 会清空屏幕 和 滚动回退缓冲区。你可以像这样将其绑定到所需的按键
URxvt.keysym.Meta-Control-l: command:\033c
屏幕清除时保留屏幕内容
在 urxvt 中,按下 Ctrl-L 会清空屏幕,并且屏幕内容会被丢弃 — 你之后无法在滚动回退缓冲区中看到它。对于使用 Konsole 或 基于 VTE 的终端模拟器的用户来说,这种行为可能令人费解,因为在这些模拟器中,Ctrl-L 会将屏幕内容保留在滚动回退缓冲区中。
要在 urxvt 中实现这种 VTE 风格的行为,你可以使用合适的包,例如 rxvt-unicode-better-wheel-scrolling-unicode3AUR 或 rxvt-unicode-fontspacing-noinc-vteclear-secondarywheelAUR,或者在你喜欢的构建中应用 clear.patch。
滚动条
滚动条的外观和感觉由十几个资源控制。请查看手册中关于 urxvt(1) § scrollstyle: 和 urxvt(1) § scrollColor: 资源,并参阅 urxvt(1) § THE SCROLLBAR 部分。
你还可以使用 DEC 私有模式 urxvt(7) § Escape Sequences(Pm = 30)在运行时更改滚动条的可见性。例如,你可以将滚动条可见性切换绑定到键盘快捷键
URxvt.keysym.Meta-Control-s: command:\033[?30t
保存到文件
Ctrl-Print 或 Shift-Print 使用类似以下的设置将 滚动回退缓冲区 的内容保存到文件中
URxvt.print-pipe: cat > ~/Downloads/URxvt_$(date '+%Y-%m-%d_%H:%M:%S').txt
- Print 通常是 Print Screen 键。
- 单独的 Print 保存屏幕内容,但不包括滚动回退缓冲区。
剪贴板
Rxvt-unicode 的 剪贴板 行为对于没有 xterm 背景的人来说可能显得不寻常。有关详细信息,请参阅 urxvt(1) § THE SELECTION: SELECTING AND PASTING TEXT。
你可以使用 urxvt-eval(1) 和键盘绑定来设置复制和粘贴到 CLIPBOARD
URxvt.keysym.Control-Insert: eval:selection_to_clipboard URxvt.keysym.Shift-Insert: eval:paste_clipboard
urxvt-selection-to-clipboard(1) 可用于同步 CLIPBOARD 和 PRIMARY selection。
urxvt-confirm-paste(1) 扩展会在检测到粘贴内容包含控制字符(如换行符)时显示确认对话框。它是 default 集合的一部分,会自动加载,请参阅 urxvt(1) § perl-ext-common 和 #禁用 Perl 扩展 以获取更多信息。
Perl 扩展
我们可以通过包含以下行来启用 Perl 扩展
URxvt.perl-ext-common: extension_name_1,extension_name_2,...
参见
- urxvt(1) § perl-ext-common — 资源描述
- urxvt-extensions(1) — 可用(预打包)扩展列表,不要与
default扩展集混淆 $ man 1 urxvt-extension_name— 特定预打包扩展的手册页- urxvtperl(3) — 嵌入式 Perl 解释器手册
可点击的 URL
你可以使用 matcher 扩展使终端中的 URL 可点击。例如,使用鼠标左键在默认的 Web 浏览器中打开链接,请将以下内容添加到 .Xresources
URxvt.perl-ext-common: default,matcher URxvt.url-launcher: /usr/bin/xdg-open URxvt.matcher.button: 1
自 rxvt-unicode 9.14 起,也可以使用 matcher 通过键盘打开和列出最近(目前限制为 10 个)的 URL
URxvt.keysym.C-Delete: perl:matcher:last URxvt.keysym.M-Delete: perl:matcher:list
匹配的链接可以使用选定的前景色或背景色进行着色(请参阅 urxvt(1) § COLOURS AND GRAPHICS),例如蓝色
URxvt.matcher.rend.0: Uline Bold fg4
或者,使用 colorUL 来设置 #RRGGBB 颜色。但这会为所有带下划线的文本着色,而不是仅为链接匹配着色
URxvt.colorUL: #4682B4
简单的标签页
要为 urxvt 添加标签页,请将以下内容添加到你的 ~/.Xresources
URxvt.perl-ext-common: ...,tabbed,...
要控制标签页,请使用
| 按键 | 描述 |
|---|---|
Shift+Down |
新建标签页 |
Shift+Left |
切换到左侧标签页 |
Shift+Right |
切换到右侧标签页 |
Ctrl+Left |
将标签页向左移动 |
Ctrl+Right |
将标签页向右移动 |
Ctrl+d |
关闭标签页 |
你可以使用以下设置更改标签页的颜色
URxvt.tabbed.tabbar-fg: 2 URxvt.tabbed.tabbar-bg: 0 URxvt.tabbed.tab-fg: 3 URxvt.tabbed.tab-bg: 0
为了使标签栏透明,将其值设置为 -1
URxvt.tabbed.tabbar-bg: -1
如果你需要重命名标签页,你可能需要安装 urxvt-tabbedexAUR 来代替。
全屏
你可以安装 AUR 包 urxvt-fullscreenAUR,然后设置一个键盘绑定将 urxvt 设置为全屏。
URxvt.perl-ext-common: ...,fullscreen,... URxvt.keysym.F11: perl:fullscreen:switch
禁用 Perl 扩展
如果你不使用 Perl 扩展功能,可以通过完全禁用 Perl 扩展来提高安全性和速度
URxvt.perl-ext-common:
要选择性地禁用一个扩展,你需要在此扩展名称前加上一个连字符
Urxvt.perl-ext-common: default,-extension
或者,你可以明确列出所有需要的扩展,从而有效地禁用所有其他扩展
URxvt.perl-ext-common: eval,searchable-scrollback,resize-font
故障排除
升级到 9.31 后 Shell 提示符位置错误
某些窗口管理器可能会出现提示符出现在窗口中间的问题。这可能发生在启动时和/或窗口调整大小时。根本原因是 lines-rewrap 算法的更新。
要解决这个问题,你应该应用 lines-rewrap.patch。
你也可以尝试调整 geometry,但结果取决于环境和工作流程,没有“一刀切”的解决方案
- 设置真实几何:
URxvt.geometry: 174x47。 - 设置不切实际的几何:
URxvt.geometry: 400x400。 - 将行数设置为 -1:
URxvt.geometry: 80x-1。
- 这可能导致无法使用某些命令行选项,例如
urxvt --borderColor black -e mc有时会在启动终端的短暂瞬间将 Shell 提示符放在第一行的中间,而不是运行 Midnight Commander。
- 这可能导致无法使用某些命令行选项,例如
最终解决方案是恢复源代码中的更改
- 注释掉
screen.C中的 一行(也请参阅starttop.patch)。 - 完全恢复算法更改:FS#77062#comment216001。
远程主机
如果你登录到远程主机,在 rxvt-unicode 下运行文本模式程序时可能会遇到问题。这可以通过在远程主机上安装 rxvt-unicode-terminfo 或将本地机器上的 /usr/share/terminfo/r/rxvt-unicode 复制到你的主机的 ~/.terminfo/r/rxvt-unicode 来解决;rxvt-unicode-256color 也是如此。
一些远程系统不会自动更改标题,除非你指定 TERM=xterm。要解决这个问题,请将以下行添加到远程机器的 .bashrc
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}:${PWD}\007"'
你还可以尝试将以下内容放入你的 .Xresources
URxvt.termName: rxvt
这在连接到没有管理员权限的远程主机而无法安装 rxvt-unicode 的 terminfo 定义时非常有用。
将 rxvt-unicode 用作 gmrun 的终端
与某些其他终端不同,urxvt 期望 -e 的参数是分开提供的,而不是用引号组合在一起。这会导致 gmrun 出现问题,gmrun 假设行为相反。可以通过在 .gmrunrc 中 gmrun 的 Terminal 变量前面加上 eval 来解决这个问题
Terminal = eval urxvt
TermExec = ${Terminal} -e
gmrun 使用 /bin/sh 来执行命令,因此 eval 在这里是可以理解的。eval 会产生“分解” -e 参数的副作用,其方式与 Bash 中的 $@ 相同,从而使命令对 urxvt 具有可读性。
组合键不起作用
请参阅 Get Alt key to work in terminal。
非常长的行导致速度变慢
matcher 插件可能是罪魁祸首。它必须在每次行更新时将正则表达式与行进行匹配,如果你设置了很大的 saveLines 值,这可以通过允许非常大的最大行长度来加剧问题。
有一些简单的解决方法
- 减小
saveLines - 禁用
matcher插件
如果以上两者都不是可行的选项,你可以通过在某个截止点后禁用 URL 匹配来妥协
- 将
/usr/lib/urxvt/perl/matcher复制到~/.urxvt/ext/(如果需要,请创建该目录) - 编辑
~/.urxvt/ext/matcher,并在on_line_update子程序中找到my ($self, $row) = @_;行。它应该是第 270 行。 - 在该行之后,插入行
return () if $row < -100;。这将禁用对任何比终端顶部落后 100 行以上的行的 URL 匹配。
Midnight Commander 中没有粗体文本
如果使用默认的 TERM 设置在 rxvt-unicode 下启动,通常在许多其他终端中会显示为粗体的文本将不会显示为粗体。问题的根源在于 xterm 将亮色文本与粗体属性耦合 — 因此,亮色在 xterm 中将始终显示为粗体。
解决方案是配置 Midnight Commander 以显式使用所需的粗体颜色,例如通过编辑默认皮肤如下
$ mkdir ~/.local/share/mc/skins $ cp /usr/share/mc/skins/default.ini ~/.local/share/mc/skins/ $ sed -i -E 's/^(.* = (gray|brightred|brightgreen|yellow|brightblue|brightmagenta|brightcyan|white);.*)$/\0;bold/' ~/.local/share/mc/skins/default.ini
以上将创建一个 default 皮肤的副本,但所有亮色都添加了显式的粗体属性。
参见
- Rxvt Unicode — Alex Booker 的视频教程
- 可浏览的 CVS — 源代码
- rxvt-unicode —
enable-wide-glyphs.patch开发者的 dotfile