![映射返回,没有其他输入到别名](https://linux22.com/image/58988/%E6%98%A0%E5%B0%84%E8%BF%94%E5%9B%9E%EF%BC%8C%E6%B2%A1%E6%9C%89%E5%85%B6%E4%BB%96%E8%BE%93%E5%85%A5%E5%88%B0%E5%88%AB%E5%90%8D.png)
我想Return在没有其他输入的情况下在 shell 中运行别名命令。这在 Bash 或 Zsh 中可能吗?
换句话说,当我输入一个空命令行时,我想运行一个特定的命令。其他命令行当然不应该受到影响。
$ ls <Return>
→ run ls
$ <Return>
→ run my aliased command
答案1
不确定你的意思,但是zsh
:
accept-line() {: "${BUFFER:="my-aliased-command"}"; zle ".$WIDGET"}
zle -N accept-line
按下Enter空缓冲区就会运行my-aliased-command
这就是将accept-line
小部件重新定义为函数。在zle
(zsh 行编辑器)小部件中,$BUFFER
包含到目前为止的命令行内容。因此,在这里我们将其设置为my-aliased-command
之前为空,然后运行内置小accept-line
部件 ( .accept-line
)。
请注意,这意味着my-aliased-command
将添加到命令历史记录中。
如果您不想这样做,另一种方法可能是:
accept-line() {
if [[ -z $BUFFER ]]; then
zle -I
my-aliased-command
else
zle ".$WIDGET"
fi
}
zle -N accept-line
如果$BUFFER
为空,则使提示无效(如果命令没有输出,则无需执行此操作)并运行my-aliased-command
.accept-line
否则运行内置函数。
答案2
这在 bash 4 中是可能的,但比在 zsh 中。您需要定义一个函数来测试命令行是否为空;命令行位于变量中READLINE_LINE
。使用此函数在空行中插入所需的命令比安排静默运行命令更容易。运行此函数后,注入一个键序列,该序列绑定到Return;的默认映射。 Ctrl+J通常是同义词。未经测试的代码。
insert_default_command_if_empty () {
if [[ -z $READLINE_LINE ]]; then READLINE_LINE='ls -l'; fi
}
bind '"\e[z1~": insert_default_command_if_empty'
bind '"\C-m": "\e[z1~\C-j"'