Cara menghapus binding ke kunci awalan ESC

9

Saya ingin menggunakan ESCkunci, bukan C-guntuk keyboard-quit. Pendekatan naif saya untuk hanya melakukan

(define-key global-map (kbd "ESC") 'keyboard-quit)

tidak bekerja. ESCmasih merupakan kunci awalan dan menekannya tidak memanggil keyboard-quit.

Geier
sumber
1
Anda mungkin tertarik dengan utas terkait ini - Saya menggunakan solusi itu selama sekitar satu tahun sampai saya terbiasa dengan Cg dan ESC-ESC-ESC: Cara menggunakan <escape> (syarat) sebagai kunci pengubah stackoverflow.com/a/20036348/ 2112489 Jawaban oleh Stefan di utas terkait adalah konsep yang sama yang digunakan oleh universal-argumentdengan universal-argument-map.
hukum

Jawaban:

8

Anda bisa melakukannya (define-key key-translation-map (kbd "ESC") (kbd "C-g")). Saya melakukan hal yang sama sejak lama dan tidak memiliki masalah.

Edit untuk meningkatkan jawaban sesuai dengan komentar:

Jika Anda ingin menjaga ESCfungsionalitas utama, Anda dapat melakukannya

(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))

Satu hal yang perlu diperhatikan adalah bahwa jika Emacs hang Anda masih harus menggunakan C-gkunci untuk beberapa alasan, tetapi itu jarang terjadi.

clemera
sumber
1
@EmacsUser Bahkan jika saya tidak pernah menekan ESC saat menggunakan emacs?
Geier
1
@EmacsUser: Jadi? Sampai sekarang, saya tidak pernah menekan ESC sekali, apalagi dua atau tiga kali. Saya tidak akan melewatkannya.
Geier
2
@EmacsUser Saya tidak mengatakan bahwa ini adalah jawaban yang benar dan saya ingin menggunakannya, saya hanya ingin mengerti apa yang salah dengannya. Keseluruhan "di masa depan, Anda tidak akan dapat menekan ESC dua kali" tidak mempengaruhi saya sama sekali. Jika Anda memberi tahu saya dalam kondisi apa saya mungkin berada dalam lingkaran tanpa batas dengan ini dan mengapa, itu akan sangat mendalam.
Geier
1
@ Geier Saya menggunakan pemetaan ulang ini untuk waktu yang lama dan tidak pernah mengalami masalah dengannya. Satu-satunya hal adalah bahwa jika emacs hang Anda harus menekan C-guntuk melepasnya, ESCremapping tidak berfungsi dalam kasus ini.
clemera
1
@EmacsUser Saya tidak pernah menggunakan case untuk ESCjadi ini tidak mengganggu saya. Tetapi jika Anda membutuhkannya, Anda dapat melakukan terjemahan lain, misalnya(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))
clemera
8

Saran saya adalah pergi ESCsendiri, karena itu adalah kunci khusus.

Secara default, Emacs menggunakan ESC(ASCII 27) sebagai meta-prefix-key. Dari Manual Elisp:

'esc-map' adalah keymap global untuk kunci awalan. Dengan demikian, definisi global semua karakter meta sebenarnya ditemukan di sini. Peta ini juga merupakan definisi fungsi 'awalan ESC'.

dan

Sebagai gantinya, karakter meta dianggap untuk keperluan pencarian kunci sebagai urutan dua karakter, yang pertama adalah ESC (atau apa pun yang saat ini nilai 'meta-prefix-char'). Dengan demikian, kunci 'M-a' secara internal direpresentasikan sebagai 'ESC a', dan pengikatan globalnya ditemukan pada slot untuk 'a' di 'esc-map'.

Jadi untuk menggunakan ESC untuk sesuatu yang lain, Anda perlu mengatur meta-pefix-keyke sesuatu yang lain, dan juga mengikat beberapa kunci lainnya ESC-prefix. Mungkin ada perubahan lain yang diperlukan juga - Saya belum pernah mencoba ini.

Untuk lebih lanjut tentang meta-prefix-char, lihat Fungsi untuk Pencarian Kunci di manual Elisp.

