Bagaimana cara mengatur ikatan utama untuk mode dalam keadaan Jahat tertentu?

9

Saya memiliki satu set binding kunci yang saya gunakan untuk keduanya web-modedan php-modedalam mode insert (of Evil). Jadi saya tidak bisa menggunakan set-local-mapatau sesuatu. Karena dalam mode normal, tombol yang sama kemudian akan memanggil perintah lain. Jadi binding harus aktif evil-insert-state-mapsaja.

Saya memiliki yang berikut ini:

(eval-after-load 'php-mode
  '(progn
     (define-key evil-insert-state-map
       (kbd "C-<next>") (lambda () (interactive) (insert " = ")))
     (define-key evil-insert-state-map
       (kbd "C-<prior>") (lambda () (interactive) (insert "->")))))

(eval-after-load 'web-mode
  '(progn
     (define-key evil-insert-state-map
       (kbd "C-<next>") 'zencoding-expand-yas) 
     (define-key evil-insert-state-map
       (kbd "C-<prior>") 'zencoding-expand-line)))

Jadi setiap kali web-modeatau php-modesedang dimuat, binding kunci ini akan diaktifkan.

Masalahnya adalah: Misalkan saya memiliki dua buffer terbuka, satu di php-modedan yang lainnya di web-mode. Ketika web-modebuffer adalah buffer saat ini dan saya beralih ke buffer lain yang ada di dalam php-mode, web-modebinding masih aktif di dalam php-modebuffer.

Saya mencoba menyelesaikan masalah ini dengan menggunakan (add-hook 'web-mode-hook [...])dan (add-hook 'php-mode-hook [...])bukannya mengatur binding di eval-after-load. Tetapi solusi itu tidak berhasil dalam situasi ini.

Ada saran? Aku akan sangat menghargainya.

ReneFroger
sumber

Jawaban:

12

Evil memiliki evil-define-keymakro untuk mendefinisikan perintah untuk status tertentu hanya dalam keymap tertentu:

(evil-define-key 'insert emacs-lisp-mode-map (kbd "C-c C-c") 'butterfly
                                             (kbd "<pause>") 'zone)

Ia mampu menunda pelaksanaan pengikatan (dengan menggunakan eval-after-loaddirinya sendiri) dan juga dapat mengambil lebih dari satu pasangan kunci-perintah yang merupakan tambahan yang cukup bagus.

wasamasa
sumber
Solusi Anda berhasil, saya berterima kasih untuk itu. Tidak pernah tahu ada yang namanya kunci kejahatan-definisikan. Dan memang cukup bagus bahwa Anda dapat mengikat lebih banyak pasangan kunci perintah ke evil-define-key.
ReneFroger