按下组合键后,终端/tty 中出现的“(arg: 1)”是什么?

gun*_*ert 27 command-line bash shortcut-keys

在虚拟终端中,我(不小心)按了Win+1并得到了一个新行,其中包含

(arg: 1)
Run Code Online (Sandbox Code Playgroud)

只要我一直Win按下,我按下的所有数字都会附加到括号中的数字,例如Winand 1+ 4yields (arg:14)

当我(释放Win)按任意键时,该字符将打印多少次,数字读取次数和(arg: ...)表达式被标准提示替换。

有人知道这里发生了什么吗?

des*_*ert 32

这是一个数字参数,readline 库的一个功能内置于bash

digit-argument (M-0, M-1, ..., M--)
    Add  this digit to the argument already accumulating, or start a
    new argument. M-- starts a negative argument.
Run Code Online (Sandbox Code Playgroud)

此功能使在当前编辑的命令行中添加或删除文本变得更简单。假设你想写echo gggg

  1. 输入echo后跟空格
  2. 按 Meta 键(可能是Win,Alt和/或Esc适合您)并键入4g

但是,您多久需要多次键入一个字母,这样才能节省任何东西?该功能主要是为 readline命令设计的,请参阅参考手册的第 8.2.1-8.2.3 章(“C”表示Ctrl,“M”表示 Meta)。

您可以使用 Meta 和 向后移动一个单词B,但是如果您想一次向后移动多个单词怎么办?您可以按住Alt并按B多次,也可以使用 digit 参数:

  1. 你的命令行有一个错字,后面五个字:

    $ echo one two tree four five six seven?
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按 Meta 键,键入5并按 Meta 和B。中提琴:

    $ echo one two ?ree four five six seven
    
    Run Code Online (Sandbox Code Playgroud)
  3. 修正拼写错误,然后按Enter拍摄或EndCtrl+E再次移动到行尾。

您可以通过按 Meta 和 删除单个单词Backspace,但是如果您想一次删除多个单词怎么办?

  1. 你在命令行上忘记了一个词:

    $ echo one two four five six seven?
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按 Meta 键,键入4并按 Meta 和Backspace

    $ echo one two ?
    
    Run Code Online (Sandbox Code Playgroud)
  3. 输入缺失的单词,后跟空格,然后按Ctrl+Y粘贴刚刚删除的内容。中提琴:

    $ echo one two three four five six seven?
    
    Run Code Online (Sandbox Code Playgroud)

你是对的,你也可以像刚才解释的那样移动到那里而不删除任何东西。我们在 Linux 上,总是有几种方法可以做同样的事情。

什么是“否定论点”?它的作用相同,但方向相反,因此 Meta -2MetaBackspace删除命令行的下两个单词。“但人们可以使用 Meta 1MetaD来做同样的事情!” 很高兴你明白了,欢迎使用你的命令行。

进一步阅读:

  • 哇!我很高兴给了你这么好的答案的诱因!! (2认同)
  • 巧妙的是数字参数也可以在类似 vi 的编辑模式(`set -o vi`)中使用,_mutatis mutandis_。 (2认同)