我想运行命令
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+Y
zsh
bash
所有这些也将与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 次击键)其中 的基数g
为16
36。
现在我们可以进一步将其简化为一个插入这 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
拉回被擦除的内容。
在一条干净的线上:输入“ 00
erase 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个键