如何关闭 bash 的 "readline arguments" 字符重复?

How to turn off bash's "readline arguments" for character repetition?

在bash shell, you can type M-<number> <key>, where M is the meta key, in order to repeat that <key> press <number> times。例如,键入 M-6 a 会将 aaaaaa 置于您的命令行中。

在我的电脑上,meta 映射到 Esc 键。这意味着 Esc 然后 6 的击键被解释为 M-6,并使终端期望另一个字符重复:

(arg: 6)

这对我来说是有问题的。我在 macOS 上使用 iTerm2,它有一个很棒的小功能,当您开始使用以前的命令历史输入命令时,它会弹出一个自动完成 window。例如,如果您使用 Mercurial 并键入 hg update,它可以让您从所有以前的书签中 select 并提交您过去更新过的散列,按最频繁排序。

当我使用 Esc 关闭此 window 时,问题就来了。例如,如果我开始输入 hg update ,然后自动完成 window 出现,然后我 不小心 不止一次点击转义,然后粘贴像 6dd0e54 一样提交哈希,我在命令行中实际得到的是这样的:

$ hg update ddddddd0e54

为什么?因为第一次按下 Esc 键取消了自动完成 window,第二次按下 M- 组合键,然后粘贴散列中的 6d 被解释为 "repeat the d character 6 times."

这真让人恼火,尤其是在处理像 787075d 这样有问题的提交哈希时:在这种情况下,它将 字面上 放置近 80 万 d 个字符进入我的终端,使其无法使用。

所以知道我从不使用这些 readline 重复参数除非是偶然,有没有办法关闭这个功能,最好是在 bash 中,但也可以在 iTerm2 中?

运行

bind -p | grep '"\e1"'

returns

"\e1": digit-argument

因此,只需删除 bind -rdigit-argument 的所有绑定:

for i in - {0..9} ; do
    bind -r '\e'$i
done

- 也绑定到 digit-argument,以允许否定参数。