调用 bind -x 命令后刷新 bash 提示符

Refreshing bash prompt after calling bind -x command

我有一个 bash 函数可以更改当前 bash 会话的目录。我想通过按 Alt-M 调用该函数,并使用 bind -x 创建此映射。在我的键盘上输入 Alt-M 后,在我的 bash 提示符中没有任何反应 - 没有换行符,如果键入一个函数然后按 Enter 键就会有换行符。我必须再次按 Enter 才能在新行上获得新提示。

如何强制在新行上出现新提示?如果我调用函数 directly/normally(即通过键入 foo 然后按回车键),该命令将按预期工作并且将在新行上出现 bash 提示,并刷新PS1.

在函数中使用 echoprintf 命令不起作用 - 它打印一个新行,但在 bash 提示符和 bash 提示符之上不刷新。这里到底发生了什么我不想发生的事情?

foo(){
    dir="/some/path"
    cd $dir
}

bind -x '"\em": foo'

如果您使用宏而不是 shell 函数,您可以注入 return 按键:

bind '"\em": "\C-ex\C-u foo\C-m\C-y\C-b\C-d"'
  • \C-e 移动到行尾
  • x 追加内容以确保行不为空
  • \C-u删除行保存在kill ring
  • foo 是命令 - 前导 space 阻止它被添加到历史记录中(假设 HISTCONTROL=ignorespace
  • \C-m 注入 return 按键
  • \C-y恢复原行
  • \C-b\C-d 删除我们添加的无关 x

如果光标不在行尾,我不知道如何将光标移回原来的位置。杀伤环也被污染了。