我想在fish中定义一些别名。显然,应该可以在
~/.config/fish/functions
但当我重新启动shell时,它们不会自动加载。什么好主意吗?
我想在fish中定义一些别名。显然,应该可以在
~/.config/fish/functions
但当我重新启动shell时,它们不会自动加载。什么好主意吗?
当前回答
在~/中创建一个函数。Config /fish/ mkalias函数。钓鱼,把这个放进去
function mkalias --argument key value
echo alias $key=$value
alias $key=$value
funcsave $key
end
这将自动创建别名。
其他回答
我发现之前的回答和评论是不必要的不完整和/或混乱。我至少需要做的是:
创建~ / config /鱼/ config.fish。该文件可以是软链接。 添加行别名myalias echo foo bar。 重启鱼。要确认定义,请尝试输入myalias。试试这个别名。
我知道在这一点上已经有11个答案,它们都是有效的,但大多数在2022年(以及过去几年)也是次优的。
简短的,更新的,自3.0b1以来所有版本的当前答案:
The quickest and best way to do what is requested in this question is: alias -s <aliasname> "command(s)" # Or --save Important: Simply do this one time per alias at the command-line. Do not add it to your startup config. To list existing aliases which have been defined this way (since fish 2.5b1): alias To edit an alias created this way: funced -s <aliasname> # or --save To remove an alias defined this way (since fish 3.4.0): functions -e <aliasname> # or --erase funcsave <aliasname> Note that since 3.4.0 was only released a few weeks ago, I'll include the commands that work in previous versions as well: functions -e <aliasname> # or --erase rm ~/.config/fish/functions/<aliasname>.fish Ironically, you may even want to alias this into unalias. You'll need to first alias -s unalias the functions -e ... part, then funced -s unalias again to add the rm ....
注意@nemanja的回答确实包含别名-s命令,但没有详细说明。无论如何,因为它早于我的,如果这是公认的答案,我一点也不介意。然而,目前公认的答案有点过时了。虽然理论上它可以被编辑,但恕我直言,必要的改变会产生一个不同的答案,这是我们不应该做的。
虽然@nemanja的答案是当前鱼类发布的最佳解决方案,但我写这篇文章是作为一个单独的答案:
请详细说明为什么('alias -s ')是最佳解决方案。 请详细说明为什么其他答案对于当前的鱼类释放来说是次优的。 提供关于编辑和删除以这种方式定义的别名的附加信息。
更多关于为什么上面的答案比其他答案更可取的细节
首先,重要的是要理解,正如Glenn Jackman(前fish shell贡献者)在回答中提到的,fish中的alias命令只是创建函数的语法糖。
但是,当您以这种方式定义别名时,它仅在内存中定义。它不是持久化的。这个能力是在答案写完后不久添加的。
过时的方法#1
考虑到这一点,目前接受的2010年的答案现在有一些问题。
首先,您真的不应该在配置中定义别名。这在2010年可能是正确的,但即使在那时,我认为fish支持延迟加载函数/别名,这是一个更好的选择。在你的启动配置中定义函数/别名是“bash/zsh方式”。鱼比那好…
将fish与bash和zsh区别开来的(许多)特性之一是惰性加载。在这种情况下,懒惰是好的。您需要惰性加载。你需要惰性加载(好吧,也许不需要),但无论如何……
正如最初的问题所提到的,可以在~/中定义函数。Config /fish/functions/,尽管它是一个目录而不是一个文件。注意,如果定义了这个变量,那么它将是$XDG_CONFIG_HOME/fish/functions。
此目录中的函数是惰性加载的。
延迟加载意味着:
Fish does not load any part of your alias/function when it starts. This can speed up launch times significantly, especially if you have many aliases and/or complex functions, or perhaps are running on a slower system/VM/shared CPU host. No part of the function other than the name (for lookup purposes) is loaded into memory until it is used. The first time you call a function with functionname, then and only then will fish lazy-load the function from ~/.config/fish/functions/<functionname.fish>.
这将产生多大的不同取决于很多因素,但就我个人而言,我一直在寻找优化配置的简单方法。驱使我从Zsh转向fish的一个主要因素是,当我添加特性、功能等时,Zsh配置的启动速度越来越慢。我们已经切换到一个更好的shell(在我们看来,我认为)——为什么不利用它改进的特性呢?
这种延迟加载听起来可能很复杂,但它几乎就是alias -s命令为我们所做的,无需任何额外的工作。
此外,alias命令更进一步,自动向函数添加——wraps <original_command>参数,以便获得补全的额外好处。它还添加了一个——description,用于将函数描述为“别名”。因此,运行只是:
alias
... 它本身会给你一个这样定义的所有函数/别名的列表。
其他答案
三个独立的答案也都提到了使用~/.config.fish/config。Fish,使用函数声明或别名命令。
与最初的答案一样,这是不理想的bash/zsh方式。这意味着你的别名/函数将在每次你启动一个新的shell时被处理和加载。
我建议您改用惰性加载。
mkalias函数
@Mike的回答定义了一个创建和保存别名的mkalias函数。这在当时是一个非常好的解决方案(我认为应该获得更多的赞),但它早于fish 3.0版本,后者添加了别名——save/-s,现在它也做同样的事情。
简写的命令
@TobiasMühl的回答建议使用abbr命令,这是一个合理的替代方案。但是,请注意,alias确实处理补全,并且与回答中给出的abbr示例的方式几乎相同。
alias -s gco "git checkout"
补全将基于git签出,就好像它是一个扩展的缩写一样。
在某些情况下,补全会更准确,因为在键入缩写名称后,一旦按下空格,缩写就会展开。
这是fish中缩写和别名之间的根本区别之一。缩略语在提示符处展开;别名则不然。
另一个区别是缩写存储在变量中,这些变量在shell启动时被处理/加载(无论是universal还是global/config)。如上所述,别名是惰性加载的。
另一个区别是别名,因为它们是函数,所以可能要复杂得多。例如,我将ls设置为exa,并将输出管道输送到bat。只是不可能用缩写来定义。
也就是说,缩写是一个可以考虑在fish中使用的特性。我确实计划转移一些我的别名缩写,因为我有一些地方,我想改变展开后的参数;这在未展开的别名中是不可能实现的。
对于后人来说,鱼的别名只是函数:
$ alias foo="echo bar"
$ type foo
foo is a function with definition
function foo
echo bar $argv;
end
移除它
$ unalias foo
/usr/bin/unalias: line 2: unalias: foo: not found
$ functions -e foo
$ type foo
type: Could not find “foo”
在~/中创建一个函数。Config /fish/ mkalias函数。钓鱼,把这个放进去
function mkalias --argument key value
echo alias $key=$value
alias $key=$value
funcsave $key
end
这将自动创建别名。
如果你添加一个缩写而不是一个别名,你会得到更好的自动完成。在fish中,abbr更接近bash别名的行为。
abbr -a gco "git checkout"
将-添加一个扩展到git checkout的新缩写gco。
下面是自动完成功能的视频演示