Kötülük: vim yolu tuş bağlamalarını harita?


13

Ben Evil işlevini yapmaya çalışıyorum evil-jump-to-tag, C-]Emacs bağlama gibi davranır M-..

Normal davranış, Etiketler dosyalarına göz atmak için iyidir, ancak Slime slime-edit-definition, Elisps elisp-slime-nav-find-elisp-thing-at-point, Clojures vb.İçin de çalışmasını istiyorum cider-jump-to-var.

Bu büyük modlar ve daha pek çoğu tuş bağlama tanımına atlamak için eşdeğerdir M-..

Kötü mod için aynı davranışı elde etmek için, bu modların her biri için yerel olarak bir tuş bağlama yapmam gerekir mi, yoksa bir tuş bağlama alıp Emacs'a, bu tuşa her basıldığında, o tuşa bağlı olan işlevi kullanması mümkün mü Emacs modunda?


İlgili (daha doğrudan vim benzeri bir yaklaşım): emacs.stackexchange.com/q/12287/8283
idbrii

Yanıtlar:


10

Cevaplarınız sayesinde şimdi çalıştım:

(defun my-jump-to-tag ()
  (interactive)
  (evil-emacs-state)
  (call-interactively (key-binding (kbd "M-.")))
  (evil-change-to-previous-state (other-buffer))
  (evil-change-to-previous-state (current-buffer)))

(define-key evil-normal-state-map (kbd "C-]") 'my-jump-to-tag)

Bu, kötü durumu "Emacs" olarak ayarlar, M-'ye bağlı işlevi çağırır ve diğer tampondaki önceki emacs durumuna geri döner. Ben elisp, slime ve go ile denedim ve hepsi için çalışıyor.


1
Kullandığım daha basit ve tamamen iyi çalışıyor gibi görünüyor: (define-key evil-normal-state-map (kbd "C-]") (kbd "\\ M-.")("\" bağlı evil-execute-in-emacs-state).
shosti

@shosti: Evet, bu en azından de işe yarayacak. Ben böyle denedim, ama ikinci \ ve M arasındaki boşluk dahil etmedi
martin

3

Gibi bir şey dene

(global-set-key "\C-]" "\M-.")

veya evilbu tuş bağını zaten kullanıyorsa, benzer bir şey yapmanız gerekebilir.

(define-key evil-mode-map "\C-]" "\M-.")

Bu C-], mevcut büyük moda bağlı olarak kötülüğün davranışını korumak istiyorsanız, @ Tyler'ın çözümü daha uygun olduğu için davranışını tamamen geçersiz kılacaktır, çünkü M-.esle'yi çağırmaya veya yapmayacağınıza karar veren bir işleve sahip olabilirsiniz .

Bu yardımcı olur mu?


2

evil'S tuş haritalarını anlamıyorum , ancak şu M-.anda bağlı olan her şey aşağıdaki işlevi yapar :

(defun my-tag-jump ()
    (interactive)
    (call-interactively (key-binding (kbd "M-."))))

Bunu uygun eviltuş eşlemesine bağlamak istediğinizi yapmalıdır. Bunu evilyapmanın daha spesifik bir yolu olabilir .

evilbağlamalar C-]içinde evil-motion-state-mapöylesine aşağıdakileri deneyin:

(eval-after-load "evil-maps"
    '(define-key evil-motion-state-map "\C-]" 'my-tag-jump))

Ben bu kötü modlu bağlar, çünkü böyle işe yarayabilir nasıl görmüyorum M-.için evil-repeat-pop-next. İşlevinizi şu şekilde değiştirirseniz: (defun my-tag-jump () (etkileşimli) (kötü-emacs-state) (etkileşimli olarak ara (anahtar bağlama (kbd "M-."))) (Kötü-normal- devlet))
martin

Dediğim gibi, kötü tuş haritalarını bilmiyorum. Belki de daha iyi çözüm, evil-jump-to-tagtanımlanmış olan tuş haritasını bulmak ve oradaki işlevime yeniden hatırlatmaktır.
Tyler

2

Genel olarak mümkün değil.

Bunun nedeni, aynı bağlamayı tanımlayan birkaç harita olması ve hangisini istediğinizi otomatik olarak anlamanın bir yolu olmamasıdır. (örneğin, elisp-slime-nav-modeböyle küçük bir moddur). Yani gerçekten güvenilir olan tek yaklaşım tam olarak hangi tanımı istediğinizi bulmanızdır.

Dedi ki ... olası bir kesmek var (her zaman orada değil ...) Onu zorlaştıran şeyin bir kısmı, yeniden eşlemek istediğiniz bağlamanın potansiyel olarak etkin bir aktif tuş haritası tarafından maskelenmiş olması, M-.yararsızdır.

(defun lookup-no-evil (key)
  ;; excluding evil maps from the lookup. not sure if 
  ;; anything more than evail-normal-state-map is needed
  (let* ((evil-maps (list evil-normal-state-map))
         (bindings
          (remq nil
                (mapcar
                 (lambda (map)
                   (unless (memq map evil-maps)
                     (lookup-key map key)))
                 (current-active-maps)))))
    (when bindings
      ;; let's assume the first one is the right one. 
      ;; Given that minor modes are at the beginning 
      ;; (although this is *not* documented so should not 
      ;; be relied upon), it might be what we would have 
      ;;without evil-mode indeed
      (car bindings))))

