ubah tombol pintas bash seperti Ctrl-C?

21

Saya menggunakan Kubuntu 10.04. Saya ingin mengubah beberapa tombol pintas standar untuk bash (terminal).

Berikut ini cara pintas yang ingin saya atur:

  • Ctrl- Cuntuk menyalin teks yang dipilih di terminal ke clipboard.

  • Ctrl- Vuntuk menempel dari clipboard ke terminal.

  • Ctrl- Zuntuk membatalkan pengeditan pada baris saat ini di terminal.

  • Ctrl- Shift- C(atau bahkan lebih baik, Super- C) untuk menghentikan perintah.

  • Ctrl- Shift- Z(atau Super- Z) menjadi perintah latar belakang.

  • Ctrl- Shift- V(atau Super- V) untuk menjadi perintah sisipan literal (atau apa pun Ctrl- zlakukan sebelumnya).

Bagaimana cara saya melakukan perubahan ini?

BTW, saya suka cara terminal bekerja pada OS X. Penggunaan tombol perintah membuat semua perintah salin / tempel sangat konsisten (tidak seperti banyak hal lain di OS X).

PS Saya membaca halaman bash man dan itu tidak membantu. Itu memberi saya ide, tetapi saya perlu contoh spesifik untuk kombinasi di atas. Terima kasih.

Paul
sumber
beberapa "pintasan" ini tidak dapat "diimplementasikan" dalam bash, tetapi harus dimasukkan ke terminal itu sendiri (xterm, gnome-terminal, konsole dll) .. misalnya "teks yang dipilih", "clipboard"
akira

Jawaban:

10

Itu bukan fitur bash, itu fitur driver terminal. Dengan demikian, mereka ditentukan oleh stty(1).

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Ignacio Vazquez-Abrams
sumber
5
BAIK. Terima kasih untuk petunjuknya. Sekarang, saya masih ingin mencapai tujuan saya. Dan saya juga tahu bahwa inputrc dapat memetakan kembali Ctrl-C. Tapi saya benar-benar tidak peduli bagaimana saya melakukannya, saya hanya ingin tahu bagaimana cara memetakan kembali cara pintas ini di terminal.
Paul
15
Inilah "ikan": stty intr \ ^ k (di mana perintah terminasi, sebelumnya Ctrl-C sekarang menjadi Ctrl-K, K dapat berupa kunci alfa apa pun) Tidak ada yang "memberi saya ikan itu". Saya bekerja keras untuk menemukannya sendiri. Jadi berkhotbah dengan amsal membuat Anda terlihat seperti orang brengsek, IMO.
Paul
Bagaimana Anda bisa memetakannya kembali ke Ctrl + Shift + C?
crypdick
8

Ini hampir sepenuhnya diselesaikan sekarang. Bagian dari solusi pertama kali dibawa ke perhatian saya oleh MTK358 di http://www.linuxquestions.org/questions/linux-software-2/change-bash-shortcut-keys-such-as-ctrl-c-818170/ . Dia menunjukkan fakta (agak jelas, sangat memalukan saya) bahwa tombol pintas salin dan tempel dapat dengan mudah diubah oleh pengaturan menu konsole. Setelah saya melihat ini, dibutuhkan sekitar 1 menit untuk mengatur Ctrl-C dan Ctrl-V untuk menyalin dan menempel dengan terminal.

Bagian lain dari solusi seharusnya sudah jelas dari halaman manual stty, tapi ternyata tidak (bagi saya). Saya akhirnya hanya bereksperimen berdasarkan berbagai petunjuk, seperti yang diposting di atas.

Saya memutuskan kunci non-numerik mana yang ingin saya ganti Ctrl-C sebagai perintah terminate. (Saya menggunakan "k"). Saya tidak pernah menemukan info tentang cara menyampaikan pengubah pergeseran ke stty, jadi saya menyerah. Dengan itu diputuskan, yang harus saya lakukan adalah memasukkan yang berikut pada baris perintah:

stty intr \ ^ k

Saya memverifikasi bahwa semuanya berfungsi seperti yang diinginkan.

Sekarang saya hanya perlu menempatkan perintah tunggal di atas (stty intr \ ^ k) dalam skrip startup. Saya tidak yakin yang mana yang "tepat". Saya ingin perubahan ini menjadi sistem yang luas dan permanen.

Adakah saran untuk skrip mana saya harus menempatkan perintah?

Dan akhirnya, untuk balasan khotbah, mereka tidak perlu dan tidak membantu.

Paul
sumber
Apakah Anda pernah menentukan apa skrip startup "benar" yang digunakan, atau cara yang lebih baik untuk melakukan ini? Saya berjuang dengan masalah yang sama (pertanyaan awal Anda). Tetapi sementara saya dapat membuat 'stty intr \ ^ k' mengikat ctrl-k, itu tidak mengikat ctrl-c dan tidak 'stty intr undef' maupun 'stty intr = ^ -' melakukannya, ctrl-c masih mengirimkan interupsi . Dan 'stty -a' tidak pernah menunjukkan perubahan yang telah saya buat.
EricS
4

