Bash

如何根據歷史記錄為 bind -x 指定命令參數?

  • February 21, 2017

假設我有一個名為 synopsis 的命令,它將命令的名稱作為參數並列印出它的語法。現在我想將概要綁定到一個鍵序列。如何將目前命令行中的命令名稱傳遞給概要?這是所需行為的範例:

1$ bind -x '"\C-h": synopsis !#:0'
2$ ls -F^H 
<ls syntax print out from synopsis> 
3$ ls -F

在 2 中呼叫了概要,但沒有歷史擴展。我得到字元串’!#:0’而不是’ls’。似乎沒有任何效果:-/

在綁定了一個鍵的函式中,您可以通過變數READLINE_LINE和訪問和修改命令行的目前內容READLINE_POINT。概念驗證(未經測試的程式碼):

synopsis () (
 set -f
 IFS=$'\t\n\r ;&|'
 words=($READLINE_LINE)
 while [[ "${words[1]}" == @([<>]*|[A-Za-z0-9_]##=) ]]; do
   shift words
 done
 command=${words[1]}
 "$command" --help
)
bind -x '"\C-h": synopsis'

您嘗試使用歷史擴展的方法不起作用。執行命令行時執行歷史擴展。呼叫綁定時,沒有可擴展的歷史記錄。

但是您的根本問題是您的外殼不夠酷。這個特性已經存在於 zsh 中,它被稱為run-help.

bash$ echo 'autoload run-help' >~/.zshrc
重擊 $zsh
暗星%ls -FAlt+h

引用自:https://unix.stackexchange.com/questions/346377