Apakah ada terminal linux yang dapat menangani semua kombinasi tombol?

11

Saya suka menggunakan emacs dalam mode terminal ( -nw), tetapi sepertinya sebagian besar (semua?) Terminal tidak dapat menangani beberapa kombinasi tombol - misalnya, C-<RET>atau C-M-%. Saya tahu ini karena sebagian besar terminal meniru VT-100, yang tidak memiliki kombinasi ini. Apakah ada terminal linux (lebih disukai KDE) yang dapat menangani kombinasi tombol ini, atau apakah ini merupakan batasan mendasar dari semua terminal?

Yossarian
sumber

Jawaban:

15

Ketika Anda menekan tombol atau kombinasi tombol di terminal, itu dikirim ke aplikasi yang berjalan di terminal sebagai urutan satu atau lebih karakter. Misalnya, ketika Anda menekan a, aplikasi menerima a. Ketika Anda menekan Enter, aplikasi menerima karakter CR(alias ^M(diucapkan "control-emm"), alias nomor 13, alias \ratau \015). Kombinasi kunci yang terlibat Altbiasanya ditransmisikan sebagai karakter ESC( ^[alias \eatau atau \033) diikuti oleh urutan untuk kombinasi tombol atau kunci tanpa Alt. Tombol fungsi dan kombinasi tombol lainnya dikirimkan sebagai urutan keluar yang dimulai dengan \e[atau \eO.

Urutan lolos tidak sepenuhnya standar, dan terminal biasanya mengabaikan atribut tertentu untuk kunci tertentu. Sebagai contoh, Ctrl+ Shift+ lettersering dikirimkan persis seperti Ctrl+ lettersecara default.

Anda dapat melihat apa yang dikirim terminal Anda untuk kombinasi tombol dengan menekan Ctrl+ Vdiikuti oleh kombinasi tombol tersebut di prompt shell, atau C-qatau C-h cdiikuti oleh kombinasi tombol di Emacs.

Dengan beberapa emulator terminal, Anda dapat mengonfigurasi urutan pelepasan untuk setiap tombol. Pada Xterm, ini dilakukan melalui sumber X . Sebagian besar pengaturan membaca sumber daya dari ~/.Xresourcessaat X dimulai, dan Anda dapat memuat file secara manual xrdb -merge ~/.Xresources.

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")

Sebuah konvensi umum menggunakan urutan melarikan diri dari formulir ESC [ number1 ; number2 ~untuk tombol fungsi dengan pengubah. number1menunjukkan tombol fungsi ( 15untuk 24untuk F5ke F12- untuk alasan historis, F1 melalui F4memiliki escape sequence yang berbeda) dan number2menunjukkan modifikator ( 2untuk Shift, 3untuk Meta, 5untuk Ctrl, 7untuk Ctrl+ Meta, dan menambahkan 1 untuk Shiftdengan setidaknya satu dari Ctrlatau Meta).

Emacs menerjemahkan urutan pelarian ke dalam representasi kunci internal melalui input-decode-mapataulocal-function-key-map (atau function-key-mapsebelum Emacs 23).

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jadi, jika saya memahami ini dengan benar, saya harus terlebih dahulu menentukan urutan escape di terminal saya yang sesuai dengan beberapa kombinasi tombol. Kemudian, di emacs, saya perlu memetakan urutan pelarian kembali ke kombinasi tombol. Dapatkah urutan melarikan diri menjadi sewenang-wenang, asalkan tidak bertentangan dengan yang ditentukan dalam infocmp $TERM?
Yossarian
2
@Yossarian Ya. Selain tidak bertentangan, urutan melarikan diri harus jelas, yaitu tidak ada urutan melarikan diri harus menjadi awalan dari yang lain. Ini berarti dalam praktiknya bahwa karakter pertama harus ESC(kecuali jika Anda ingin mencoba beberapa karakter ≥128, tetapi itu akan membatasi kemungkinan penyandian input) dan karakter kedua harus menjadi sesuatu yang Anda tidak ingin ESC foomengikat.
Gilles 'SO- stop being evil'
Saya baru saja mencoba mencoba apa yang Anda sarankan. Haruskah local-set-keydemikian define-key? Yang pertama memberikan kesalahan (jumlah argumen yang salah), sementara yang terakhir berfungsi, setidaknya untuk <kbd> C-Enter </kbd>. Tampaknya konsole masih mengalami masalah dalam mengirim <kbd> CM-% </kbd>.
Yossarian
@Yossarian Memang, seharusnya begitu define-key. Saya tidak tahu apakah kunci pelarian Konsole dapat dikonfigurasi, xterm mungkin lebih dapat disesuaikan daripada alternatif lainnya.
Gilles 'SO- berhenti bersikap jahat'
1
Perhatikan bahwa xterm Thomas Dickey sedang dalam pengembangan aktif. Dengan XTerm*modifyOtherKeys: 2sumber daya itu akan menghasilkan urutan unik bahkan untuk C-M-kombinasi, tetapi dengan pengaturan itu Anda harus memberikan banyak pemetaan khusus ( XTerm*modifyOtherKeys: 1kurang mampu tetapi jauh lebih fungsional di luar kotak). Untuk contoh (meskipun satu yang tidak bekerja untuk saya) melihat xterm-extras.elperpustakaan dan terkait .Xresourcesdan .inputrcfile dalam easymacs -download.
phils
1

Untuk rangkaian kunci yang terbatas namun signifikan, dengan asumsi konsole KDE, orang dapat melakukan hal berikut untuk membuat ikatan kunci yang kompleks dan bekerja di emacs -nw:

Saya akan menggunakan implementasi saya untuk mulai S-<RET>bekerja sebagai contoh:

  1. Buka konsole baru, buka pengaturan -> profil saat ini -> keyboard -> edit
  2. Tekan Tambah dan buat entri baru untuk Return+Shiftdan berikan urutan kunci yang berguna (saya memilih \E[27;3yang saya pikir adalah urutan kunci yang dikirim oleh X ketika saya mencari-cari dengan xev, tapi itu mungkin salah - yang penting untuk dilakukan adalah membuat yakin bahwa ia memiliki jalan keluar yang tepat dan tidak bertentangan dengan hal lain).
  3. Mainkan dengan itu di area tes kecil di bagian bawah untuk memastikan itu berfungsi.
  4. Mulai kembali konsole.
  5. Mulai emacs -nwdan di evaluasi buffer awal:

    (read-key-sequence-vector "Type your new key:")

    lalu ketik kombinasi tombol baru Anda.

    • Jika Anda tidak terbiasa dengan ini, tulis garis keluar, tinggalkan kursor di akhir baris, dan tekan Cx Ce untuk mendapatkan emacs untuk menjalankan garis itu, itu harus mengatakan kepada Anda apa pun yang Anda masukkan ke dalam tanda kutip dan menunggu Anda untuk ketik sesuatu.
  6. Itu harus memuntahkan urutan kunci yang dapat Anda ikat.
    (Ia kembali [27 91 50 55 59 51]kepada saya sebagai lawan dari membosankan lama [13]sebelum saya mengacaukan dengan pengikat tombol konsole.)

  7. Tambahkan ke konfigurasi emacs Anda:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Saya mengujinya emacs -nwdalam sesi layar menggunakan:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    
Ashton Trey Belew
sumber
0

Jawaban singkatnya adalah itu adalah batasan mendasar dari semua terminal.

Jawaban yang sedikit lebih lama adalah bahwa bahkan jika seseorang menciptakan terminal yang melakukan apa yang Anda inginkan, Emacs sendiri akan memerlukan perubahan besar untuk bekerja dengan terminal hipotetis ini.

hruvulum
sumber
Itu poin bagus tentang emacs, itu bahkan tidak terpikir olehku. Saya kira saya akan mulai menggunakan gui saja.
Yossarian
Itu yang saya lakukan.
hruvulum
0

Ada beberapa upaya memperluas protokol VT dengan cara memungkinkan input keyboard lossless (di antara fitur-fitur lain, seperti grafik).

Salah satu contohnya notty: https://github.com/withoutboats/notty

Vladimir Panteleev
sumber