Beberapa hal dapat diatur menggunakan mekanisme jalan pintas keyboard KDE yang normal. Di menu "Pengaturan" Konsole, klik "Konfigurasikan Pintasan", dan Anda akan mendapatkan dialog yang dapat Anda gunakan untuk mengubah ikatan kunci untuk fungsi-fungsi yang ditangani oleh KDE. Itu akan memungkinkan Anda untuk memetakan ulang Ctrl + C untuk menyalin dan Ctrl + V untuk menempel - tetapi perlu diingat bahwa setelah Anda melakukannya, urutan kunci tersebut tidak akan lagi diteruskan ke terminal, sehingga Anda tidak akan dapat menggunakan Ctrl + C untuk menghentikan suatu program, misalnya.

Fungsi-fungsi lain dikendalikan oleh readlineperpustakaan, yang dapat Anda konfigurasi dengan mengedit file ~/.inputrc. Untuk mendapatkan Ctrl + Z untuk mengembalikan pengeditan yang dilakukan pada baris saat ini, Anda ingin menambahkan

C-z: revert-line

tetapi urutan kunci itu mungkin sudah terperangkap oleh terminal, jadi Anda mungkin harus menggunakan sttyuntuk melepaskan ikatannya sebelum itu bekerja. Pertama mencari ^Zdi output stty -a(seperti yang ditunjukkan dalam jawaban Ignacio) dan kemudian, misalnya, jika muncul dalam susp = ^Z, jalankan

stty susp ^-

untuk melepaskan ikatan pemetaan kunci itu.

Perubahan lain yang Anda tanyakan harus dilakukan sttyseperti yang dikatakan Ignacio, karena itu adalah fungsi terminal, tapi saya tidak yakin persis bagaimana caranya. Masalahnya adalah saya tidak tahu apakah terminal mengenali Shift, atau jika benar, bagaimana menyampaikan informasi itu kepada stty.

David Z
sumber
3

Penggunaan emacsatau vimode Bash pada baris perintah. Tidak memiliki konsep "seleksi" atau "papan klip". Ini menggunakan hal-hal seperti "kill buffer" dan "point", "mark", "word", "line", "kill" dan "yank", dll.

Mencoba untuk memfungsikan fungsionalitas gaya GUI ke dalamnya akan membuat frustasi yang terbaik dan tidak akan berfungsi sepenuhnya. Anda harus mencoba menggabungkan fungsi stty, readlinedan terminal Anda (mungkin Terminal.appuntuk Anda). Anda akan perlu untuk remap fungsi seperti intr, susp, lnext, dll, sehingga Anda masih dapat menggunakan fitur mereka.

Saya sangat merekomendasikan terhadap modifikasi radikal tersebut. Itu tidak dirancang untuk melakukan apa yang Anda inginkan.

Ketika di Roma...

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Dave, untuk sistem yang berfungsi seperti OS X, mungkin saya sarankan Anda menggunakan OS X? Seperti yang mengisyaratkan Dennis, bahkan jika Anda bisa membuatnya bekerja, Anda akan cukup terpincang-pincang ketika Anda masuk sebagai apa pun kecuali Anda di komputer Anda sendiri.
msw 6-10
Saya tidak bisa menjamin perintah lain tetapi salin dan tempel masuk akal di jendela perintah dan sangat berguna. Saya menggunakannya terus-menerus untuk menyalin dan menempel di antara jendela lain dan konsol, dan telah melakukannya selama bertahun-tahun. Shift-Ctrl-C dan Shift-Ctrl-V bekerja dengan cara ini untuk Konsole di luar kotak. Dan meskipun saya telah melakukan ini setiap hari selama bertahun-tahun, saya pasti lupa dan menekan Ctrl-c di Konsole. Secara pribadi, saya siap untuk berhenti menerapkan pepatah "When in Rome" dan memetakannya agar berfungsi seperti SETIAP aplikasi lainnya yang ada.
EricS
1

Saya menjalankan Ubuntu dan mengubah cara pintas untuk Copy dari default Ctrl+ Shift+ Cuntuk lebih normal dan sederhana Ctrl+ C. Namun ini membuat saya mengalami masalah tidak bisa mengirim interrupt perintah ^ C .

Berkat @ Paul, saya menemukan menjalankan perintah

tty intr \^k

Akan memungkinkan saya untuk mengirim perintah interrupt menggunakan Ctrl+ K. Namun perintah ini perlu dijalankan setiap kali saya membuka terminal yang merepotkan (seperti yang dia sebutkan sendiri).

Dengan sedikit riset lebih lanjut (googling 😂) saya menemukan cara menjalankan perintah setiap kali terminal dibuka (di Ubuntu toh) .

Dengan demikian, akhirnya menjalankan perintah berikut (sekali) (di Ubuntu 18.04 dan kemungkinan lebih) akan memberikan perilaku yang diharapkan setiap saat.

echo $'# Make Ctrl+K interrupt command in terminal\nstty intr \^k\n' >> ~/.bashrc

Akhirnya, perlu disebutkan bahwa Anda tidak harus menggunakan Ktombol. Anda dapat menukar huruf k dalam semua perintah di atas dengan kunci huruf apa saja yang Anda pilih.

Wiggy Lindholm
sumber