在fish shell中定义别名

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

~/.config/fish/functions

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

180416 次浏览

只需使用alias即可。这里有一个基本的例子:

# 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
  1. 如果在~ / config /鱼/中没有config.fish,则创建它。
  2. 在那里你可以写你的函数。__abc0

将你的文件保存为~/.config/fish/functions/{some_function_name}.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扩展名相同。

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

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

function name; function_content; end

然后

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中的命令。 如果它不存在,可以创建它:

vim ~ / config /鱼/ config.fish

并用:wq保存它

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

config.fish

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

别名rm="rm -i"

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

abbr -a gco "git checkout"

-add一个新的abbreviation gco扩展为git checkout

这是一个自动补全功能的视频演示

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

  1. 创建~/.config/fish/config.fish。该文件可以是软链接。
  2. 向它添加行alias myalias echo foo bar
  3. 重启fish。要确认定义,请尝试type myalias。试试这个别名。

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

使用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

我知道在这一点上已经有11个答案,还有它们都有效,但大多数在2022年(以及过去几年)也是次优的。

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

  • 回答这个问题最快最好的方法是:

    alias -s <aliasname> "command(s)" # Or --save
    

    < >强重要< / >强: 只需在命令行中为每个别名执行一次。不要将其添加到启动配置中。

  • 列出以这种方式定义的现有别名(自鱼2.5 b1以来):

    alias
    
  • 编辑以这种方式创建的别名:

    funced -s <aliasname> # or --save
    
  • 删除以这种方式定义的别名(从鱼3.4.0开始):

    functions -e <aliasname> # or --erase
    funcsave <aliasname>
    

    请注意,由于3.4.0在几周前才发布,我将包括在以前版本中工作的命令:

    functions -e <aliasname> # or --erase
    rm ~/.config/fish/functions/<aliasname>.fish
    

    具有讽刺意味的是,你甚至可能想将其别名为unalias。你需要先alias -s unalias functions -e ...部分,然后再funced -s unalias来添加rm ...


注意,@nemanja的回答确实包含alias -s命令,但没有详细说明。无论如何,因为它早于我的,如果这是公认的答案,我一点也不介意。然而,当前接受的答案有点过时了。虽然理论上它可以被编辑,但恕我直言,必要的更改将创建不同的答案,这是我们不应该做的。

虽然@nemanja的回答是当前鱼发布的最佳解决方案,但我写这个作为一个单独的答案:

  • 详细了解为什么 ('alias -s ')是最好的解决方案。
  • 请详细说明为什么其他答案对于当前的鱼类释放来说是次优的。
  • 提供关于编辑和删除以这种方式定义的别名的附加信息。

更多关于为什么上面的答案比其他答案更可取的细节

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

然而,当你以这种方式定义别名时,它被定义为只在记忆中。它不是持久化的。这个能力是在答案写完后不久添加的。

过时的方法#1

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

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

将fish与bash和zsh区别开来的(许多)特性之一是惰性加载。Lazy在本例中是。你想要延迟加载。你需要惰性加载(好吧,也许不是需要),但无论如何…

正如最初的问题所提到的,可以在~/.config/fish/functions/中定义函数,尽管它是目录而不是文件。注意,如果定义了该变量,则该变量将为$XDG_CONFIG_HOME/fish/functions

此目录中的函数是惰性加载的。

延迟加载意味着:

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

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

  • 第一次使用functionname调用函数时,然后且仅在那时将从~/.config/fish/functions/<functionname.fish>中偷懒加载该函数。

这将产生多大的不同取决于很多因素,但就我个人而言,我一直在寻找优化配置的简单方法。驱使我从Zsh转向fish的一个主要因素是,当我添加特性、功能等时,Zsh配置的启动速度越来越慢。我们已经切换到一个更好的shell(在我们看来,我认为)——为什么不利用它改进的特性呢?

这个延迟加载的可能听起来很复杂,但它几乎完全是alias -s命令为我们无需任何额外的努力所做的。

此外,alias命令更进一步,自动将--wraps <original_command>参数添加到函数中,以便获得补全的额外好处。它还添加了--description,用于将函数描述为“别名”。因此,运行只是:

alias

... 它本身会给你一个这样定义的所有函数/别名的列表。

其他答案

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

与最初的答案一样,这是不理想的bash/zsh方式。这意味着你的别名/函数将在每次你启动一个新的shell时被处理和加载。

我建议您改用惰性加载。

mkalias函数

以下是@Mike的回答定义了一个mkalias函数,该函数创建了而且保存别名。非常在当时是一个很好的解决方案(IMHO应该有更多的赞),但它早于fish 3.0版本,该版本添加了alias --save/-s,现在做同样的事情。

abbr命令

@TobiasMuhl的回答建议使用abbr命令,这是一个合理的替代方案。但是,请注意,alias 处理补全,并且与答案中给出的abbr示例的方式几乎相同。

alias -s gco "git checkout"

补全将基于git checkout,就像它是一个扩展的缩写一样。

在某些情况下,五月补全会更准确,因为键入缩写名称后,一旦按下空间,缩写就会展开。

这是fish中缩写和别名之间的根本区别之一。缩略语在提示符处展开;别名则不然。

另一个区别是缩写存储在变量中,在shell启动时处理/加载这些变量(无论是universal还是global/config)。如上所述,别名是惰性加载的。

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

也就是说,缩写是一个可以考虑在fish中使用的特性。我确实计划将我的一些别名转换为缩写,因为我有一些想在展开后改变参数的地方;这在未展开的别名中是不可能实现的。