2012-05-13 14 views
35

Geçtiğimiz günlerde Emacs'i denedim ve Evil'i vim özel tutmaya yardımcı oldu. Normal modu, birçok Vimers gibi ekleme modundan döndürmek için "jj" yazıyordum, ancak Kötü modda nasıl yapılacağını bilmiyorum."jj" öğesini emacs Esc'de nasıl eşleştirin Kötü mod

böyle eşlemek ama doğru değil gibi görünüyor:

(define-key evil-insert-state-map (kbd "jj") 'evil-normal-state) 

cevap

20

Bu benim için çalışır.

;;Exit insert mode by pressing j and then j quickly 
(setq key-chord-two-keys-delay 0.5) 
(key-chord-define evil-insert-state-map "jj" 'evil-normal-state) 
(key-chord-mode 1) 

Yukarıda @phils tarafından answer ilham ve Simon's Coding Blog: Emacs and Unity Every Day dayanmaktadır: O KeyChord kütüphane gerektirir.

+0

, çalışmasını sağlamak için gecikmeyi belirtmek zorundaydı, teşekkürler – jarandaf

0

Biraz daha karışık - Bir önceki karakteri için izlemek zorunda. This should do the trick. ("jk" kelimesi, "jk" için daha kolay/daha hızlı olduğunu not etmesine rağmen "jj" için kolayca değiştirebilirsiniz).

+1

"kj" nin "jk" den daha iyi olduğunu buluyorum "jj" den daha iyidir :) – vijiboy

14

Bu blog gönderisini görün: http://zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/ ve "cofi" için arama yapın. Ben "kj" sürümünü kendim kullanıyorum ve sadece Vim gibi çalışıyor.

DÜZENLEME:

(define-key evil-insert-state-map "k" #'cofi/maybe-exit) 

(evil-define-command cofi/maybe-exit() 
    :repeat change 
    (interactive) 
    (let ((modified (buffer-modified-p))) 
    (insert "k") 
    (let ((evt (read-event (format "Insert %c to exit insert state" ?j) 
       nil 0.5))) 
     (cond 
     ((null evt) (message "")) 
     ((and (integerp evt) (char-equal evt ?j)) 
    (delete-char -1) 
    (set-buffer-modified-p modified) 
    (push 'escape unread-command-events)) 
     (t (setq unread-command-events (append unread-command-events 
          (list evt)))))))) 
+5

Hiçbir yalan, bu haritalama için beklediğimden daha kafa karıştırıcıydı. –

+0

@opert 'jk' yi kaçış tuşu olarak kullanmak istiyorum ancak yukarıdaki 'j' ve 'k' değişimlerini yaptıktan sonra artık 'k' giremiyorum (j olsun). Teşekkürler. – Tony

+0

@Tony Emin değilim. Bir çeşit kodlama sorunu varmış gibi geliyor. –

22

Ben Evil ile çalışır olmadığını biliyorum, ama Emacs için yok KeyChord kütüphane bu tür bir şey için tasarlanmıştır genelde: İşte blog yazısı gerçek kod parçacığı İşte .

Deneyin ve görüyor musunuz?

(key-chord-define evil-insert-state-map "jj" 'evil-normal-state) 
+2

Evet, işe yaradığını doğrulayabilirim. Kullandığım ve kabul edilen cevaptan daha sorunsuz çalıştığını düşünüyorum. –

+0

Güzel! Bir çekicilik gibi çalıştı! Kötülük modunun bu kütüphaneye bağlı olduğunu ve bu işlevselliği kötülüğe getirmesi gerektiğini söylüyorum çünkü vim nasıl davranıyor. – Nacht

0

Bu, aslında 'jf' kullanmamıza rağmen, bir süredir kullandığım kendi çözümüm.

(defun xwl-jj-as-esc() 
    (interactive) 
    (if (memq evil-state '(insert replace)) 
     (let ((changed? (buffer-modified-p))) 
      (insert "j") 
      (let* ((tm (current-time)) 
       (ch (read-key))) 
      (if (and (eq ch ?j) 
        (< (time-to-seconds (time-since tm)) 0.5)) 
       (save-excursion 
        (delete-char -1) 
        (evil-force-normal-state) 
        (set-buffer-modified-p changed?)) 
       (insert ch)))) 
    (call-interactively 'evil-next-line))) 

(define-key evil-insert-state-map "j" 'xwl-jj-as-esc) 
(define-key evil-replace-state-map "j" 'xwl-jj-as-esc) 
8

Eğer Spacemacs kullanıyorsanız o zaman sadece bir parçası olarak ekleyerek, benim pencereleri yükleme için

(setq-default evil-escape-key-sequence "jj")

+2

Bu aslında [kötü kaçış] (https://github.com/syl20bnr/evil-escape) paketinin bir parçasıdır, böylece tüm boşluklara ihtiyacınız yoktur . – Long

+3

Bu işi yapmakta güçlük çekiyorsanız, eklemeyi (setq-varsayılan kötülük-gecikme-gecikme 0.2) de deneyin.Ayrıca, bu satırların her ikisini de kullanıcı-init bölümü yerine ~/.spacemacs dosyanızın kullanıcı-config bölümü içine koymanızı öneriyorum. – Macmee

0

, (user-init başına eklenir) bu ayar çok iyi çalıştığını gördük kötülük yapılandırma init.el benim için çalıştı kullanım-paketi: Ubuntu için

(use-package evil 
:ensure t 
:config 
(evil-mode 1) 
(define-key evil-insert-state-map "jj" 'evil-normal-state) 
) 

, ben E. Sambo cevabını izledi.