Zsh Alias Preview 预览 zsh 中的命令缩写
原文链接https://www.castamerego.com/blog/zshAliasPreviewalias 用多了之后就有一个问题敲gco的时候记得它是git checkout但gcb是什么来着dcu又是什么通常的做法是which gcb看一眼再回来重敲一遍挺打断思路的。笔者写了个 Zsh 插件在敲命令的时候直接把 alias 展开后的内容显示在 message area免去这一步缘起笔者~/.zshrc里 alias 越攒越多 —— eza 的几个变体、git 的若干缩写、docker compose 一坨。短 alias 敲起来是省事但回头看历史记录或者教别人用的时候经常要which xxx一下才想起来到底展开成什么之前也想过把which绑个快捷键但本质上还是要打断输入流。笔者想要的是 IDE 里那种 inline hint —— 边敲边看眼角余光扫一眼就够了。Zsh 的 message area提示符下面那一行正好闲着于是就有了这个插件功能主要功能有实时预览 alias 展开后的命令显示在 message area可以配置只对感兴趣的命令展示避免被ll之类的低价值预览刷屏长命令自动截断不会撑爆下面那一行仅在内容变化时重绘避免输入过程中的闪烁安装如果还没装过 Zsh 和 Oh My Zsh可以先看 配置 Linux 终端 (zsh) 把基础环境搭好目前是 Oh My Zsh manual install。先把仓库 clone 到 custom plugins 目录git clone https://github.com/Casta-mere/zsh-alias-preview \ ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-alias-preview然后在~/.zshrc的plugins(...)里加上zsh-alias-preview最后 source 一下source ~/.zshrc配置默认只对git和docker这两个命令的 alias 显示预览 —— 笔者的高频场景就这俩其他的不太常需要看展开。想加别的命令在~/.zshrc里做如下修改即可~/.zshrctypeset -ga ALIAS_PREVIEW_COMMANDS(git docker ls kubectl)规则很简单alias 展开后第一个 token 在数组里就显示预览不在就什么都不做。例如gcogit checkout会显示llls -alF默认不会加ls进去之后就会实现思路整个插件没有引入任何依赖全靠 Zsh 自身的 ZLE (Zsh Line Editor) 机制。核心就三件事挂钩重绘事件。Zsh 提供了add-zle-hook-widget可以在 ZLE 的几个生命周期点line-init/line-pre-redraw/line-finish等注入自己的 widget。这里挂在line-pre-redraw上 —— 每次行内容变化、重绘前都会触发add-zle-hook-widget line-pre-redraw _preview_alias_message解析当前命令行的第一个 token。ZLE 把当前输入暴露在$BUFFER变量里。去掉前导空格、取第一个空格之前的部分就是用户正在敲的命令。然后用${aliases[$first_word]}查 Zsh 内置的aliases关联数组所有 alias 都在这里有就拿到展开字符串local trimmed${BUFFER#${BUFFER%%[! ]*}} local first_word${trimmed%% *} local expanded${aliases[$first_word]}写到 message area。zle -M text就是往提示符下面那行写消息的标准 API输入下一个字符就会自然刷新。再配一个_alias_preview_last缓存避免内容没变时的重复重绘 —— 这就是「不闪烁」的全部秘密zle -M ↳ : ${expanded}剩下两个细节过滤命令用${ALIAS_PREVIEW_COMMANDS[(Ie)$exp_cmd]}——(Ie)是 Zsh 数组的精确匹配下标语法返回索引存在则非零避开补全菜单通过判断$LASTWIDGET是否包含complete等关键字否则会和_complete冲突把补全列表覆盖掉后记插件还很新已知有几个地方没处理好记录一下嵌套 alias 不展开。如果gcogit checkout、gcmgco main敲gcm时只会看到gco main这一层不会再继续把gco展开成git checkoutfunction 形式的 alias 看不到。Zsh 里很多人会用function name() { ... }替代 alias这种东西不在${aliases[]}里本插件不处理全局 aliasalias -g没考虑。全局 alias 可以出现在命令的任意位置按「第一个 token」匹配的策略会漏掉截断长度暂时写死 80。之后想抽成可配置项笔者自己用够了先这样。有边界情况欢迎开 issue 或者 PRGithub zsh-alias-previewhttps://github.com/Casta-mere/zsh-alias-preview
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2538868.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!