簡體   English   中英

在 fish shell 中定義一個別名

[英]Define an alias in fish shell

我想在 fish 中定義一些別名。 顯然應該可以在

~/.config/fish/functions

但是當我重新啟動 shell 時它們不會自動加載。 有任何想法嗎?

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

有興趣的可以去官方手冊中了解更多關於fish別名的知識。

這就是我定義新函數foo 、運行它並持久保存它的方式。

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

對於后代來說,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”

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

vim ~/.config/fish/config.fish

並用:wq保存

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

配置.fish

第2步。 像這樣寫你的別名;

別名 rm="rm -i"

如果您添加abbr而不是alias ,您將獲得更好的自動完成功能。 在 fish 中, abbr更接近於 bash 別名的行為。

abbr -a gco "git checkout"

-a gco一個擴展為git checkout的新abbr

這是生成的自動完成功能的視頻演示

將您的文件保存為~/.config/fish/functions/{some_function_name}.fish並且它們應該在您開始釣魚時自動加載。

  1. 如果~/.config/fish/中沒有config.fish ,則創建它。
  2. 在那里你可以編寫你的函數。 function name; command; end

~/.config/fish/functions 正確加載函數

您只能在文件中設置一個函數,並將文件命名為與函數名稱 + add.fish擴展名相同的名稱。

這種方式在打開的終端中更改文件內容重新加載功能(注意可能會出現一些延遲~1-5s)

這樣,如果您通過命令行進行編輯

function name; function_content; end

然后

funcsave name

您在控制台中有用戶定義的功能,並以相同的順序定制。

我知道此時已經有 11 個答案,它們都有效,但大多數在 2022 年(以及過去幾年)也是次優的。

3.0b1以來所有版本的簡短、更新、當前答案:

  • 執行此問題中要求的最快和最好的方法是:

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

    重要提示只需在命令行中為每個別名執行一次此操作。 不要將它添加到您的啟動配置中。

  • 列出以這種方式定義的現有別名(自fish 2.5b1 起):

     alias
  • 要編輯以這種方式創建的別名:

     funced -s <aliasname> # or --save
  • 要刪除以這種方式定義的別名(自fish 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命令只是用於創建函數的語法糖。

但是,當您以這種方式定義別名時,它僅在 memory中定義。 它沒有持久化。 在寫完該答案后不久就添加了該功能。

過時的方法 #1

考慮到這一點,目前從 2010 年開始接受的答案現在有一些問題。

首先,你真的不應該在你的配置中定義你的別名。 這在 2010 年可能是正確的,但即便如此,我認為 fish 支持函數/別名的延遲加載,這是一個更好的選擇。 在啟動配置中定義函數/別名是“bash/zsh 方式”。 魚比那個好。。。

將 fish 與 bash 和 zsh 區分開來的(許多)特性之一是延遲加載。 在這種情況下,懶惰是好的 想要延遲加載。 需要延遲加載(好吧,也許不需要),但無論如何......

正如最初提到的問題,可以在~/.config/fish/functions/中定義你的函數,盡管它一個目錄而不是一個文件 請注意,如果定義了該變量,這將是$XDG_CONFIG_HOME/fish/functions

此目錄中的函數是延遲加載的。

延遲加載意味着:

  • Fish 在啟動時不會加載別名/函數的任何部分。 這可以顯着加快啟動時間,特別是如果您有許多別名和/或復雜的功能,或者可能在較慢的系統/VM/共享 CPU 主機上運行。

  • 除了名稱(用於查找目的)之外,函數的任何部分在使用之前都不會加載到內存中。

  • 第一次使用 functionname 調用functionname時,fish 將延遲加載來自~/.config/fish/functions/<functionname.fish>的函數。

這將產生多大的不同取決於很多因素,但就個人而言,我一直在尋找優化配置的簡單方法。 促使我從 Zsh 轉向釣魚的主要因素之一是,隨着我添加特性、功能等,我的 Zsh 配置啟動越來越慢。我們已經切換到更好的 shell(我認為,在我們看來)——為什么不利用其改進的功能呢?

這種延遲加載聽起來可能很復雜,但它幾乎正是alias -s命令為我們所做的,無需任何額外的努力

此外, alias命令更進一步,並自動將--wraps <original_command>參數添加到您的函數中,以便您獲得完成的額外好處。 它還添加了一個--description ,用於將函數描述為“別名”。 結果,只運行:

alias

... 本身會給你一個以這種方式定義的所有函數/別名的列表。

其他答案

三個單獨的答案也都提到使用~/.config.fish/config.fish ,使用function聲明或alias命令。

與原始答案一樣,這是次優的 bash/zsh 做事方式。 這意味着每次啟動新 shell 時都會處理和加載別名/函數。

我建議您改用延遲加載。

mkalias函數

@Mike 的這個答案定義了一個創建保存別名的mkalias函數。 當時是一個非常好的解決方案(恕我直言,應該有更多的贊成票),但它早於 fish 版本 3.0,它添加了alias --save/-s ,現在做同樣的事情。

abbr命令

@TobiasMühl 的回答建議使用abbr命令,這是一個合理的選擇。 但是,請注意alias確實處理完成,並且與該答案中給出的abbr示例幾乎相同。

alias -s gco "git checkout"

完成將基於git checkout ,就像它是一個擴展的縮寫一樣。

某些情況下,完成會更准確,因為在鍵入縮寫名稱后按下空格鍵會立即展開縮寫。

這是魚的縮寫和別名之間的根本區別之一。 縮寫在提示符下展開; 別名不是。

另一個區別是縮寫存儲在變量中,這些變量在 shell 啟動處理/加載(無論是 universal 還是 global/config)。 如上所述,別名是延遲加載的。

另一個區別是別名,因為它們是函數,所以可能要復雜得多。 例如,我將ls設置為exa ,輸出通過管道傳輸到bat 只是不可能用縮寫來定義它。

也就是說,縮寫是考慮在魚類中使用的一個特征。 我確實計划將我的一些別名轉換為縮寫,因為我有一些我想在擴展后更改參數的地方; 未擴展的別名不可能做到的事情。

@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

在 ~/.config/fish/functions 中創建一個名為 mkalias.fish 的函數並將其放入

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

這將自動創建別名。

我發現之前的答案和評論不必要地不完整和/或令人困惑。 我需要做的最低限度是:

  1. 創建~/.config/fish/config.fish 該文件可以選擇是一個軟鏈接。
  2. 添加行alias myalias echo foo bar
  3. 重啟fish 要確認定義,請嘗試type myalias 試試別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM