arm*_*ino 186 linux shell fish
我想在鱼中定义一些别名.显然应该可以在中定义它们
~/.config/fish/functions
Run Code Online (Sandbox Code Playgroud)
但是当我重新启动shell时,它们不会自动加载.有任何想法吗?
Boz*_*sov 324
只是用alias
.这是一个基本的例子:
# Define alias in shell
alias rmi "rm -i"
# Define alias in config file
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
Run Code Online (Sandbox Code Playgroud)
最后一个命令创建该文件~/.config/fish/functions/rmi.fish
.
Jer*_*rub 115
这就是我定义一个新函数foo
,运行它并持久保存它的方法.
sthorne@pearl~> function foo
echo 'foo was here'
end
sthorne@pearl~> foo
foo was here
sthorne@pearl~> funcsave foo
Run Code Online (Sandbox Code Playgroud)
gle*_*man 52
对于后代,鱼别名只是功能:
$ alias foo="echo bar"
$ type foo
foo is a function with definition
function foo
echo bar $argv;
end
Run Code Online (Sandbox Code Playgroud)
要删除它
$ unalias foo
/usr/bin/unalias: line 2: unalias: foo: not found
$ functions -e foo
$ type foo
type: Could not find “foo”
Run Code Online (Sandbox Code Playgroud)
Not*_*1ds 25
我知道目前已经有 11 个答案,它们都有效,但大多数在 2022 年(以及过去几年)也不是最理想的。
\n完成此问题所要求的最快、最好的方法是:
\nalias -s <aliasname> "command(s)" # Or --save\n
Run Code Online (Sandbox Code Playgroud)\n重要提示:只需在命令行中为每个别名执行一次此操作即可。不要将其添加到您的启动配置中。
\n列出以这种方式定义的现有别名(从Fish 2.5b1开始):
\nalias\n
Run Code Online (Sandbox Code Playgroud)\n要编辑以此方式创建的别名:
\nfunced -s <aliasname> # or --save\n
Run Code Online (Sandbox Code Playgroud)\n要删除以这种方式定义的别名(从Fish 3.4.0开始):
\nfunctions -e <aliasname> # or --erase\nfuncsave <aliasname>\n
Run Code Online (Sandbox Code Playgroud)\n请注意,由于 3.4.0 几周前才发布,因此我还将包含在以前版本中可用的命令:
\nfunctions -e <aliasname> # or --erase\nrm ~/.config/fish/functions/<aliasname>.fish\n
Run Code Online (Sandbox Code Playgroud)\n讽刺的是,您甚至可能想将其别名为unalias
. 您需要首先添加alias -s unalias
该functions -e ...
部分,然后funced -s unalias
再次添加rm ...
.
请注意,@nemanja 的答案确实包含该alias -s
命令,但没有详细说明。无论如何,因为它早于我的答案,所以我根本不介意它是否被接受。然而,目前接受的答案有点过时了。虽然理论上可以对其进行编辑,但恕我直言,必要的更改将创建不同的答案,而我们不应该这样做。
虽然@nemanja 的答案是当前鱼类版本的最佳解决方案,但我将其写为单独的答案:
\n首先,重要的是要理解,正如 Glenn Jackman(前 Fish shell 贡献者)在这个答案中提到的那样,alias
fish 中的命令只是用于创建函数的语法糖。
但是,当您以这种方式定义别名时,它仅在内存中定义。它没有被坚持下去。该能力是在答案写完后不久添加的。
\n考虑到这一点,目前接受的2010 年答案现在存在一些问题。
\n首先,您确实不应该在配置中定义别名。这在 2010 年可能是正确的,但即便如此,我认为 Fish 支持函数/别名的延迟加载,这是一个更好的选择。在启动配置中定义函数/别名是“bash/zsh 方式”。鱼比那更好...
\n将 Fish 与 bash 和 zsh 区分开来的(众多)功能之一是延迟加载。在这种情况下,懒惰是好的。你想要延迟加载。你需要延迟加载(好吧,也许不需要),但无论如何......
\n正如最初的问题提到的,可以在 中定义函数~/.config/fish/functions/
,尽管它是目录而不是文件。$XDG_CONFIG_HOME/fish/functions
请注意,如果定义了该变量,就会出现这种情况。
该目录中的函数是延迟加载的。
\n延迟加载的意思是:
\nFish在启动时不会加载别名/函数的任何部分。这可以显着加快启动时间,特别是如果您有许多别名和/或复杂的函数,或者可能在较慢的系统/VM/共享 CPU 主机上运行。
\n在使用之前,除了名称(用于查找目的)之外,函数的任何部分都不会加载到内存中。
\n第一次使用 调用函数时functionname
,只有那时才会从 中延迟加载该函数~/.config/fish/functions/<functionname.fish>
。
这会产生多大的差异取决于很多因素,但就我个人而言,我一直在寻找优化配置的简单方法。促使我从 Zsh 转向 Fish 的主要因素之一是,随着我添加特性、功能等,我的 Zsh 配置的启动速度越来越慢。我们已经切换到更好的 shell(我认为是这样)- - 为什么不利用其改进的功能呢?
\n这种延迟加载可能听起来很复杂,但这几乎正是该alias -s
命令为我们所做的事情,而无需任何额外的努力。
此外,该alias
命令还进一步执行了几个步骤,并自动--wraps <original_command>
向您的函数添加一个参数,以便您获得补全的额外好处。它还添加了--description
,用于将函数描述为“别名”。结果,只运行:
alias\n
Run Code Online (Sandbox Code Playgroud)\n...本身将为您提供以此方式定义的所有函数/别名的列表。
\n三个 单独的 答案也都提到 using ~/.config.fish/config.fish
,无论是与function
声明还是alias
命令一起使用。
与最初的答案一样,这是次优的 bash/zsh 做事方式。这意味着每次启动新 shell 时都会处理并加载您的别名/函数。
\n我建议您改用延迟加载。
\nmkalias
功能@Mike 的这个答案定义了一个mkalias
创建和保存别名的函数。当时这是一个非常alias --save/-s
好的解决方案(恕我直言,应该有更多的赞成票),但它早于 Fish 版本 3.0,其中添加了,现在做了同样的事情。
abbr
命令@TobiasM\xc3\xbchl\'s 答案建议使用该abbr
命令,这是一个合理的替代方案。但是,请注意,它alias
确实处理完成,并且以与该答案中给出的示例几乎相同的方式abbr
。
alias -s gco "git checkout"\n
Run Code Online (Sandbox Code Playgroud)\n完成将基于git checkout
,就像它是扩展缩写一样。
在某些情况下,完成可能会更准确,因为在输入缩写名称后按一下缩写就会立即展开Space。
\n这是鱼类缩写和别名之间的根本区别之一。缩写词会根据提示进行扩展;别名则不然。
\n另一个区别是缩写存储在变量中,这些变量在 shell 启动时处理/加载(无论是通用还是全局/配置)。如上所述,别名是延迟加载的。
\n另一个区别是别名,因为它们是函数,所以可能要复杂得多。例如,我将输出ls
设置为exa
通过管道传输到bat
. 只是不可能用缩写来定义它。
也就是说,缩写是鱼类中值得考虑使用的一个功能。我确实计划将一些别名转换为缩写,因为我想在扩展后更改一些参数;这是未扩展别名不可能实现的。
\nCoo*_*ice 11
fish通过执行〜/ .config/fish/config.fish中的命令开始.如果它不存在,您可以创建它.
步骤1.制作配置文件(如.bashrc)
config.fish
第2步.只需写下你的别名;
别名rm ="rm -i"
小智 10
要正确加载〜/ .config/fish/functions中的函数
您可以在文件和名称文件中仅设置一个函数与函数名称+添加.fish扩展名相同.
这样改变打开的终端中的文件内容重载功能(注意可能会发生一些延迟~1-5s)
这样,如果您通过命令行编辑
function name; function_content; end
Run Code Online (Sandbox Code Playgroud)
然后
funcsave name
Run Code Online (Sandbox Code Playgroud)
您在控制台中具有用户定义的功能,并以相同的顺序定制.
@bozhidar-batsov 给出了一个绝对完整的答案,可以帮助人们理解 Fish 中别名/函数的内部工作原理。阅读fish文档中的别名,还有一个-s
使用起来确实很方便的标志,但我没有看到有人提到它。
-s 或 --save 使用 funcsave 自动将别名创建的函数保存到 Fish 配置目录中。
用于定义和保存别名的单行解决方案(例如):
alias cl 'clear' -s
. 立即在所有会话中工作并持续存在。
导航到~/.config/fish/functions/
,您将看到cl.fish
文件。
# Defined via `source`
function cl --wraps=clear --description 'alias cl clear'
clear $argv;
end
Run Code Online (Sandbox Code Playgroud)
小智 5
在 ~/.config/fish/functions 中创建一个名为 mkalias.fish 的函数并将其放入
function mkalias --argument key value
echo alias $key=$value
alias $key=$value
funcsave $key
end
Run Code Online (Sandbox Code Playgroud)
这将自动创建别名。
如果您添加abbr
而不是,alias
则会获得更好的自动完成功能。在鱼中,abbr
匹配bash别名的行为更紧密。
abbr -a gco git checkout
Run Code Online (Sandbox Code Playgroud)
将-a
dd 扩展为的新的abbr
逃逸。gco
git checkout