Di Bash, bisakah saya menyalin argumen yang diketik terakhir ke posisi kursor?

6

Misalkan saya memiliki yang berikut di terminal saya:

> cp my_file_name originals/#

Dimana # mewakili kursor.

Apakah ada kombinasi tombol untuk disisipkan my_file_name ke posisi kursor, sehingga saya tidak perlu mengetik lagi? Saya sadar ALT + . untuk mendapatkan argumen terakhir dari perintah sebelumnya, tetapi saya ingin argumen sebelumnya dari perintah saat ini!

Rich
sumber
1
Mungkin saya melewatkan sesuatu, tetapi tidak cp myfile orginals/ melakukan hal yang sama persis seperti cp myfile originals/myfile?
frabjous
Anda memang benar - ini adalah contoh yang buruk, tetapi contoh sederhana dari apa yang saya inginkan :) Saya perlu melakukan hal yang sama dalam situasi di mana aslinya / tidak cukup jelas.
Rich
Saya juga berharap ada yang setara dengan Zsh copy-prev-shell-word :(
Sridhar-Sarnobat

Jawaban:

9

Salah satu cara melakukannya adalah menggunakan ekspansi brace :

cp {,originals/}my_file_name
mkarasek
sumber
+1. Hanya menghabiskan 5 menit mencoba file cp {, / orig}. lakukan! Terima kasih untuk memposting ini.
Sirex
11

Kamu bisa memakai Ctrl + W untuk memotong argumen dan menyimpannya di clipboard Anda, lalu Ctrl + Y untuk menempelkannya lagi:

cp my_file_name Ctrl  +  W   Ctrl  +  Y  asli /  Ctrl  +  Y 
dogbane
sumber
5

Penggunaan rumit, tetapi penyiapan lebih sederhana:

Anda dapat mengikat keystroke (saya akan menggunakan Ctrl - Q ) ke readline copy-backward-word berfungsi dan lakukan ini:

Alt - 2 Ctrl - Q Ctrl - y Ctrl - Alt - h

Itu berarti:

  • digit-argument copy-backward-word (salin dua kata sebelumnya)
  • yank (pasta)
  • backward-kill-word (singkirkan kata tambahan)

Untuk mengikat ketukan pada baris perintah:

bind '"\C-q": copy-backward-word'

atau tambahkan ini ke ~/.inputrc:

"\C-q": copy-backward-word

Penggunaan lebih sederhana, tetapi pengaturan lebih rumit:

Anda dapat membuat urutan penekanan tombol yang panjang menjadi makro yang dipicu oleh satu penekanan tombol (saya akan menggunakan Alt - q di sini dan memanfaatkan Ctrl - q mengikat dari atas):

Pada prompt shell:

bind '"\eq": "\e2\C-q\C-y\e\C-h"'

atau di ~/.inputrc:

"\eq": "\e2\C-q\C-y\e\C-h"

Ingat, Anda juga harus mengikat Ctrl - q seperti di atas.

Sekarang untuk menyalin kata sebelum yang sekarang yang perlu Anda tekan adalah Alt - q .

Dennis Williamson
sumber
1

Inilah cara lain, walaupun saya tidak yakin mengapa Anda ingin melakukan apa yang Anda coba lakukan, karena nama file tersirat dalam contoh perintah cp Anda (dan akan berfungsi seperti yang diharapkan).

> F=my_file_name && cp $F Workspace/$F

Ini dapat diperluas, juga, untuk mengubah nama file:

> F=my_file_name && cp $F Workspace/$F.new
Matt
sumber
Terima kasih. Saya sebenarnya perlu melakukan ini dalam situasi di mana penggunaan kedua nama file diperlukan sehingga pilihan saya menggunakan cp untuk pertanyaan itu adalah pilihan yang buruk.
Rich
1

Lakukan seperti ini:

    cp my_file_name originals/!#:1

! # adalah baris saat ini,: 1 adalah argumen pertama.

Aura
sumber
Wow, itu tip umum yang baik yang tidak pernah saya ketahui
Sridhar-Sarnobat
0

Anda bisa mencoba ini:

cp my_file_name Ctrl + W Ctrl + Y originals/ Ctrl + Y

Tapi itu tidak berhasil ketika Anda sudah berada di ujung garis. Mungkin sesuatu yang serupa mungkin berhasil. (dan dengan salinan, tidak dipotong)

Sunting: Coba Alt + B , Ctrl + W , Ctrl + Y , Akhir , Ctrl + Y - Sedikit solusi yang berantakan!

Sirex
sumber
0

Saya punya ini di saya ~/.inputrc:

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

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

nisetama
sumber