Saya ingin Control-i
berkinerja indent-region
(pada dasarnya karena Xcode sudah membangun memori otot itu).
Saya menyadari itu Control-i
dan tab
tidak bisa dibedakan dalam pengertian Ascii, tetapi mereka berada dalam pengertian kode kunci.
Saya sudah mencoba yang jelas:
(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)
sia-sia - menekan Control-i
masih hanya melakukan apa pun yang dilakukan tab
kunci dalam konteks saat ini. Apakah ada yang bisa saya lakukan untuk membantu Emacs memperlakukan tombol tab secara berbeda Control-i
?
Pembaruan: Saya kira hasil yang setara akan dicapai dengan mampu memetakan kembali apa yang dilakukan oleh tab
/ Control-i
pers ketika suatu wilayah dipilih.
Jawaban:
Saya tidak berpikir bahwa ini dapat dicapai dari terminal, tetapi dalam mode GUI Anda dapat mencoba ini:
Saya melakukan hal yang sama
C-m
sehingga dapat dibedakanRET
EDIT:
Berikut ini akan berfungsi apakah Anda dalam mode GUI atau TTY:
Itu tidak cantik, tetapi tampaknya melakukan pekerjaan itu. Saya menerima penyempurnaan atau pengeditan untuk kode ini sebagaimana diperlukan.
sumber
<C-i>
dan[C-i]
bisa menjadi pengidentifikasi yang sewenang-wenang, seperti<foobar>
dan[foobar]
, dan itu masih akan berfungsi; hanya saja jangan menyebutnyatab
ataubackspace
Bingkai GUI
Dalam frame GUI (apakah X11, Windows, OSX, ...), Emacs membaca Tabkunci sebagai tombol
tab
fungsi. Namun, karena Tabkunci pada terminal secara tradisional mengirimkan karakter^I
( Control + I), Emacs menerjemahkantab
kunci fungsi ke dalam karakter Control + I (karakter 9), yang ditampilkan sebagaiTAB
. Terjemahan ini dilakukan melaluifunction-key-map
.Terjemahan serupa terjadi dengan beberapa tombol fungsi lainnya. ( Backspacedan Deletemerupakan kasus pelik yang tidak akan saya bahas secara rinci di sini.)
Jika Anda ingin memisahkan Tabdari Ctrl+ Isama sekali, hapus ikatan dari
function-key-map
:Namun hal ini tidak terlalu berguna, karena entri dalam
function-key-map
ditimpa oleh binding di keymap modus-tertentu atau dalam peta global. Jadi, jika Anda ingin mendefinisikan pengikatan yang berbeda untuktab
, lakukan saja (di Elisp, tidak secara interaktif, karena prompt membaca kunci menerapkanfunction-key-map
terjemahan sehingga Anda akhirnya akan memutuskan untuk membatalkanTAB
dan tidaktab
):Semua mode standar yang memodifikasi aksi Tabkunci melakukannya dengan memodifikasi
TAB
kunci, yang merupakan nama panggilan untukC-i
karakter yang dihasilkan oleh kombinasi tombol Ctrl+ I. Jika Anda ingin binding standar untuk diterapkantab
daripadaC-i
, biarkanfunction-key-map
dan mode keymaps saja, dan alih-alih mengarahkan Ctrl+ Ike kunci yang berbeda.Sekarang Emacs akan melaporkan Ctrl+ Isebagai “
<control-i>
(diterjemahkan dariTAB
)”. Ini tidak cantik, tetapi tidak dapat dihindari: pencetakan karakter 9 yang cantikTAB
dimasukkan ke dalam kode sumber Emacs.Bingkai terminal
Dalam bingkai terminal, masalahnya lebih sulit dan seringkali tidak mungkin. Terminal tidak mengirimkan kunci, mereka mengirimkan karakter (lebih tepatnya, mereka mengirimkan byte). The Tabkey ditransmisikan sebagai karakter tab - yang merupakan Control + I, sama seperti apa kombinasi tombol Ctrl+ Imenghasilkan. Tombol fungsi yang tidak memiliki karakter yang sesuai (seperti tombol kursor) ditransmisikan sebagai urutan melarikan diri, yaitu urutan karakter dimulai dengan
ESC
= Control + [(itulah sebabnya Emacs mendefinisikan escapesebagai kunci awalan -ESC
harus menjadi awalan). Lihat Bagaimana cara kerja input keyboard dan output teks? untuk latar belakang lebih lanjut.Ada beberapa terminal yang dapat dikonfigurasi untuk mengirim urutan tombol yang berbeda untuk tombol fungsi, tetapi tidak banyak. Kedua LeoNerd ini libtermkey / libtickit dan xterm Thomas Dickey ini (sejak versi 216) mendukung ini. Di Xterm, fitur ini opsional dan diaktifkan melalui
modifyOtherKeys
sumber daya. Namun, saya tidak tahu adanya emulator terminal populer selain xterm yang mendukung ini, khususnya banyak emulator yang dibangun di atas libvte . Beberapa emulator terminal memungkinkan Anda melakukan ini secara manual melalui korespondensi yang ditentukan pengguna dari gantungan kunci untuk menghindari urutan.Mekanisme ini memungkinkan banyak kombinasi tombol untuk dibedakan, bukan hanya tab / Ci, return / Cm dan escape / C- [. Lihat Masalah dengan ikatan kunci saat menggunakan terminal untuk deskripsi yang lebih rinci.
Fitur xterm dasar didukung sejak Emacs 24.4. Namun dasar-dasar (khususnya Tab, Return, Escape, Backspace) masih mengirim karakter kontrol tradisional, karena ini aplikasi apa harapkan. Ada mode di mana Ctrl+ lettermengirim urutan pelarian alih-alih karakter kontrol. Jadi untuk membedakan tombol fungsi dari Ctrlkombinasi pada Emacs 24.4, modifikasi dukungannya untuk
modifyOtherKeys
menggunakan mode ini dengan mengatur sumber daya ke 2 alih-alih 1.sumber