glukas
sumber
1
+1. Jangan tidak menghapus pengikatan ESC. Ikat kunci lain untuk keyboard-quit, jika Anda mau. Dan sadarilah bahwa ESC ESC ESCsudah memberi Anda perilaku melarikan diri yang Anda inginkan - lihat manual Emacs, simpul Berhenti .
Drew
2
Mengatur meta-prefix-charke nilpada OSX tidak akan menonaktifkannya dari menjadi kunci awalan - itu hanya akan memisahkannya dari kunci meta. Pada OSX dengan versi grafis Emacs, saya ingin memisahkan kunci dari meta key - saya atur (setq meta-prefix-char nil)pada awal inisialisasi saya sehingga semua perpustakaan yang dimuat kemudian mengerti apa yang saya inginkan. Ini memberi saya kemampuan untuk menggunakan kunci meta sebagai kunci awalan, dan tombol melarikan diri sebagai kunci awalan. Ini esc-mapdidefinisikan pada level kode sumber-C di dalam keymap.c. Ini dimaksudkan untuk digunakan sebagai kunci awalan.
lawlist
@lawlist Menarik - jadi, apakah Anda kemudian memetakan meta menjadi esc-mapawalan untuk mempertahankan standar M-binding?
glukas
Saya pikir ini adalah pengaturan yang relevan pada OSX:, (setq ns-alternate-modifier 'meta)yang menjadikan meta tombol alt kiri pada keyboard Apple. Saya suka menggunakan tombol alt kanan untuk membuat karakter unicode menggunakan pengaturan default OSX: (setq ns-right-alternate-modifier 'none)- untuk memasukkan karakter Spanyol, simbol paragraf, dll. Ketika membangun --with-ns, baik tombol alt kiri dan kanan diatur ke meta. Pengaturan default mengikat kunci escape ke kunci meta pada OSX menggunakan meta-prefix-char, yang 27seperti yang Anda nyatakan.
hukum
5
Gunakan emacs, kata mereka. Itu bisa diperluas, kata mereka. Anda tidak harus menyesuaikannya, itu menyesuaikan diri Anda, kata mereka. Artinya, itu hanya menyesuaikan untuk Anda jika Anda ingin keluar dari situasi dengan menekan ESC tiga kali. Karena seseorang di masa lalu berpikir bahwa ESC adalah kunci yang tidak pernah terdengar (hanya ada di sudut kiri atas setiap keyboard) sehingga ia lebih baik mengikatnya dengan kunci Meta :-(.
Geier
1

Jawaban yang indah di sini: https://superuser.com/a/945245/624661

Mengutip:

Anda dapat menggunakan ini di file init Emacs Anda:

;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)
Ole
sumber
0

Anda ingin mengikat [escape], bukan (kbd "ESC"), seperti ikatan yang dirujuk oleh Ole menunjukkan. Dalam persediaan, ini hanya akan berfungsi jika emacs bingkai dalam sistem jendela. Saya pikir ini perlu sedikit penjelasan.

(kdb "ESC")berarti sebenarnya karakter kontrol ASCII ESC, dan seperti yang disebutkan oleh glucas , Anda tentu tidak ingin memetakan yang ini. Tetapi Escbukan ASCII ESC: itu adalah simbol escape, setidaknya dalam lingkungan grafis. Bagaimana bisa terjadi pengikatan yang (kbd "ESC")memengaruhi Esc? Ini terjadi karena emacs menerjemahkan escapeke ESC jika tidak ada ikatan yang tersedia untukescape . Jenis mundur jika Anda inginkan (yang dilaksanakan dengan cara local-function-key-mapjika Anda tertarik pada hal-hal seperti itu).

Dengan demikian, ketika Anda mengikat [escape], Anda aman dan tidak perlu khawatir ESC; terlepas dari binding Anda sendiri, Anda hanya perlu menambah keymap yang mengatakan ESCkapan mereka maksud [escape].

Hmm ... yah, hampir. Mengapa peta ini tidak digunakan [escape]pertama kali? Karena ini tidak akan berfungsi di terminal. Jika Anda ingin Escpekerjaan Anda pada perangkat seperti itu, Anda harus memiliki paling tidak untuk menyesuaikan terminal Anda sebelumnya.

Kisah terminal dilaporkan di pos lain: Bagaimana cara mengikat C- [nyata? . Yang harus Anda lakukan adalah memberi tahu terminal untuk mengirim beberapa urutan khusus ketika Escditekan, lalu memetakan urutan ini [escape]pada tahap input awal di emacs (the input-decode-map).

Semoga ini membantu.

Champignac
sumber