[英]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
並且它們應該在您開始釣魚時自動加載。
function name; command; end
從~/.config/fish/functions 正確加載函數
您只能在文件中設置一個函數,並將文件命名為與函數名稱 + add.fish擴展名相同的名稱。
這種方式在打開的終端中更改文件內容重新加載功能(注意可能會出現一些延遲~1-5s)
這樣,如果您通過命令行進行編輯
function name; function_content; end
然后
funcsave name
您在控制台中有用戶定義的功能,並以相同的順序定制。
我知道此時已經有 11 個答案,它們都有效,但大多數在 2022 年(以及過去幾年)也是次優的。
執行此問題中要求的最快和最好的方法是:
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 的回答是當前魚類發布的最佳解決方案,但我將其作為一個單獨的答案來寫:
首先,重要的是要理解,正如 Glenn Jackman(前 fish shell 貢獻者)在這個答案中提到的,fish 中的alias
命令只是用於創建函數的語法糖。
但是,當您以這種方式定義別名時,它僅在 memory中定義。 它沒有持久化。 在寫完該答案后不久就添加了該功能。
考慮到這一點,目前從 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
這將自動創建別名。
我發現之前的答案和評論不必要地不完整和/或令人困惑。 我需要做的最低限度是:
~/.config/fish/config.fish
。 該文件可以選擇是一個軟鏈接。alias myalias echo foo bar
。fish
。 要確認定義,請嘗試type myalias
。 試試別名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.