Saya memiliki baris berikut di init.el
:
(global-set-key [(control \;)] 'comment-region)
Ini berfungsi sangat baik di jendela GUI, tetapi jika emacs
dipanggil dengan -nw
opsi maka C-;tidak berkomentar wilayah, hanya menyisipkan ;
karakter. M-x comment-region RETbekerja dengan baik.
Saya mencoba mengikuti jawaban ini pada masalah yang sama, tetapi C-q C-;kembali saja ;
dan saya jelas tidak ingin mengikat ;
.
Bagaimana cara mencapai efek yang diinginkan?
key-bindings
terminal
WeSenseASoulInSearchOfAnswers
sumber
sumber
C-;
kombo dan kemudian gunakanM-x view-lossage
untuk melihat apakah itu bahkan sampai ke Emacs.gnome-terminal
, danM-x view-lossage
mengembalikan:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
C-;
daripadac ;
(atau, setidaknya, saya dapatkanC-;
).Jawaban:
Pertama, masalah yang lebih umum: emulator terminal sering terbatas dalam urutan kontrol dan lolos yang dapat mereka kirim. Jadi: terminal mungkin menelan karakter khusus Anda sebelum mencapai Emacs. Sebagai diagnostik umum, Anda dapat menekan
C-h l
(atauM-x view-lossage
) untuk melihat apakah kombinasi kunci Anda membuatnya menjadi Emacs.Untuk diskusi lebih lanjut tentang masalah ini, lihat thread Stack Overflow ini dan tautan di dalamnya.
Untuk meringkas bolak-balik dalam komentar, masalah spesifik Anda menunjukkan itu terminal bukan Emacs yang menjadi masalah. Ketika Anda mencoba
C-;
dan kemudianM-x view-lossage
, Anda mendapatkannyablah blah blah c ; ESC v i e w - l o s s a g e RET
. Itu terlihat seperti masalah terminal: jika kombinasi kunci mencapai Emacs,c ;
bagian itu akan terlihat sepertiC-;
.sumber
Dalam Shift + Up tidak dikenali oleh Emacs di terminal saya menjelaskan bagaimana terminal menerjemahkan sebagian besar tombol fungsi ke dalam urutan escape, karena antarmuka antara aplikasi dan terminal mentransmisikan karakter (atau lebih tepatnya byte), bukan kunci. Hanya beberapa pengubah + kombinasi karakter yang memiliki karakternya sendiri:
@[\]^_
belokan menjadi byte 0–31 ( karakter kontrol ASCII ).Jadi, bagaimana dengan kombinasi lain seperti Ctrl+ ;atau Ctrl+ Shift+ letter? Karena tidak ada karakter yang sesuai, terminal harus menggunakan kembali karakter atau mengirim urutan pelarian. Banyak terminal mengabaikan pengubah ketika tidak ada karakter yang sesuai, sehingga Anda berakhir dengan Ctrl+ ;pengiriman
;
, Ctrl+ Shift+ lettersetara dengan Ctrl+ letter, dll.Vendor terminal terus melakukan hal sederhana untuk waktu yang lama. Tidak ada standar untuk sekuens melarikan diri, yang bersifat swadaya - vendor terminal tidak mengimplementasikannya, aplikasi tidak mendukungnya, pengguna tidak mengharapkannya. Beberapa emulator terminal dapat dikonfigurasikan untuk mengirim urutan pelarian yang sewenang-wenang, jadi jika Anda bisa, Anda dapat mengonfigurasinya dan mendeklarasikan urutan pelepasan ke Emacs (lebih lanjut tentang ini nanti).
Akhir-akhir ini, situasinya berubah, karena telah ada dua proposal untuk distandarisasi pada urutan pelarian. Salah satunya adalah libtermkey LeoNerd dengan sintaks . Lain adalah xterm Thomas Dickey dengan sintaks . Versi xterm saat ini (≥216) dapat dikonfigurasikan untuk sintaksis dengan mengatur sumber daya; fitur harus diaktifkan dengan menyetel ke nilai bukan nol.
ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Jika emulator terminal Anda tidak mendukung sintaks ini tetapi dapat dikonfigurasi, pilih salah satunya.
Sejak Emacs 24.4, Emacs secara otomatis menyalakan
modifyOtherKeys
fitur ketika mendeteksi bahwa terminal adalah versi xterm ≥216. Deteksi Emacs tentang urutan sekuensi untuk menyandikan kunci berfungsi melalui variabellocal-function-key-map
. Pada Emacs 24.4, tidak semua urutan pelarian didukung. Anda dapat menggunakan kode berikut dalam file init Anda untuk menyelesaikan pekerjaan.Jika
TERM
variabel lingkungan tidak disetel kexterm
atau varian seperti ituxterm-256color
, Emacs tidak akan mengaktifkan urutan itu. Jika Emacs sudah memiliki dukungan untuk nilaiTERM
Anda, Anda dapat menambahkan dukungan dengan mendefinisikan fungsi yang mirip dengan yang di atas, yang akan dieksekusi setelah memuat file Lisp yang namanya bernilaiTERM
. Jika Emacs tidak memiliki dukungan seperti itu, Anda dapat menambahkannya dengan membuat subdirektori yang dipanggilterm
di suatu tempat di Andaload-path
, dan membuat file Lisp yang disebut dengan nilai diterm/$TERM.el
mana , mendefinisikan fungsi yang disebut .$TERM
TERM
terminal-init-$TERM
Saat saya menulis, tampaknya beberapa emulator terminal selain xterm telah mengadopsi urutan pelarian ini. Pada OSX, Anda dapat mengkonfigurasi iTerm2 dengan memilih urutan keluar untuk setiap kombinasi tombol, satu per satu.
sumber
M-C-%
diakuiESC 5
modifyOtherKeys
fitur tidak aktif. Perhatikan bahwa itu hanya didukung dalam versi xterm yang cukup baru, dan itu hanya diaktifkan secara otomatis sejak Emacs 24.4. Saya tidak tahu apakah OSX dikirimkan dengan versi terbaru. Jika tidak, dan tidak berfungsi untuk Anda, saya sarankan Anda mengajukan pertanyaan baru. Sebutkan versi yang Anda gunakan.Jawaban Gilles menyatakan:
On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one.
Saya mengalami sedikit kesulitan untuk sampai ke sana, jadi di sini penjelasan terperinci jika Anda seperti saya, bingung.Jika, ketika menjalankan Emacs di terminal (mis., Terminal.app default Mac),
C-x C-;
tidak berjalancomment-line
, dan Anda ingin fungsi itu, maka Anda harus beralih ke iTerm2 (Terminal.app tidak memiliki kemampuan) dan membuat Pemetaan Kunci di bawah Profil ... Kunci sebagai berikut:Ini dilakukan dengan mengklik
+
tombol, yang memunculkan jendela kecil yang disebut "Pintasan Keyboard"; jendela ini awalnya memiliki dua bidang; bagian atas memiliki nilai "Klik untuk Mengatur" dan bagian bawah memiliki nilai "Abaikan." Klik tombol atas dan ketikC-;
. Ini mengatur kombinasi tombol yang akan menjalankan aksi dan kode. Klik bidang bawah, "Aksi", dan temukan dan klik "Kirim Escape Urutan", yang turun sedikit lebih dari setengah jalan. Setelah Anda mengklik itu, bidang ketiga akan muncul, yang disebut "Esc +". Di dalam bidang ini, ketik:Ini
59
adalah kode ASCII desimal koma, dan5
kode untukCtrl
. Lalu tekan "OK" untuk menyelesaikan. Kombo kunci yang benar ke urutan kunci sekarang akan dimasukkan dalam preferensi iTerm2. Ketika Anda memulai Emacs di iTerm, Anda sekarang akan memiliki akses keC-x C-;
fungsionalitas.sumber