Bash

如何以互動方式在bash中輸入n個數字的重複

  • October 11, 2016

我想執行命令

foo --bar=baz <16 zeroes>

如何有效地鍵入 16 個零*?如果我按住Alt1 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 個零(您可以同時按住Alt1 和 6)。

您還可以使用標準vi模式 ( set -o vi) 並鍵入:

迴聲 0 Escx16p

(也是 6 次擊鍵)。

emacs等效模式和可用於重複多個單個字元 ( )的模式適用於,但不適用於.echo 0Ctrl+WAlt+1Alt+6Ctrl+Y```zshbash`

所有這些也將與zsh(以及tcsh來自哪裡)一起使用。使用zsh,您還可以使用填充變數擴展標誌並使用 擴展它們Tab

迴聲 ${(l:16::0:)}Tab

(顯然更多的擊鍵)。

With bash,您也可以bash擴展您的$(printf '0%.0s' {1..16})with Ctrl+Alt+E。請注意,儘管它會擴展線上上的所有內容(但不是 glob)。

要玩最少擊鍵次數的遊戲,您可以將擴展<some-number>XX重複<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 次擊鍵)以 36g為底。16

現在我們可以進一步將其減少為插入這 16 個零的一個鍵,儘管那是作弊。我們可以綁定F2到兩個0s(或兩個$STRING,預設為 0),F3到 3 0s,F1``F6到 16 0s…最多 19…當您可以定義任意小元件時,可能性是無窮無盡的。

也許我應該提一下,如果您按住該0鍵,只需一次擊鍵即可插入任意數量的零 :-)

引用自:https://unix.stackexchange.com/questions/315456