Bash
如何根據歷史記錄為 bind -x 指定命令參數?
假設我有一個名為 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