Bagaimana cara mengulang parameter yang saat ini diketik di bash console?

23

Saya hanya mengetik sesuatu di sepanjang baris:

mv foo/bar/poit/zoid/narf.txt

dan tiba-tiba menyadari, sial, aku harus mengetik sebagian besar parameter itu lagi

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

Bahkan dengan penyelesaian tab, cukup menyakitkan. Saya tahu saya dapat menyalin tempel parameter dengan memilih mouse teks dan middleclick tapi itu tidak cukup baik. Saya ingin tetap menggunakan keyboard.

Jadi apakah ada cara untuk menyalin tempel parameter saat ini dari garis menggunakan keyboard?

k0pernikus
sumber
3
Saran saya tidak menjawab pertanyaan Anda, tetapi tip kecil. Seperti pada contoh Anda, Anda dapat menggunakan konstruksi berikutnya: mv foo/bar/poit/zoid/{narf.txt,troz.txt}alih-alih mengetik atau menyalin alamat panjang dua kali.
buru
2
Sedikit lebih pendek dari @ solusi Rusli: mv foo/bar/poit/zoid/{narf,troz}.txt. Ini bekerja sangat baik jika kita memiliki sesuatu seperti.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann
@Rush Apakah Anda keberatan menunjukkannya sebagai jawaban? Mungkin tidak secara langsung apa yang saya minta, tetapi sekali lagi, solusi Anda jauh lebih ke titik yang saya inginkan. Itu layak menerima tanda terima.
k0pernikus

Jawaban:

15

Jika saya sudah merencanakan ke depan, saya menggunakan ekspansi brace . Pada kasus ini:

mv foo/bar/poit/zoid/{narf,troz}.txt

Berikut adalah pendekatan lain menggunakan readlinepintasan keyboard default :

  • mv foo/bar/poit/soid/narf.txt: mulai
  • Ctrl- w: unix-word-ruboutuntuk menghapusfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, ruang, yanklagi untuk mendapatkanmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-worddua kali untuk menghapus yang terakhirnarf.txt
  • troz.txt: ketikkan bagian ekor yang berbeda

Jika Anda menghabiskan waktu non-sepele menggunakan bashshell, saya akan merekomendasikan secara berkala membaca daftar cara pintas default dan memilih beberapa yang tampaknya berguna untuk dipelajari dan dimasukkan ke dalam rutinitas Anda. Bab 8 bashmanual ini adalah tempat yang baik untuk memulai. Mengetahui cara pintas dapat benar-benar meningkatkan efisiensi Anda.

jw013
sumber
Rapi! Dalam kasus saya, saya harus menekan Alt + Backspace daripada Meta + Backspace.
k0pernikus
3
@ k0pernikus Ya pada sebagian besar keyboard, tombol Alt adalah kunci Meta.
jw013
1
Untuk menyimpan mengetik ulang .txt, Anda bisa menekan Ctrl + Kiri (atau pintasan lain yang memanggil backward-word), lalu Kiri satu karakter, lalu Alt + Backspace dan ketik troz.
wjandrea
24

Ekspansi sejarah sebenarnya bekerja pada perintah saat ini juga, menggunakan event designator !#. Gabungkan ini dengan kata designator untuk argumen terakhir - $- untuk mendapatkan parameter yang baru saja Anda ketik. Dan Anda dapat menggunakan semua pengubah reguler di atasnya, jadi jika, misalnya, Anda mengganti nama file di direktori yang jauh, Anda cukup mengetik:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
sumber
Sangat berguna! Ini bekerja sangat baik dengan magic-spaceopsi bash di inputrc untuk secara otomatis memperluas ekspansi sejarah. (Saya tidak bisa menggunakan jawaban terpilih karena saya telah menetapkan ^ W untuk memecah karena biasanya lebih bermanfaat.)
Soren Bjornstad
@SorenBjornstad alt+backspacebiasanya sudah berhenti di pembatas kata seperti garis miring, jadi Anda tidak perlu mengubah cara ^Wmendapatkan fungsionalitas itu, Anda dapat menghapus kata-kata yang dipisahkan dengan non-kata-karakter atau spasi-spasi
Eric Renouf
14

