如何以互動方式在bash中輸入n個數字的重複
我想執行命令
foo --bar=baz <16 zeroes>
如何有效地鍵入 16 個零*?如果我按住
Alt
它1
6
0
會重複下一件事 160 次,這不是我想要的。在 emacs 中,我可以使用or ,但在 bash 中會殺死目前鍵入的行,下一個零只是在該行中添加一個 0。Alt-$$ number $$``Ctrl-u
1
6
Ctrl-u
0``Ctrl-u
如果我做
foo --bar=baz $(printf '0%.0s' {1..16})
然後
history
完全顯示上述內容,而不是foo --bar=baz 0000000000000000
; 即 bash 的行為不像我想要的那樣。(編輯$(...)
:重點是,我想在不使用命令替換的情況下輸入一些零)(*)我猜“有效”的技術定義是“使用 O(log n) 擊鍵”,最好是擊鍵次數等於 16 中的位數(對於所有 16 的值)加上一個常數;根據這個定義,emacs 範例是有效的。
嘗試
迴聲Alt+1Alt+6Ctrl+V0
這是 6 次擊鍵(假設至少是美國/英國 QWERTY 鍵盤)插入這 16 個零(您可以同時按住
Alt
1 和 6)。您還可以使用標準
vi
模式 (set -o vi
) 並鍵入:迴聲 0 Escx16p
(也是 6 次擊鍵)。
emacs
等效模式和可用於重複多個單個字元 ( )的模式適用於,但不適用於.echo 0
Ctrl+WAlt+1
Alt+6Ctrl+Y```zsh
bash`所有這些也將與
zsh
(以及tcsh
來自哪裡)一起使用。使用zsh
,您還可以使用填充變數擴展標誌並使用 擴展它們Tab
:迴聲 ${(l:16::0:)}Tab
(顯然更多的擊鍵)。
With
bash
,您也可以bash
擴展您的$(printf '0%.0s' {1..16})
withCtrl+Alt+E
。請注意,儘管它會擴展線上上的所有內容(但不是 glob)。要玩最少擊鍵次數的遊戲,您可以將擴展
<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 次擊鍵)以 36
g
為底。16
現在我們可以進一步將其減少為插入這 16 個零的一個鍵,儘管那是作弊。我們可以綁定
F2
到兩個0
s(或兩個$STRING
,預設為 0),F3
到 30
s,F1``F6
到 160
s…最多 19…當您可以定義任意小元件時,可能性是無窮無盡的。也許我應該提一下,如果您按住該
0
鍵,只需一次擊鍵即可插入任意數量的零 :-)