Chciałbym uruchomić polecenie
foo --bar=baz <16 zeroes>
Jak efektywnie wpisać 16 zer *? Jeśli przytrzymam Alti wcisnę 1 6 0, powtórzy to 160 razy, co nie jest tym, czego chcę. W emacsie mogę użyć Alt-[number]albo Ctrl-u 1 6 Ctrl-u 0, ale w bash Ctrl-uzabija aktualnie pisaną linię, a następne zero po prostu dodaje 0 do linii.
Jeśli zrobię
foo --bar=baz $(printf '0%.0s' {1..16})
Następnie history
pokazuje dokładnie powyższe, a nie foo --bar=baz 0000000000000000
; tzn. bash nie zachowuje się tak, jak chcę. ( Edytuj : wskazując na to, że chcę wprowadzić pewną liczbę zer bez użycia $(...)
podstawiania poleceń)
(*) Wydaje mi się, że techniczną definicją „wydajnie” jest „z klawiszami O (log n)”, najlepiej liczbą klawiszy równą liczbie cyfr w 16 (dla wszystkich wartości 16) plus być może stałą; przykład emacsa kwalifikuje się jako wydajny na podstawie tej definicji.
źródło
know what you want to do
. W złożonym zagnieżdżonym poleceniu, skąd miałbyś wiedzieć, które części chcesz zobaczyć wynik wykonania w historii, a nie samo polecenie? Co ze zmiennymi? Krótko mówiąc, zawsze będzie to miało miejscecode
w historii, a nie wynik działania kodu.Alt
sam w sobie nie wysyła żadnej postaci, więc naciśnięcie i zwolnienie klawisza Alt nie będzie miało żadnego efektu, jeśli chodzi obash
to.history
to, że chciałbym wprowadzić cyfry bez zastępowania poleceń.Odpowiedzi:
Próbować
To 6 uderzeń klawisza (przy założeniu co najmniej klawiatury QWERTY w USA / Wielkiej Brytanii), aby wstawić te 16 zer (możesz przytrzymać Altzarówno dla 1, jak i 6).
Możesz także użyć
vi
trybu standardowego (set -o vi
) i wpisać:(także 6 klawiszy).
emacs
Równoważny sposób i które mogłyby być wykorzystane, aby powtórzyć więcej niż jednego znaku ( ) działa , ale nie w .echo 0Ctrl+WAlt+1Alt+6Ctrl+Y
zsh
bash
Wszystkie te będą również współpracować
zsh
(itcsh
skąd to pochodzi). Za pomocązsh
można również użyć dopełniających zmiennych zmiennych rozszerzania i rozwinąć je za pomocą Tab:(Oczywiście o wiele więcej naciśnięć klawiszy).
Za pomocą
bash
możesz takżebash
rozszerzyć swoją ofertę$(printf '0%.0s' {1..16})
o Ctrl+Alt+E. Zauważ jednak, że rozwinie on wszystko (nie globusy) na linii.Aby zagrać w grę z najmniejszą liczbą naciśnięć klawiszy, możesz powiązać z jednym klawiszem widżet, który rozwija się
<some-number>X
doX
powtarzanych<some-number>
czasów. I mieć<some-number>
w bazie 36, aby jeszcze bardziej ją zmniejszyć.Z
zsh
(związany z F8):Następnie dla 16 zer wpisujesz:
(3 klawiszy), w którym
g
znajduje się16
w podstawie 36.Teraz możemy jeszcze bardziej zredukować go do jednego klucza, który wstawia te 16 zer, choć byłoby to oszustwem. Możemy powiązać F2dwa
0
s (lub dwa$STRING
, domyślnie 0), F330
s, F1F6160
s ... do 19 ... możliwości są nieograniczone, kiedy można zdefiniować dowolne widżety.Może powinienem wspomnieć, że jeśli naciśniesz i przytrzymasz 0klawisz, możesz wstawić tyle zer, ile chcesz za jednym naciśnięciem klawisza :-)
źródło
vi
i innych!Zakładając, że emulator terminalu nie zjada naciśnięcia klawisza (np. Przełączanie kart) - działa xterm - możesz nacisnąć Alt-1 6 Ctrl-V 0. Kontrolne V jest tam potrzebne, aby rozbić liczbę i znak, aby powtórzyć (jeśli powtarzałeś literę, nie byłbyś potrzebny).
(Jest to funkcja readline znana jako
digit-argument
, więc powinieneś być w staniebind
zmienić zaangażowane klawisze modyfikujące)źródło
W Emacsie zwykle używałbym C-qdo oddzielenia argumentu przedrostka od wprowadzania cyfr.
Bash używa Ctrl+vzamiast C-q, aby uniknąć problemów z kontrolą przepływu XON / XOFF.
Więc możesz użyć Alt+1 Alt+6 Ctrl+v 0.
źródło
inną opcją jest wpisanie czterech zer, a następnie użycie myszy do skopiowania i wklejenia go jeszcze trzy razy. kliknij dwukrotnie, aby wybrać, kliknij środkowym przyciskiem x 3, aby wkleić.
źródło
Gra z makrami:
Powiąż klawisz funkcyjny, F8aby pomnożyć przez dwa ostatnie słowo (w górę poprzedniej spacji) (kod klawisza F8 można znaleźć za pomocą
Ctrl-V F8
):Można to zrobić na stałe, wysyłając ten sam tekst na adres
~/.inputrc
następnie wpisz:
aby otrzymać 2 ^ 4 razy zero. (wciąż 5 naciśnięć klawiszy).
lub wpisz:
uzyskać 2 ^ 3 słów książki.
Jeszcze szybciej:
Pomnóż przez 4:
3 naciśnięcie klawisza.
Pomnóż przez 8 (ten sam numer co klawisz funkcyjny)
Nadal 3 naciśnięcia klawiszy.
Oszukać?
Oszukiwać przez pomnożenie przez 16.
Tylko 2 naciśnięcia klawisza. (i wciąż przydatna prosta funkcja)
^^^^^^^^^^^^^^^^ (baza 36? Hah!) :-P
Zwykłe oszukiwanie:
Tylko 1 (tak: jeden ) naciśnięcie klawisza.
Zmiana powiązania dla ctrl+U:
Wyślij to do
~/.inputrc
:Ponownie przeczytaj
~/.inputrc
plik:rób to jak zwykle w emacsie (tak jak chciałeś):
7 klawiszy (po „ustawieniu”).
Nieco krótszy:
Użyj domyślnego „pomnóż przez 4” z „uniwersalnego argumentu” i zakończ z
Tylko 5 kluczy.
Korzystanie z alt+ndostępu do (arg: n)
To 6 kluczy, aby uzyskać 16 zer.
Nie zmienia żadnego skrótu klawiaturowego:
Jeśli masz w swoim bashu
bash C-u kills the currently-being-typed line
.To dlatego, że
"\C-u":
jest związany zunix-line-discard
.Ale to może również pomóc:
kiedy to, co jest przed usunięciem kursora, jest również umieszczane w „pierścieniu zabijania”.
Więc
ctrl+u
usuwa ictrl+y
odsuwa to, co zostało usunięte.Na czystej linii: wpisz,
00
skasuj i dwukrotnie pociągnij do tyłu, aby to zrobić0000
.Powtórz, aby uzyskać
00000000
(8 zer), w końcu wpisz polecenie i pociągnij dwa razy z powrotem.Pierwszy zestaw (7 klawiszy pozostaje ctrlwciśnięty):
Drugi zestaw (5 klawiszy)
Otrzymasz osiem zer w pierścieniu kasowania, a następnie wpisz, co chcesz:
uzyskać:
Gdy wpadniesz na pomysł, możesz również wpisać to, czego potrzebujesz, przejść do początku linii ( ctrl-Y), zrobić jak wyżej (do ośmiu zer), przejść do końca ( ctrl-E) i szarpnąć dwa razy.
To 15 klawiszy (oprócz samego polecenia).
Nie krótko, wiem, ale to działa tylko z tym, co było dostępne.
To jest trochę krótsze:
To 11 kluczy
źródło
F<n>
powtarzasz ostatnie słowo<n>
.^[[19~
). Zobacz,"$(tput kf8)"
aby uzyskać informacje z bazy danych terminfo (lub$terminfo
hash inzsh
).ctrl-v F8
Jako odmianę odpowiedzi cas wpisz
a następnie użyj myszy, aby skopiować i wkleić (raz). Prawdopodobnie jest to O (log n), ale ponieważ jest to (len (str (n)) + 20), możesz uznać to za nieefektywne. Ale uwaga:%.s
wydaje się zachowywać tak samo jak%.0s
.0000000000000000
jako argument, musisz to zrobić tylko raz.Glenn punkty Jackman odchodzący że (jeśli liczba jest dodatnia) drukuje ciąg ilość zer (i nowej linii), jak gwiazdka w formacie mówi do podjęcia szerokość pola z argumentów. W szczególności wydrukuje 16 zer. Ale jest to szczególny przypadek, który obsługuje tylko . wydrukuje i wydrukuje komunikat błędu. Natomiast inne polecenia w tej odpowiedzi będą generować ciągi takie jak lub (i patrz poniżej ).
printf "%0*d\n" number 0
printf
printf "%0*d" 16 0
0
printf "%0*d" 16 12345
0000000000012345
printf "%0*d" 16 foo
0000000000000000
123451234512345…
foofoofoo…
7%7%7%...
Jeśli zamierzasz to robić często, możesz to usprawnić poprzez zdefiniowanie funkcji powłoki:
Uwagi:
$(seq 1 "$2")
zamiast,(1.."$2"}
ponieważ to drugie nie będzie działać - zobacz to , to , to i to . Pamiętaj, że niektóre odpowiedzi na te pytania sugerują użycieeval
, ale generalnie nie jest to zalecane.$1%.0s
) musi być w cudzysłowach (a nie w pojedynczych cudzysłowach), ponieważ zawiera parametr ($1
).--
chronić przed$1
wartościami zaczynającymi się od-
."%.0s$1"
zamiast"$1%.0s"
.$1
wartość zawierająca%
spowoduje zadławienie.Jeśli potrzebujesz umieć obsługiwać
$1
wartości zawierające%
, zróbPo zdefiniowaniu takiej funkcji możesz także wykonywać takie czynności
który jest nieco mniej pisania niż
"$(printf '0%.0s' {1..16})"
.źródło
printf "%0*d" 16 0
wydrukuje 16 zer. Gwiazdka w formacie pobierze szerokość pola z argumentów