如何在鱼壳中定义别名?

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.

有兴趣的人可能想在官方手册中找到更多关于鱼类别名的信息.

  • 只记下要放入哪个文件.我把它放在`〜/ .config/fish/config.fish`中,所以每次运行终端时它都会加载. (9认同)
  • 还要注意,在fish中,别名只是函数周围的一个shellcript包装器. (3认同)

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)

  • 运行`funcsave {some_function_name}`将它保存在`〜/ .config/fish/functions/{some_function_name} .fish中 (13认同)
  • 您还可以使用`funced`编辑功能.例如`funced foo`. (7认同)

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)

  • 创建函数后,您可以执行`funcsave foo`.这会将函数保存到`〜/ .config/fish/functions/foo.fish`中,fish会在第一次从新会话中调用时自动加载它. (9认同)
  • `alias foo="echo bar"` 是迄今为止最简单的解决方案 (2认同)
  • 它从来没有出现在鱼中。这就是为什么我证明它会引发错误。 (2认同)

Not*_*1ds 25

我知道目前已经有 11 个答案,它们都有效,但大多数在 2022 年(以及过去几年)也不是最理想的。

\n

自3.0b1以来所有版本的简短、更新、当前答案:

\n\n
\n

请注意,@nemanja 的答案确实包含该alias -s命令,但没有详细说明。无论如何,因为它早于我的答案,所以我根本不介意它是否被接受。然而,目前接受的答案有点过时了。虽然理论上可以对其进行编辑,但恕我直言,必要的更改将创建不同的答案,而我们不应该这样做。

\n

虽然@nemanja 的答案是当前鱼类版本的最佳解决方案,但我将其写为单独的答案:

\n
    \n
  • 更详细地了解为什么(\'alias -s`) 是最佳解决方案。
  • \n
  • 更详细地说明为什么其他答案对于当前的鱼类释放来说不是最佳的。
  • \n
  • 提供有关编辑和删除以此方式定义的别名的附加信息。
  • \n
\n
\n

更详细地说明为什么上述答案优于其他答案

\n

首先,重要的是要理解,正如 Glenn Jackman(前 Fish shell 贡献者)在这个答案中提到的那样,aliasfish 中的命令只是用于创建函数的语法糖。

\n

但是,当您以这种方式定义别名时,它仅在内存中定义。它没有被坚持下去。该能力是在答案写完后不久添加的。

\n
过时的方法#1
\n

考虑到这一点,目前接受的2010 年答案现在存在一些问题。

\n

首先,您确实不应该在配置中定义别名。这在 2010 年可能是正确的,但即便如此,我认为 Fish 支持函数/别名的延迟加载,这是一个更好的选择。在启动配置中定义函数/别名是“bash/zsh 方式”。鱼比那更好...

\n

将 Fish 与 bash 和 zsh 区分开来的(众多)功能之一是延迟加载。在这种情况下,懒惰是好的。想要延迟加载。你需要延迟加载(好吧,也许不需要,但无论如何......

\n

正如最初的问题提到的,可以在 中定义函数~/.config/fish/functions/,尽管它是目录而不是文件$XDG_CONFIG_HOME/fish/functions请注意,如果定义了该变量,就会出现这种情况。

\n

该目录中的函数是延迟加载的。

\n

延迟加载的意思是:

\n
    \n
  • Fish在启动时不会加载别名/函数的任何部分这可以显着加快启动时间,特别是如果您有许多别名和/或复杂的函数,或者可能在较慢的系统/VM/共享 CPU 主机上运行。

    \n
  • \n
  • 在使用之前,除了名称(用于查找目的)之外,函数的任何部分都不会加载到内存中。

    \n
  • \n
  • 第一次使用 调用函数时functionname,只有那时才会从 中延迟加载该函数~/.config/fish/functions/<functionname.fish>

    \n
  • \n
\n

这会产生多大的差异取决于很多因素,但就我个人而言,我一直在寻找优化配置的简单方法。促使我从 Zsh 转向 Fish 的主要因素之一是,随着我添加特性、功能等,我的 Zsh 配置的启动速度越来越慢。我们已经切换到更好的 shell(我认为是这样)- - 为什么不利用其改进的功能呢?

\n

这种延迟加载可能听起来很复杂,但这几乎正是该alias -s命令为我们所做的事情,而无需任何额外的努力

\n

此外,该alias命令还进一步执行了几个步骤,并自动--wraps <original_command>向您的函数添加一个参数,以便您获得补全的额外好处。它还添加了--description,用于将函数描述为“别名”。结果,只运行:

\n
alias\n
Run Code Online (Sandbox Code Playgroud)\n

...本身将为您提供以此方式定义的所有函数/别名的列表。

\n
其他答案
\n

三个 单独的 答案也都提到 using ~/.config.fish/config.fish,无论是与function声明还是alias命令一起使用。

\n

与最初的答案一样,这是次优的 bash/zsh 做事方式。这意味着每次启动新 shell 时都会处理并加载您的别名/函数。

\n

我建议您改用延迟加载。

\n
mkalias功能
\n

@Mike 的这个答案定义了一个mkalias创建保存别名的函数。当时这是一个非常alias --save/-s好的解决方案(恕我直言,应该有更多的赞成票),但它早于 Fish 版本 3.0,其中添加了,现在做了同样的事情。

\n
abbr命令
\n

@TobiasM\xc3\xbchl\'s 答案建议使用该abbr命令,这是一个合理的替代方案。但是,请注意,它alias 确实处理完成,并且以与该答案中给出的示例几乎相同的方式abbr

\n
alias -s gco "git checkout"\n
Run Code Online (Sandbox Code Playgroud)\n

完成将基于git checkout,就像它是扩展缩写一样。

\n

在某些情况下,完成可能会更准确,因为在输入缩写名称后按一下缩写就会立即展开Space

\n

这是鱼类缩写和别名之间的根本区别之一。缩写词会根据提示进行扩展;别名则不然。

\n

另一个区别是缩写存储在变量中,这些变量在 shell 启动时处理/加载(无论是通用还是全局/配置)。如上所述,别名是延迟加载的。

\n

另一个区别是别名,因为它们是函数,所以可能要复杂得多。例如,我将输出ls设置为exa通过管道传输到bat. 只是不可能用缩写来定义它。

\n

也就是说,缩写是鱼类中值得考虑使用的一个功能。我确实计划将一些别名转换为缩写,因为我想在扩展后更改一些参数;这是未扩展别名不可能实现的。

\n


小智 16

  1. 如果〜/ .config/fish /中没有config.fish,那就搞定吧.
  2. 在那里你可以写你的功能.function name command end


mar*_*isj 14

保存您的文件,~/.config/fish/functions/{some_function_name}.fish并在开始钓鱼时自动加载.


Coo*_*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)

您在控制台中具有用户定义的功能,并以相同的顺序定制.


nem*_*nja 7

@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)

这将自动创建别名。


Tob*_*ühl 5

如果您添加abbr而不是,alias则会获得更好的自动完成功能。在鱼中,abbr匹配bash别名的行为更紧密。

abbr -a gco git checkout
Run Code Online (Sandbox Code Playgroud)

-add 扩展为的新的abbr逃逸。gcogit checkout

这是产生的自动完成功能的视频演示