如何使用参数调用zsh自定义函数

4

我有一个函数,可以执行一个shell命令——在这个例子中是ls——而不需要使用返回键。

hotkey_ls () { echo; ls; zle redisplay }                                             
zle -N hotkey_ls                                                                      
bindkey ',f' hotkey_ls

我希望能够将 shell 命令作为参数传递,例如:bindkey ',a' hotkey_ls('ls -a')

2个回答

0

根据你愿意为了更少的代码行而牺牲多少可读性,一种可能的方法是执行以下操作(每个项目1行代码+3行代码):

hotkey_cmd() { local cmd=$1; echo; eval "$cmd"; zle redisplay }                                             

hotkey_ls() { hotkey_cmd "ls" }
hotkey_ls_a() { hotkey_cmd "ls -a" }
hotkey_git_status() { hotkey_cmd "git status" }

zle -N hotkey_ls
bindkey ',f' hotkey_ls
zle -N hotkey_ls_a
bindkey ',a' hotkey_ls_a
zle -N hotkey_git_status
bindkey ',gs' hotkey_git_status

或者这样做(9行代码 + 每个项目0行代码):

hotkey_cmd() { local cmd=$1; echo; eval "$cmd"; zle redisplay }                                             

declare -A mappings=(f "ls" a "ls -a" gs "git status")
for shortcut cmd in ${(kv)mappings}; do
    function_name="hotkey_${cmd//[^a-z]/_}"  # e.g. hotkey_ls__a
    echo "$function_name"
    eval "${function_name}() { hotkey_cmd \"$cmd\" }"
    zle -N "$function_name"
    bindkey ",$shortcut" "$function_name"
done

0

你在帖子中编写的函数调用中的括号没有意义,但是除此之外,你可以在函数内部将ls替换为eval ${1:-ls},以实现你想要的效果。

不要忘记引用你的调用,即:

bindkey ,f 'hotkey_ls "ls -a"'

2
无法工作。ZSH 抱怨“没有这样的小部件 'hotkey_ls "ls -a"'" - HKOB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接