Abbreviations
To avoid needless typing, a frequently-run command like
git checkout
can be abbreviated togco
using the abbr command.abbr -a gco git checkout
After entering
gco
and pressing Space or Enter, the full textgit checkout
will appear in the command line.This is an alternative to aliases, and has the advantage that you see the actual command before using it, and the actual command will be stored in history.
这是一个可以部分替代alias 或者function 的功能,很多场合用缩写更方便且“正确”,因为用缩写自动扩展后可以清楚的看到命令的原貌,有利于避免误用。缩写扩展后就是普通的可编辑文本,执行后会原样加入history 中,比起alias 更灵活,可以随意增删参数而不用担心alias 内部黑箱里的是怎么处理参数的。使用abbr 添加缩写也比增加function 更简便,缺点当然是没有参数、变量之类的高级功能,但是缩写本来也用不着那些东西,毕竟只是一个轻量的便利功能。
fish 中的缩写类似于输入法的简写功能,或者是宏替换,比如输入
~ ❱ apt
按空格后自动扩展为
~ ❱ sudo apt
也可以用来缩写常用的文件路径,比如用abbr 命令添加一个缩写,用来拿nano 编辑fish 的配置文件
~ ❱ abbr --add catfish 'nano ~/.config/fish/config.fish'
此时只要输入catfish
,按下回车后就会自动扩展为实际指令并执行,按下空格则只扩展而不执行。其中的--add
参数就是添加缩写,也可以写成短参数-a
。
缩略词的优先级高于命令,所以可以随意用缩写替换原命令,也不用担心替换之后误用。
管理缩写
管理配置缩写可以使用fish_config
在网页端操作,也可以使用abbr
命令。
abbr - manage fish abbreviations abbr -a --add [SCOPE] WORD EXPANSION abbr -e --erase WORD... abbr -r --rename [SCOPE] OLD_WORD NEW_WORD abbr -s --show abbr -l --list abbr -q --query WORD...
--add
用于添加新缩写,如abbr --add a aaaaa
,添加缩写词’aa’,扩展原形是’aaaaa’。缩写词中不允许含有空格,当扩展原形中含有空格等特殊符号时需要使用引号包围。
可以指定缩写的作用域,用-U 或--universal
指定缩写持久化,在(当前用户)所有fish 实例有效,相当于写进了配置文件。用-g 或--global
指定缩写作为当前fish 实例的全局变量,只在当前会话有效,不会被持久化,退出当前fish 后失效。不加作用域参数时默认持久化,等于--universal
。
用-l 或 --list
显示当前生效的所有缩写,-e
删除缩写,-r
修改缩写词。
更多详情参考abbr --help
。
内部实现
缩略词被添加后存储在对应作用域的变量表中,持久化后存储在fish_variables 文件中,而不是配置文件里,相当于一种特殊的全局变量。
变量表中缩略词以_fish_abbr_
为前缀,变量值为扩展原形。比如添加apt 缩写后,fish_variables 文件中就会多一行
SETUVAR _fish_abbr_apt:sudo\x20apt
即设置了universal 变量_fish_abbr_apt,值是sudo apt
。