映射返回,没有其他输入到别名

映射返回,没有其他输入到别名

我想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"'

相关内容