Saya ingin menjalankan perintah
foo --bar=baz <16 zeroes>
Bagaimana cara saya mengetik 16 nol secara efisien *? Jika saya memegang Altdan menekannya 1 6 0akan mengulangi hal berikutnya 160 kali, yang bukan yang saya inginkan. Dalam emacs saya bisa menggunakan Alt-[number]atau Ctrl-u 1 6 Ctrl-u 0, tetapi dalam bash Ctrl-umembunuh baris yang sedang diketik dan nol berikutnya hanya menambahkan 0 ke baris.
Jika aku melakukan
foo --bar=baz $(printf '0%.0s' {1..16})
Kemudian history
menunjukkan persis di atas, dan tidak foo --bar=baz 0000000000000000
; yaitu bash tidak berperilaku seperti yang saya inginkan. ( Sunting : maksudnya, saya ingin memasukkan beberapa angka nol tanpa menggunakan $(...)
substitusi perintah)
(*) Saya kira definisi teknis "efisien" adalah "dengan O (log n) penekanan tombol", lebih disukai sejumlah penekanan tombol yang sama dengan jumlah digit dalam 16 (untuk semua nilai 16) ditambah mungkin konstanta; contoh emacs memenuhi syarat sebagai efisien dengan definisi ini.
sumber
know what you want to do
. Dalam perintah bertingkat yang kompleks, bagaimana bash akan tahu bagian mana yang ingin Anda lihat hasil eksekusi dalam sejarah sebagai lawan dari perintah itu sendiri? Bagaimana dengan variabel? Singkatnya bash selalu akan memilikicode
dalam sejarah, bukan hasil dari mengeksekusi kode.Alt
dengan sendirinya tidak mengirim karakter apa pun, jadi menekan dan melepaskan alt tidak akan memiliki efek sejauhbash
yang bersangkutan.history
adalah bahwa saya ingin memasukkan angka tanpa menggunakan substitusi perintah.Jawaban:
Mencoba
Itu 6 stroke kunci (dengan asumsi keyboard QWERTY AS / Inggris setidaknya) untuk memasukkan 16 angka nol (Anda bisa tahan Altuntuk 1 dan 6).
Anda juga bisa menggunakan
vi
mode standar (set -o vi
) dan mengetik:(juga 6 stroke kunci).
The
emacs
modus setara dan yang dapat digunakan untuk mengulang lebih dari satu karakter ( ) bekerja dalam , tetapi tidak dalam .echo 0Ctrl+WAlt+1Alt+6Ctrl+Y
zsh
bash
Semua itu juga akan bekerja dengan
zsh
(dan daritcsh
mana asalnya). Denganzsh
, Anda juga bisa menggunakan flag ekspansi variabel padding dan memperluasnya dengan Tab:(Lebih banyak penekanan tombol jelas).
Dengan
bash
, Anda juga dapatbash
memperluas$(printf '0%.0s' {1..16})
dengan Ctrl+Alt+E. Perhatikan bahwa itu akan memperluas segala sesuatu (bukan gumpalan) di telepon.Untuk memainkan gim dengan pukulan tombol paling sedikit, Anda dapat mengikat beberapa tombol dengan widget yang meluas
<some-number>X
hinggaX
berkali-<some-number>
kali. Dan ada<some-number>
di base 36 untuk lebih mengurangi itu.Dengan
zsh
(terikat pada F8):Lalu, untuk 16 nol, Anda mengetik:
(3 keystrokes) di mana
g
adalah16
dalam basis 36.Sekarang kita bisa menguranginya menjadi satu kunci yang menyisipkan 16 angka nol itu, meskipun itu akan curang. Kita dapat mengikat F2dua
0
s (atau dua$STRING
, 0 secara default), F3menjadi 30
s, F1F6hingga 160
s ... hingga 19 ... kemungkinan tidak ada habisnya ketika Anda dapat menentukan widget acak.Mungkin saya harus menyebutkan bahwa jika Anda menekan dan menahan 0tombol, Anda dapat memasukkan angka nol sebanyak yang Anda inginkan hanya dengan satu penekanan tombol :-)
sumber
vi
dan lainnya!Menganggap emulator terminal Anda tidak memakan keystroke (misalnya, untuk berganti tab) - dataran xterm berfungsi - Anda dapat menekan Alt-1 6 Ctrl-V 0. Kontrol-V diperlukan di sana untuk memecah nomor dan karakter untuk mengulangi (jika Anda mengulangi surat, Anda tidak akan membutuhkannya).
(Ini adalah fitur readline yang dikenal sebagai
digit-argument
, jadi Anda harus dapat menggunakanbind
untuk mengubah kunci pengubah yang terlibat)sumber
Di Emacs, saya biasanya menggunakan C-quntuk memisahkan argumen awalan dari input digit.
Bash menggunakan Ctrl+valih-alih C-q, untuk menghindari masalah dengan kontrol aliran XON / XOFF.
Jadi bisa digunakan Alt+1 Alt+6 Ctrl+v 0.
sumber
Pilihan lain adalah mengetik empat nol dan kemudian menggunakan mouse untuk menyalin dan menempelkannya tiga kali lagi. klik dua kali untuk memilih, klik tengah x 3 untuk menempel.
sumber
Bermain dengan makro:
Ikat tombol fungsi F8untuk mengalikan dua kata terakhir (naik spasi sebelumnya) (kode kunci F8 ditemukan dengan menggunakan
Ctrl-V F8
):Itu bisa dibuat permanen dengan mengirim teks yang sama ke
~/.inputrc
lalu ketik:
untuk mendapatkan 2 ^ 4 kali nol. (masih 5 penekanan tombol).
atau ketik:
untuk mendapatkan 2 ^ 3 kata buku.
Masih lebih cepat:
Kalikan dengan 4:
3 penekanan tombol.
Kalikan dengan 8 (angka yang sama dengan tombol fungsi)
Masih 3 penekanan tombol.
Curang?
Cheat dengan mengalikan 16.
Hanya 2 penekanan tombol. (dan masih fungsi sederhana yang bermanfaat)
^^^^^^^^^^^^^^^^ (basis 36? Hah!) :-P
Kecurangan polos:
Hanya 1 (ya: satu ) keystroke.
Mengubah pengikatan untuk ctrl+U:
Kirim ini ke
~/.inputrc
:Baca ulang
~/.inputrc
file:lakukan seperti biasa di emacs (seperti yang kamu inginkan):
7 tombol (setelah "pengaturan").
Sedikit lebih pendek:
Gunakan "kalikan dengan 4" dari "argumen universal" dan akhiri dengan
Hanya 5 kunci.
Menggunakan alt+nakses ke (arg: n)
Itu 6 kunci untuk mendapatkan 16 angka nol.
Tidak mengubah pintasan keyboard apa pun:
Jika di bash Anda, Anda miliki
bash C-u kills the currently-being-typed line
.Itu karena
"\C-u":
terikatunix-line-discard
.Tapi itu mungkin juga membantu:
Kapan, apa yang sebelum kursor dihapus, itu juga ditempatkan di "cincin bunuh".
Jadi
ctrl+u
menghapus danctrl+y
menarik kembali apa yang terhapus.Pada garis yang bersih: Ketik
00
hapus dan tarik kembali dua kali untuk membuatnya0000
.Ulangi untuk mendapatkan
00000000
(8 nol), akhirnya ketik perintah dan tarik kembali dua kali.Set pertama (7 tombol terus ctrlditekan):
Set kedua (5 tombol)
Itu akan mendapatkan delapan nol di cincin hapus, lalu ketik apa yang Anda inginkan:
mendapatkan:
Setelah Anda mendapatkan ide, Anda juga bisa, ketik apa yang Anda butuhkan, pergi ke awal baris ( ctrl-Y), lakukan seperti di atas (hingga delapan nol) pergi ke akhir ( ctrl-E) dan mencabut dua kali.
Itu 15 kunci (di samping perintah itu sendiri).
Tidak pendek, saya tahu, tetapi itu hanya bekerja dengan apa yang tersedia.
Ini sedikit lebih pendek:
Itu 11 kunci
sumber
F<n>
menduplikasi waktu kata terakhir<n>
.^[[19~
). Lihat"$(tput kf8)"
untuk mendapatkan informasi dari basis data terminfo (atau$terminfo
hash dalamzsh
).ctrl-v F8
Sebagai variasi dari jawaban cas , ketikkan
dan kemudian gunakan mouse untuk menyalin dan menempelnya (satu kali). Bisa dibilang, ini O (log n), tetapi karena itu (len (str (n)) + 20), Anda mungkin menganggapnya tidak efisien. Tapi perhatikan:%.s
tampaknya berperilaku sama seperti%.0s
.0000000000000000
sebagai argumen, Anda hanya perlu melakukan ini sekali.glenn jackman menunjukkan bahwa (di mana angka adalah bilangan bulat positif) akan mencetak string angka nol (dan baris baru), sebagaimana tanda bintang dalam format memberi tahu untuk mengambil lebar bidang dari argumen. Secara khusus, akan mencetak 16 nol. Tetapi ini adalah kasus khusus yang hanya menangani . akan mencetak , dan akan mencetak dan pesan kesalahan. Sebaliknya, perintah lain dalam jawaban ini akan menghasilkan string seperti atau (dan lihat di bawah untuk ).
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%...
Jika Anda akan melakukan ini secara rutin, Anda dapat merampingkannya dengan mendefinisikan fungsi shell:
Catatan:
$(seq 1 "$2")
alih-alih(1.."$2"}
karena yang terakhir tidak akan berfungsi - lihat ini , ini , ini , dan ini . Perhatikan bahwa beberapa jawaban untuk pertanyaan itu menyarankan untuk digunakaneval
, tetapi ini umumnya tidak disarankan.$1%.0s
) harus dalam tanda kutip ganda (bukan tanda kutip tunggal) karena mengandung parameter ($1
).--
adalah untuk melindungi$1
nilai-nilai dimulai dengan-
."%.0s$1"
bukan"$1%.0s"
.$1
nilai yang mengandung%
akan membuatnya tersedak.Jika Anda harus dapat menangani
$1
nilai yang mengandung%
, lakukanJuga, setelah Anda memiliki fungsi yang didefinisikan, Anda dapat melakukan hal-hal seperti
yang sedikit mengetik kurang dari
"$(printf '0%.0s' {1..16})"
.sumber
printf "%0*d" 16 0
akan mencetak 16 nol. Tanda bintang dalam format akan mengambil lebar bidang dari argumen