明显作弊:

明显作弊:

我想运行命令

foo --bar=baz <16 zeroes>

如何高效地输入 16 个零*?如果我按住Alt并按下1 6 0它将重复下一件事 160 次,这不是我想要的。在 emacs 中我可以使用Alt-[number]or Ctrl-u 1 6 Ctrl-u 0,但在 bash 中Ctrl-u会杀死当前正在键入的行,而下一个零只会在该行中添加一个 0 。

如果我做

foo --bar=baz $(printf '0%.0s' {1..16})

然后history正好显示上面的内容,而不是foo --bar=baz 0000000000000000;即 bash 的行为不符合我想要的方式。 (编辑:重点是,我想输入一定数量的零而不使用$(...)命令替换)

(*) 我猜“高效”的技术定义是“O(log n) 次击键”,最好击键次数等于 16 中的位数(对于 16 的所有值)加上一个常数;根据这个定义,emacs 示例是高效的。

答案1

尝试

回声Alt+1Alt+6Ctrl+V0

需要按 6 次按键(至少假设是美国/英国 QWERTY 键盘)来插入这 16 个零(您可以Alt同时保留 1 和 6)。

您还可以使用标准vi模式 ( set -o vi) 并输入:

回声Esc0x16p

(也是 6 个击键)。

模式emacs等效 和 that 可用于重复多个单个字符 ( ) 在 中有效,但在 中无效。echo 0Ctrl+WAlt+1Alt+6Ctrl+Yzshbash

所有这些也将与zsh(以及tcsh来自哪里)一起工作。使用zsh,您还可以使用填充变量扩展标志并使用 扩展它们Tab

回声 ${(l:16::0:)}Tab

(显然有更多的击键)。

有了bash,你还可以bash扩展你的$(printf '0%.0s' {1..16})有了Ctrl+Alt+E。但请注意,它会扩展线路上的所有内容(尽管不是全局变量)。

要玩最少击键次数的游戏,您可以将一个可扩展至重复次数的小部件绑定到<some-number>X某个X<some-number>。并<some-number>以 36 为基数,进一步减少它。

zsh(绑定到F8):

repeat-string() {
  REPLY=
  repeat $1 REPLY+=$2
}
expand-repeat() {
  emulate -L zsh
  set -o rematchpcre
  local match mbegin mend MATCH MBEGIN MEND REPLY
  if [[ $LBUFFER =~ '^(.*?)([[:alnum:]]+)(.)$' ]]; then
    repeat-string $((36#$match[2])) $match[3]
    LBUFFER=$match[1]$REPLY
  else
    return 1
  fi
}
zle -N expand-repeat
bindkey "$terminfo[kf8]" expand-repeat

然后,对于 16 个零,您输入:

回声g0F8

(3 次击键)其中 的基数g1636。

现在我们可以进一步将其简化为一个插入这 16 个零的键,尽管这可能是作弊行为。我们可以绑定F2到两个0(或两个$STRING,默认为 0)、F330个、F1F6160个……最多 19 个……当您可以定义任意小部件时,可能性是无限的。

也许我应该提一下,如果您按住该0键,只需按一次键即可插入任意多个零:-)

答案2

假设您的终端仿真器不占用击键(例如,切换选项卡)——普通的 xterm 可以工作——您可以按Alt-1 6 Ctrl-V 0。那里需要 control-V 来分解要重复的数字和字符(如果您重复一个字母,则不需要它)。

(这是一个名为 的 readline 功能digit-argument,因此您应该能够使用它bind来更改所涉及的修饰键)

答案3

在 Emacs 中,我通常使用C-q将前缀参数与数字输入分开。

Bash 使用,Ctrl+v代替C-q, 以避免 XON/XOFF 流量控制出现问题。

所以你可以使用Alt+1 Alt+6 Ctrl+v 0.

答案4

使用宏:

绑定功能键F8最后乘以2单词(上一个空格)(使用 找到的 F8 键代码Ctrl-V F8):

$ bind '"\e[19~": "\C-w\C-y\C-y"'

通过将相同的文本发送至~/.inputrc

$ echo '"\e[19~": "\C-w\C-y\C-y"' >> ~/.inputrc

然后输入:

回声0F8F8F8F8

得到零的 2^4 倍。 (仍然是 5 次击键)。

或输入:

回声书F8F8F8

获得 2^3 本书单词。

速度更快:

乘以 4:

$ bind '"\e[19~": "\C-w\C-y\C-y\C-w\C-y\C-y"'

回声0F8F8

3 按键。

乘以8(与功能键相同的数字)

$ bind '"\e[19~": "\C-w\C-y\C-y\C-w\C-y\C-y\C-w\C-y\C-y"'

回声00F8

还是3个按键。

欺骗?

乘以 16 作弊。

$ bind '"\e[19~": "\C-w\C-y\C-y\C-w\C-y\C-y\C-w\C-y\C-y\C-w\C-y\C-y"'

回声0F8

只有 2 个按键。 (仍然是一个有用的简单功能)

^^^^^^^^^^^^^^^^^(基数 36?哈!):-P

明显作弊:

$ bind '"\e[19~": "0000000000000000"'

回声F8

只有 1 个(是的:)击键。



更改绑定ctrl+U

将此发送至~/.inputrc

echo '"\C-u": universal-argument >> ~/.inputrc

重新读取~/.inputrc文件:

ctrl+Xctrl+R

按照 emacs 中的惯例进行操作(如您所愿):

foo --bar=baz ctrl+U16 ctrl+U0

7 个按键(在“设置”之后)。

稍微短一点:

使用“universal-argument”的默认“乘以4”并以结尾

 ctrl+V0

foo --bar=baz ctrl+Uctrl+Uctrl+V0

只有5把钥匙。

使用alt+n(arg: n) 的访问

foo --bar=baz Alt+16Ctrl+V0

这是 6 个键来获得 16 个零。

不更改任何键盘快捷键:

如果你的 bash 中有bash C-u kills the currently-being-typed line.
那是因为"\C-u":是 绑定到unix-line-discard.

但这也可能有帮助:
当光标之前的内容被删除时,它也会被放置在“kill-ring”中。

因此,ctrl+u擦除并ctrl+y拉回被擦除的内容。
在一条干净的线上:输入“ 00erase it”并将其拉回两次以使其成为0000
重复得到00000000(8个零),最后输入命令并回拉两次。

第一组(7个键按住ctrl):

00ctrl+Uctrl+Yctrl+Y ctrl+U 

第二组(5把)

ctrl+Uctrl+Yctrl+Y ctrl+U 

这将在擦除环中得到八个零,然后输入你想要的内容:

foo--bar=bazctrl-Y ctrl-Y 

要得到:

foo --bar=baz 0000000000000000

当你明白了这个想法后,你也可以输入你需要的内容,转到行首 (ctrl-Y​​ ),按照上面的操作(最多八个零)转到末尾 ( ctrl-E) 并猛拉两次。

foo --bar=baz ctrl-A00ctrl-Uctrl-Yctrl-Y ctrl-Uctrl-Yctrl-Y ctrl-U ctrl-Ectrl-Yctrl-Y

那是 15 个键(除了命令本身)。
我知道,并不短,但这仅适用于可用的情况。

这有点短:

0000 ctrl-U ctrl-Y ctrl-Y ctrl-Y ctrl-Yctrl-A foo --bar=baz

那是11个键

相关内容