Seperti dalam contoh Anda, Anda dapat menggunakan konstruksi berikutnya:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

atau bahkan (seperti yang disarankan Ansgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

bukannya mengetik atau menyalin alamat panjang dua kali.

buru-buru
sumber
2
Ini disebut ekspansi brace .
CodeGnome
6

Bermain-main saya berhasil ini:

mv foo/bar/poit/zoid/narf.txt

Tekan Enter
untuk menyimpan parameter terakhir.

Sekarang gunakan untuk mendapatkan yang terakhir diketik dalam antrean. Masukkan spasi dan untuk menggunakan parameter yang terakhir digunakan:

Alt + .

Saya benci memprovokasi kesalahan, tapi itu menyelesaikan pekerjaan dalam use case ini.

k0pernikus
sumber
Keren, tip bagus lainnya yang dipelajari!
Bram
<kbd> Esc </kbd> + <kbd>. </kbd> sama dengan <kbd> Alt </kbd> + <kbd>. </kbd>.
Nikos Alexandris
2

Anda dapat dengan mudah menggunakan variabel:

a=test.csv ; cp $a $a.bak

Atau di kasus Anda (kompetisi tab catatan bekerja untuk sebuah bagian):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
ppp
sumber
2

Saya memiliki ini di ~/.inputrc:

"\ej":"!#:$\e^"

!#adalah baris saat ini, :$adalah kata terakhir, dan \e^adalah history-expand-line.

nisetama
sumber
ini harus ditandai sebagai jawabannya. Menekan 'alt / option + j' sekarang menyalin kata terakhir.
mpprdev
2

Sebab zsh, saya menemukan keybindings berikut bermanfaat.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Jadi saya menekan Alt- Muntuk mengulangi argumen terakhir Alt- Kjika saya ingin menghapus bagian dari ujung jalan.

Berikut ini adalah referensi yang berguna untuk beberapa perilaku yang dapat Anda petakan.

bdellaterra
sumber
2

Solusi dua langkah interaktif pendek

  1. mengetik: echo foo/bar/poit/zoid/narf.txt

    Hal ini membuat foo/bar/poit/zoid/narf.txttersedia untuk Alt- .shortcut di bash.

  2. ketik: mvdan hit Alt- ., Space, Alt-.

    Anda akan mendapatkannya mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Sekarang Anda dapat memodifikasi kata terakhir dengan mudah.

Komandan Tengah Malam

Alat ini yang mungkin (sangat) berguna adalah pengelola file yang berjalan di konsol. Ini memberi Anda kemungkinan untuk menyalin nama file dan jalur direktori secara interaktif ke dalam baris perintah. Midnight Commander menunjukkan kepada Anda karena itu 2 panel (kiri dan kanan), yang berisi daftar isi dari direktori yang berbeda.

Panduan singkat:

  • Up/ Downtombol panah pilih file di panel saat ini.
  • Tab beralih antara panel kiri dan kanan.
  • Ctrl- Shift- Entermenyalin file yang saat ini dipilih ke baris perintah (termasuk jalur lengkap)
  • Alt- omembuka direktori yang saat ini dipilih di panel lain
  • Ctrl- omemungkinkan Anda melihat konsol dalam layar penuh
  • Ctrl- x, pmenyalin jalur panel aktif ke konsol
  • Ctrl- x, Ctrl- pmenyalin jalur panel tidak aktif ke konsol
  • Esc- Tabadalah penyelesaian otomatis

Sejauh ini, ini adalah cara tercepat yang saya temukan - setelah saya terbiasa dengan jalan pintas.

Markus Dutschke
sumber
0

Gunakan hal yang sama di {,} "duplikator". Yaitu:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
Pylinux
sumber