kitty 鼠标点击脚本化:用 open-actions.conf 自定义终端超链接行为
kitty 鼠标点击脚本化用 open-actions.conf 自定义终端超链接行为【免费下载链接】kittyIf you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based.项目地址: https://gitcode.com/GitHub_Trending/ki/kitty本篇技术指南聚焦 kitty 终端的开放动作Open Actions框架它允许你通过open-actions.conf与launch-actions.conf两个配置文件将点击终端中的超链接这一动作完全脚本化绑定任意数量的复杂操作——从在窗口内预览图片、在指定编辑器中打开搜索结果到以自定义方式处理 SSH 链接。读完本文你将掌握配置语法、全部匹配准则、内置环境变量以及 kitty 内部的动作解析与分发机制并能在自己的终端环境中落地一套可复用的点击行为规则。什么是 kitty 的开放动作框架kitty 支持终端超链接协议许多终端程序都会生成这类可点击链接例如ls、gcc、systemd、kitten tool mcat参考 mcat 工具 与tool相关文档以及kitten hyperlinked-grep等。默认情况下kitty 点击链接的行为是固定的开放动作框架则允许你为不同的链接定义点击后执行任意多个复杂动作的规则。从源码结构看该框架的核心实现位于 kitty/open_actions.py其中parse()负责解析配置文件url_matches_criteria()负责逐条判定 URL 是否命中匹配准则actions_for_url()负责返回命中的动作列表并带有基于文件修改时间的缓存机制load_actions_from_path()参考 kitty/open_actions.py。鼠标点击的入口在 C 层 kitty/mouse.c 的mouse_open_url()它会将命中位置交给open_url动作最终由 kitty/boss.py 的Boss.open_url()取出动作并依次派发执行若没有命中任何自定义动作则回退到系统默认的open_url_with程序。open-actions.conf链接点击动作的配置入口创建一个名为~/.config/kitty/open-actions.conf的文件即可开始自定义点击行为。每条规则由一个或多个匹配准则matching criteria以及一个或多个action组成条目之间用空行分隔。最经典的入门示例——点击图片链接时在当前窗口上以全窗口覆盖方式预览图片# Open any image in the full kitty window by clicking on it protocol file mime image/* action launch --typeoverlay kitten icat --hold -- ${FILE_PATH}保存后在 kitty 中运行ls --hyperlinkauto按住ctrlshift点击某个图片文件名图片就会以覆盖层overlay形式出现在当前窗口之上按任意键关闭。macOS 提示macOS 自带的ls不支持超链接需要安装 GNU Coreutils如通过 Homebrew 安装后命令名为gls。一条规则也可以定义多个动作。例如在新 OS 窗口中用tail -f实时跟踪日志文件并同时把字体调小两个单位# Tail a log file (*.log) in a new OS Window and reduce its font size protocol file ext log action launch --title ${FILE} --typeos-window tail -f -- ${FILE_PATH} action change_font_size current -2这里的launch动作对应完整的 launch 功能其--type参数支持window、tab、os-window、overlay、background、clipboard等目标类型见 kitty/launch.py 中的typechoices定义--title可设置窗口标题--cwd可指定工作目录。动作的本质与 kitty.conf 按键动作同源动作非常强大——任何可以在kitty.conf中绑定到按键组合上的动作都可以作为 open-action 使用。这是因为二者最终都会被解析成KeyAction见 kitty/open_actions.py 中的OpenAction定义并经由同一套resolve_aliases_and_parse_actions()逻辑处理参考 kitty/open_actions.py。因此change_font_size、set_colors、new_window、launch等任何动作都能被复用。动作中的环境变量展开在launch的规格说明中可以展开环境变量。除了常规环境变量kitty 专门为开放动作提供了一组特殊变量见 kitty/open_actions.py 中构造的环境字典变量含义URL被打开的完整 URLFILE_PATHURL 的路径部分已反转义即 unquotedFILEURL 路径中文件名部分已反转义FRAGMENTURL 的 fragment#之后的部分已反转义没有则为空字符串NETLOCURL 的 net location即主机名已反转义没有则为空字符串URL_PATHURL 的路径、查询与 fragment 部分不做反转义处理EDITOR终端文本编辑器优先使用kitty.conf中配置的editor选项SHELLshell 的路径优先使用kitty.conf中配置的shell选项不带参数EDITOR变量的解析逻辑对应 kitty/options/definition.py 中editor选项的语义默认值.表示依次使用VISUAL、EDITOR环境变量若都未设置则通过 shell 启动文件探测最后回退到系统常见编辑器。提示可以像在kitty.conf中一样使用action_alias选项为频繁使用的动作定义别名。parse()中对action_alias行的处理见 kitty/open_actions.py。匹配准则Matching criteria详解open-actions.conf中的每个条目必须有一个或多个匹配准则。只有当 URL 满足某条目全部准则时该条目的动作才会被触发处理在第一个命中的条目处停止因此越具体的匹配准则应放在文件越靠前的位置。条目之间以空行分隔。可用的准则如下准则说明protocol逗号分隔的协议列表例如http, https缺省时不限制协议url一个正则表达式必须匹配整个反转义后的URLfragment_matches一个正则表达式必须匹配 URL 中#之后的 fragmentmime逗号分隔的 MIME 类型列表例如text/*, image/*, application/pdf目录的 MIME 类型是inode/directoryext逗号分隔的文件扩展名列表例如jpeg, tar.gzfile匹配文件名的 shell glob 模式例如image-??.png从 kitty/open_actions.py 的解析代码可见实际支持的准则键还包括path对完整反转义路径做 glob 匹配见 kitty/open_actions.py且除url外的所有准则值都会先被转为小写kitty/open_actions.py这保证了匹配不区分大小写。关于各准则的匹配实现细节见 kitty/open_actions.pyurl与fragment_matches使用re.compile编译正则并在反转义后的 URL/fragment上执行搜索mime使用fnmatch.fnmatchcase做通配匹配MIME 类型通过 kitty/guess_mime_type.py 的guess_type()基于文件扩展名推断而非文件内容且仅对file/空协议允许访问文件系统ext检查反转义路径是否以.扩展名结尾支持多段扩展名如tar.gzfile取路径的 basenameposixpath.basename后与 glob 模式匹配protocol对 URL scheme 与列表逐项比较URL 无 scheme 时视为file。扩充 MIME 数据库系统 MIME 数据库缺少某些定义时可以在 kitty 配置目录~/.config/kitty/下创建mime.types文件补充自定义类型。该文件采用标准格式每行一个定义例如text/plain rst md这表示.rst与.md文件被识别为text/plain。kitty 的 MIME 检测基于扩展名而非文件内容。实战组合hyperlinked-grep 与 open-actions 协同开放动作框架最典型的实战场景之一是配合kitten hyperlinked-grep使用用 ripgrep 搜索后直接点击结果行在编辑器中打开对应文件。在open-actions.conf中加入以下内容即可# Open any file with a fragment in vim, fragments are generated # by the hyperlink-grep kitten and nothing else so far. protocol file fragment_matches [0-9] action launch --typeoverlay --cwdcurrent vim ${FRAGMENT} -- ${FILE_PATH} # Open text files without fragments in the editor protocol file mime text/* action launch --typeoverlay --cwdcurrent -- ${EDITOR} -- ${FILE_PATH}第一条利用fragment_matches [0-9]命中带行号 fragment 的结果用vim 行号精确定位第二条兜底处理无 fragment 的文本文件参考 docs/kittens/hyperlinked_grep.rst。运行kitten hyperlinked-grep 关键词后按住ctrlshift点击结果行即可生效。从 kitty/open_actions.py 的actions_for_url()可以看出一个重要行为如果用户自定义规则没有任何条目命中kitty 会回退到内置的默认开放动作打开 kitty 文档链接的kittydoc协议处理见default_open_actions()保证点击行为永远有兜底。文件打开脚本化launch-actions.conf 与 kitty open除了超链接点击kitty 还能把用 kitty 打开文件这一行为脚本化。在 macOS 上可以通过 Finder 的打开方式Open With或把文件/URL 拖拽到 kitty 的 Dock 图标上用 kitty 打开在 Linux 上则可以把某些文件类型关联到 kitty。默认行为是文本文件用编辑器打开图片用 icat kitten 显示shell 脚本在 shell 中运行SSH URL 用 ssh 命令打开。这些默认规则完整定义在 kitty/open_actions.py 的default_launch_actions()中逐条为# Open script files. Change confirm-always to confirm-never or confirm-if-needed to # disable confirmation for all or executable files respectively. protocol file ext sh,command,tool action launch --hold --typeos-window kitten __shebang__ confirm-always $FILE_PATH $SHELL # Open shell specific script files protocol file ext fish,bash,zsh action launch --hold --typeos-window kitten __shebang__ confirm-always $FILE_PATH __ext__ # Open directories protocol file mime inode/directory action launch --typeos-window --cwd -- $FILE_PATH # Open executable file. Remove kitten __confirm_and_run_exe__ to execute # without confirmation. protocol file mime inode/executable,application/vnd.microsoft.portable-executable action launch --hold --typeos-window -- kitten __confirm_and_run_exe__ $FILE_PATH # Open text files without fragments in the editor protocol file mime text/* action launch --typeos-window -- $EDITOR -- $FILE_PATH # Open image files with icat protocol file mime image/* action launch --typeos-window kitten icat --hold -- $FILE_PATH # Open ssh URLs with ssh command protocol ssh action launch --typeos-window ssh -- $URL这些动作也可以直接从命令行触发kitty open file_or_url another_url ... # macOS only open -a kitty.app file_or_url another_url ...命令行入口对应 kitty/entry_points.py 中的open_urls()与namespaced_entry_points[open]经 C 启动器kitty/launcher/main.c 的open_urls参数传入主进程最终由 kitty/boss.py 附近的actions_for_launch()逻辑解析执行。自定义 launch-actions与open-actions.conf完全类似在 kitty 配置目录创建launch-actions.conf即可自定义这些打开动作语法匹配准则 动作、空行分隔、首个命中生效完全一致。例如修改脚本文件的打开行为使其直接执行而无需确认。加载逻辑见 kitty/open_actions.py 的load_launch_actions()同样带缓存未命中任何自定义规则时回退到上文default_launch_actions()的默认集合kitty/open_actions.py。macOS 专属注册 URL scheme 处理器macOS 缺少设置默认 URL scheme 处理器的官方接口因此 kitty 提供了专用命令。第一个参数是 URL scheme第二个可选参数是应用的 bundle id缺省为 kitty 自身。例如# Set kitty as the handler for ssh:// URLs kitty runpy from kitty.fast_data_types import cocoa_set_url_handler; import sys; cocoa_set_url_handler(*sys.argv[1:]); print(OK) ssh # Set someapp as the handler for xyz:// URLs kitty runpy from kitty.fast_data_types import cocoa_set_url_handler; import sys; cocoa_set_url_handler(*sys.argv[1:]); print(OK) xyz someapp.bundle.identifier同时注意 kitty/open_actions.py 中的一个约束通过launch-actions.conf自定义的kitty://URL 必须以前缀kitty:///launch/开头否则不会触发 launch 动作逻辑这是为了避免与 kitty 内置协议冲突。配置文件语法速查与加载机制综合以上内容两个配置文件遵循同一套语法规则每行格式为键 值action行可重复出现多个#开头为注释空行作为条目分隔符条目内至少一个匹配准则protocol、url、fragment_matches、mime、ext、path、file加一个或多个action支持action_alias 别名 动作定义动作别名匹配时按文件顺序取第一个全部准则命中的条目执行动作内可展开环境变量与URL、FILE_PATH、FILE、FRAGMENT、NETLOC、URL_PATH、EDITOR、SHELL八个特殊变量自定义规则未命中时自动回退到 kitty 内置的默认动作集。文件解析与准则匹配的完整实现位于 kitty/open_actions.pyparse()L33-L79负责语法解析、未知键记录错误日志Ignoring malformed open actions lineurl_matches_criteria()L154-L161要求全部准则通过才返回真actions_for_url_from_list()L164-L202在首条命中后立即返回并展开动作中的环境变量load_actions_from_path()L208-L219基于stat的st_mtime判断文件是否变更变更时才重新读取解析兼顾了配置热更新与性能。此外键盘侧也有配套能力ctrlshiftekitty_mode默认绑定open_url_with_hints可用键盘选择并打开当前可见的 URL见 kitty/options/definition.py 的 Open URL 映射它与点击脚本化互为补充让不习惯鼠标的用户同样享受这套开放动作框架。【免费下载链接】kittyIf you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based.项目地址: https://gitcode.com/GitHub_Trending/ki/kitty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考