我想在fish中定义一些别名。显然,应该可以在

~/.config/fish/functions

但当我重新启动shell时,它们不会自动加载。什么好主意吗?


使用别名即可。这里有一个基本的例子:

# Define alias in shell
alias rmi "rm -i"

# Define alias in config file ( `~/.config/fish/config.fish` )
alias rmi="rm -i"

# This is equivalent to entering the following function:
function rmi
    rm -i $argv
end

# Then, to save it across terminal sessions:
funcsave rmi

最后一个命令创建文件~/.config/fish/functions/rmi.fish。

感兴趣的人可以在官方手册中找到更多关于鱼类别名的信息。


这就是我如何定义一个新函数foo,运行它,并持久地保存它。

sthorne@pearl~> function foo
                    echo 'foo was here'
                end
sthorne@pearl~> foo
foo was here
sthorne@pearl~> funcsave foo

如果没有配置。鱼在~/。Config /fish/,使它。 这里你可以写你的函数。函数名;命令;结束


将文件保存为~/.config/fish/functions/{some_function_name}。当你开始钓鱼时,它们应该自动加载。


对于后人来说,鱼的别名只是函数:

$ 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/functions加载函数

您可以在文件中只设置一个函数,并且文件名与函数名+添加.fish扩展名相同。

这样更改文件内容在打开的终端中重新加载函数(注意可能会出现一些延迟~1-5s)

这样,如果你通过命令行编辑

function name; function_content; end

then

funcsave name

你有用户定义的功能在控制台和自定义在相同的顺序。


在~/中创建一个函数。Config /fish/ mkalias函数。钓鱼,把这个放进去

function mkalias --argument key value
  echo alias $key=$value
  alias $key=$value
  funcsave $key
end

这将自动创建别名。


Fish首先执行~/.config/ Fish /config.fish中的命令。 如果它不存在,可以创建它:

链球菌~ / . problem /鱼/ problem .鱼

并保存为:wq

步骤1。制作配置文件(如.bashrc)

config.fish

步骤2。就像这样写你的别名;

= rm= rm i


如果你添加一个缩写而不是一个别名,你会得到更好的自动完成。在fish中,abbr更接近bash别名的行为。

abbr -a gco "git checkout"

将-添加一个扩展到git checkout的新缩写gco。

下面是自动完成功能的视频演示


我发现之前的回答和评论是不必要的不完整和/或混乱。我至少需要做的是:

创建~ / config /鱼/ config.fish。该文件可以是软链接。 添加行别名myalias echo foo bar。 重启鱼。要确认定义,请尝试输入myalias。试试这个别名。


@bozhidar-batsov给出了一个绝对完整的答案,帮助人们理解fish中别名/函数的内部工作原理。阅读fish文档中的别名,还有一个-s标志,使用起来非常方便,但我没有看到任何人提到它。

使用funcsave自动将由别名创建的函数保存到fish配置目录中。

定义和保存别名的一行解决方案(例如): 别名cl 'clear' -s。立即跨所有会话工作,并被持久化。

导航到~/。Config /fish/functions/,你会看到cl。鱼文件。

# Defined via `source`
function cl --wraps=clear --description 'alias cl clear'
  clear $argv;
end

我知道在这一点上已经有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中使用的特性。我确实计划转移一些我的别名缩写,因为我有一些地方,我想改变展开后的参数;这在未展开的别名中是不可能实现的。