(defmacro evil-remap (from to)
  ;; assuming that we want to put it in the normal-state map.
  ;; not sure about that
  `(define-key evil-normal-state-map ,to
       (lambda ()
         (interactive)
         (call-interactively (lookup-no-evil ,from)))))

(evil-remap (kbd "M-.") (kbd "C-]"))

Normalde kötüyü hiç kullanmıyorum, bu yüzden gerekli ayarlamalar olabilir (gömülü yorumlara bakın)

Ayrıca, daha net bir yaklaşım, tuşlara her basıldığında dinamik olarak bakmak yerine, bağlamaları bir kez (örneğin bir mod kancasında) aramak olacaktır. Ama hangi kötü kancayı kullanacağınızdan emin değilim, bu yüzden bu bir egzersiz olarak bırakılır;) (ve küçük modlarınız için kullandığınız sıraya bağlı olarak veya bunları dinamik olarak değiştirirseniz, yanlış olabilir)


2

@Severin tarafından kabul edilen çözüm neredeyse benim için çalışıyor, ancak etiket bulunamadığında arabellek normal moda dönmüyor. Bu alternatif benim için her durumda işe yarar:

(defun my-jump-to-tag ()
    (interactive)
    (evil-execute-in-emacs-state)
    (call-interactively (key-binding (kbd "M-."))))
(define-key evil-normal-state-map (kbd "C-]") 'my-jump-to-tag)

1

Bence en temiz yol

(define-key evil-normal-state-map (kbd "M-.") 'xref-find-definitions)

(ve ayrıca ilgilendiğiniz diğer tüm haritaları da ekleyin)

xref-find-definitionsM-.komutu kullanarak görebileceğiniz gibi emacs içinde bağlanan işlevdir C-h k.


1

Bazı vim tarzı tuş bağlama işlevleri.

İşte global harita ve çeşitli kötü durumlarda vim tarzı bağlanmaya izin vermek için tanımladığım bazı fonksiyonların yanı sıra, keyfi bir anahtar harita veya keyfi bağlama fonksiyonu alan iki genel fonksiyon. Bu işlevleri bir özete koydum .

(defun kbd+ (keyrep &optional need-vector)
  (if (vectorp keyrep) keyrep (edmacro-parse-keys keyrep need-vector)))

(defun gmap (keyrep defstr)
  "Vim-style global keybinding. Uses the `global-set-key' binding function."
  (global-set-key (kbd+ keyrep) (edmacro-parse-keys defstr t)))

(defun fmap (keybind-fn keyrep defstr)
  "Vim-style keybinding using the key binding function KEYBIND-FN."
  (call keybind-fn (kbd+ keyrep) (edmacro-parse-keys defstr t)))

(defun xmap (keymap keyrep defstr)
  "Vim-style keybinding in KEYMAP. Uses the `define-key' binding function."
  (define-key keymap (kbd+ keyrep) (edmacro-parse-keys defstr t)))

(defun nmap (keyrep defstr) "Vim-style keybinding for `evil-normal-state.' Uses the `define-key' binding function."
      (xmap evil-normal-state-map keyrep defstr))
(defun imap (keyrep defstr) "Vim-style keybinding for `evil-insert-state'. Uses the `define-key' binding function."
      (xmap evil-insert-state-map keyrep defstr))
(defun vmap (keyrep defstr) "Vim-style keybinding for `evil-visual-state'. Uses the `define-key' binding function."
      (xmap evil-visual-state-map keyrep defstr))
(defun mmap (keyrep defstr) "Vim-style keybinding for `evil-motion-state'. Uses the `define-key' binding function."
      (xmap evil-motion-state-map keyrep defstr))

Genel olarak, bu işlevleri yalnızca klavye-makro tarzı ciltlemeler için (söz konusu kullanım durumunda olduğu gibi) kullanmak ve diğer her şey için emacs tarzı tuş bağlama kullanmak daha iyidir.

notlar

  • bind-keyMakro use-packagepaketi mükemmel ve anahtar bağlayıcı işlevi çok yönlüdür.
  • Bir komutu başka bir komutla değiştirmek isterseniz Emacs'ın yeniden eşleme komutlarını kullanabilirsiniz .
  • Bunları normal anahtar bağlantıları için kullanırsanız, "noremap" sürümleri olmadığını unutmayın; bu nedenle tanımınızdaki bağlantılar değiştiğinde kullanıcı tanımlı bağlantılar da değişecektir.

Bağlama C-]için M-..

Normal-devlet, sen bağlamak isteyeceksiniz o Not \M-.normal durum bağlar beri, bağlayıcı emacs'ı erişmek için M-.için 'evil-repeat-pop-next. Böylece normal durum bağlaması aşağıdakilerle tanımlanabilir:

(nmap "C-]" "\\ M-.")

veya ( evil-jump-to-tagnormal durumdaki herhangi bir anahtarı yeniden adlandırma :

(nmap [remap evil-jump-to-tag] "\\ M-.")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.