題 如何在bash中內聯擴展別名?


有沒有辦法在bash中內聯擴展別名?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 

75
2018-02-19 09:43


起源




答案:


你可以按 按Ctrl - Alt鍵 - Ë 執行readline功能 shell-expand-line 這將做別名,歷史和單詞擴展。請注意,在某些鍵盤上  不是 Alt鍵。你可能需要按 退出 然後 按Ctrl - Ë

功能 alias-expand-line 和 history-and-alias-expand-line 默認情況下不綁定,但您可以通過添加類似於以下內容的行來綁定它們 ~/.inputrc 文件。

"\e\C-l": alias-expand-line

這將使 按Ctrl - Alt鍵 -  (小寫“ell”)表演 只要 別名擴展。


93
2018-02-19 10:52



我們可以將別名擴展映射到<tab>而不影響其他bash完成嗎? - asdfg
@asdfg:如果你這樣做,它將打破其他完成。它 威力 work(未經測試)如上所示創建地圖,然後添加此附加地圖以替換Tab中的現有地圖: "\C-i": "\e\C-l\e\e" 這會創建一個執行兩者的宏 alias-expand-line 和 complete。這取決於我上面的答案的綁定,並且Esc-Esc的默認綁定仍然存在。如果你想做默認完成,你仍然可以做Esc-Esc。 - Dennis Williamson
ESC和CTRL + E適用於OS X,謝謝! - Chris Wagner
確實, ESC C-e 適用於Bash,但是 C-x a 適用於Zsh。也在OS X上測試過。 - Blaz
如果您只是在尋找Ctrl +的東西,其中某些東西可以是“x”鍵,您可以在某些系統中這樣做: Control-x: history-and-alias-expand-line。 - igordcard


這實際上可能是一種更簡單的方法來做你想做的事情(bash版本> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shoptman 頁: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html


3
2018-06-14 13:35



這是錯的。 Shell選項“direxpand”和“expand_aliases”無法像問題指定的那樣幫助擴展內聯別名。我不知道從哪個帽子“direxpand”採取了......?默認情況下,已設置“expand_aliases”。如果取消設置,結果是基本上禁用工作中的別名(在解釋命令行之前不會擴展它們)。例如。給別名 alias ll='ls -lshell會將'll'解釋為可能不存在的命令/函數'll'。 - FooF


這不起作用。但我猜/希望這樣的事情可以做你想做的事情。 您必須使用自己的完成腳本。 這是你如何製作一個:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

現在獲取完整的bash_completion文件(http://caliban.org/bash)並將上面提到的腳本放在bash_completion.d目錄下的一個文件中,你從url引用的腳本。 如果它不起作用,請告訴我。

謝謝。


0
2018-02-19 10:09





對於安裝了zsh尋找簡單解決方案的人, globalias 可能是你的朋友

擴展所有glob表達式,子命令和別名(包括全局)。

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

安裝只需添加“globalias”給你.zshrc插件列表

plugins=(... globalias)

然後按下 SPACE 觸發擴展您編寫的命令。

如果您只想在不展開命令行的情況下插入空格,請按 CTRL+SPACE


0
2017-08-31 18:10