बुराई: नक्शा कीबाइंडिंग विम तरीका?


13

मैं एविल फंक्शन बनाने की कोशिश कर रहा हूं evil-jump-to-tag, C-]एमाक्स बंधन की तरह व्यवहार करता हूं M-.

टैग फ़ाइलों को ब्राउज़ करने के लिए सामान्य व्यवहार ठीक है, लेकिन मैं चाहता हूं कि यह slime-edit-definitionस्लिम्स elisp-slime-nav-find-elisp-thing-at-point, एलिसप्स cider-jump-to-var, क्लोज्ज , आदि के लिए भी काम करे ...

ये प्रमुख मोड और कई और कीबाइंडिंग के जंप-टू-डेफिनिशन के कुछ बराबर हैं M-.

ईविल-मोड के लिए समान व्यवहार प्राप्त करने के लिए, क्या मुझे इन तरीकों में से प्रत्येक के लिए स्थानीय रूप से कीबाइंडिंग को बांधने की आवश्यकता है, या क्या कीबाइंडिंग लेना संभव है और Emacs को बताएं, कि जब भी यह कुंजी दबाई जाए, तो उस कुंजी से बंधे फ़ंक्शन का उपयोग करें Emacs मोड में?


संबंधित (अधिक प्रत्यक्ष विम जैसा दृष्टिकोण): emacs.stackexchange.com/q/12287/8283
idbrii

जवाबों:


10

मुझे अब यह काम कर रहा है, आपके उत्तर के लिए धन्यवाद:

(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)

यह "Emacs" में बुराई-स्थिति सेट करेगा, M- के लिए बाध्य फ़ंक्शन को कॉल करेगा, और अन्य बफर में पिछले emacs राज्य में वापस बदल देगा। मैंने इसे elisp, slime और go के साथ आज़माया है और यह उन सभी के लिए काम कर रहा है।


1
मैं जो उपयोग करता हूं वह सरल है, और पूरी तरह से ठीक काम करने लगता है: (define-key evil-normal-state-map (kbd "C-]") (kbd "\\ M-.")(जहां "\" बाध्य है evil-execute-in-emacs-state)।
शास्त्री

@ शास्त्री: हां, यह कम से कम काम करना चाहिए। मैंने इसे इस तरह आज़माया है, लेकिन
मार्टिन

3

कुछ ऐसा आजमाएं

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

या, यदि evilपहले से ही यह कीबाइंड उपयोग करता है , तो आपको कुछ ऐसा करने की आवश्यकता हो सकती है।

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

C-]यदि आप वर्तमान प्रमुख-मोड के आधार पर बुराई के व्यवहार को बनाए रखना चाहते हैं, तो यह पूरी तरह से व्यवहार को ओवरराइड कर देगा , @ टायलर का समाधान अधिक उपयुक्त है क्योंकि आपके पास एक फ़ंक्शन हो सकता है जो निर्णय लेता है कि क्या कॉल M-.करना है या कुछ एस्ले करना है।

क्या यह मदद करता है?


2

मुझे समझ में नहीं आता है evil, लेकिन निम्नलिखित फ़ंक्शन जो कुछ भी M-.इस समय बाध्य है:

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

इसे उचित evilकीमैप से बांधना चाहिए जो आपको चाहिए। ऐसा करने के लिए एक और अधिक evilविशिष्ट तरीका हो सकता है ।

evilमें बांधता C-]है evil-motion-state-map, तो निम्न प्रयास करें:

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

मैं नहीं देखता कि यह इस तरह कैसे काम कर सकता है, क्योंकि बुराई-मोड के लिए बाध्य M-.करता है evil-repeat-pop-next। यदि आप अपने कार्य को इस में बदलते हैं: (डिफॉन माय-टैग-जंप () (इंटरएक्टिव) (बुराई-एमएसीएस-स्टेट) (कॉल-इंटरेक्टिवली (की-बाइंडिंग (केबड "एम-"।)))) (बुराई-सामान्य) राज्य))
मार्टिन

जैसा कि मैंने कहा, मुझे बुरे कीमैप का पता नहीं है। शायद बेहतर उपाय यह है कि कीमैप evil-jump-to-tagको परिभाषित किया जाए, और वहां मेरे कार्य के लिए इसे रिबंड करें।
टायलर

2

सामान्य तौर पर, यह संभव नहीं है।

कारण यह है कि एक ही बंधन को परिभाषित करने वाले कई नक्शे हो सकते हैं, और स्वचालित रूप से यह पता लगाने का कोई तरीका नहीं है कि आप कौन सा चाहते हैं। (आपके उदाहरण में, elisp-slime-nav-modeऐसी एक मामूली विधा है)। तो केवल वास्तव में विश्वसनीय दृष्टिकोण यह पता लगाने के लिए है कि आप क्या परिभाषा चाहते हैं।

उस ने कहा ... वहाँ एक संभव हैक है (हमेशा नहीं है ...) का हिस्सा यह क्या मुश्किल बना देता है यह है कि जिस बंधन को आप रीमैप करना चाहते हैं वह संभावित रूप से पहले से ही एक दुष्ट सक्रिय कीमैप द्वारा नकाबपोश है, इसलिए वर्तमान बाध्यकारी हो रही है M-.व्यर्थ का।

(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-]"))

मैं आमतौर पर बुराई का उपयोग नहीं करता हूं, इसलिए समायोजन की आवश्यकता हो सकती है (एम्बेडेड टिप्पणियां देखें)

इसके अलावा, एक क्लीनर दृष्टिकोण एक बार बाइंडिंग देखने के लिए होगा (उदाहरण के लिए एक मोड हुक में), बजाय गतिशील रूप से हर बार कीबाइंडिंग को दबाने पर। लेकिन मुझे यकीन नहीं है कि किस बुरे हुक का उपयोग करना है, इसलिए इसे एक अभ्यास के रूप में छोड़ दिया गया है;) (और आपके मामूली-मोड के लिए आपके द्वारा उपयोग किए जाने वाले आदेश पर निर्भर करता है, या यदि आप उन्हें गतिशील रूप से टॉगल करते हैं, तो यह गलत हो सकता है)


2

@ सेवरिन द्वारा स्वीकृत समाधान मेरे लिए लगभग काम करता है, लेकिन, जब टैग नहीं मिलता है, तो बफर सामान्य मोड में वापस नहीं आता है। यह विकल्प मेरे लिए सभी मामलों में काम करता है:

(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

मुझे लगता है कि सबसे साफ तरीका है

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

(और आपकी रुचि के हर दूसरे मानचित्र को भी जोड़ें)

xref-find-definitionsफ़ंक्शन को M-.emacs में बाइंड किया जाता है, जैसा कि आप कमांड का उपयोग करके देख सकते हैं C-h k


1

कुछ विम-स्टाइल कीबाइंडिंग फ़ंक्शन।

यहाँ कुछ फ़ंक्शंस हैं जिन्हें मैंने वैश्विक मानचित्र और विभिन्न दुष्ट-राज्यों में विम-स्टाइल बाइंडिंग की अनुमति देने के लिए परिभाषित किया है, साथ ही दो सामान्य फ़ंक्शंस जो कि एक मनमाना की-मैप या मनमाना बाध्यकारी फ़ंक्शन लेते हैं। मैंने इन कार्यों को एक जिस्ट में रखा है ।

(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))

सामान्य तौर पर, कीबोर्ड-मैक्रो-स्टाइल बाइंडिंग (जैसे प्रश्न में उपयोग-केस) के लिए इन कार्यों का उपयोग करना बेहतर होता है, और बाकी सभी चीजों के लिए इमैक-स्टाइल कीबाइंडिंग का उपयोग करना।

टिप्पणियाँ

  • bind-keyसे मैक्रो use-packageपैकेज एक शानदार और बहुमुखी कुंजी बाध्यकारी कार्य है।
  • यदि आप एक कमांड को दूसरे के साथ बदलना चाहते हैं, तो आप Emacs के रीमैपिंग कमांड का उपयोग कर सकते हैं ।
  • यदि आप नियमित कुंजी-बाइंडिंग के लिए इनका उपयोग करते हैं, तो ध्यान रखें कि "नॉरमैप" संस्करण नहीं हैं, इसलिए यदि आपकी परिभाषा में बाइंडिंग बदल जाती है, तो आपके उपयोगकर्ता-परिभाषित बाइंडिंग बदल जाएंगे।

बाइंडिंग C-]के लिए M-.

ध्यान दें कि सामान्य स्थिति में, आप \M-.emacs बाइंडिंग का उपयोग करने के लिए बाध्य करना चाहते हैं , क्योंकि सामान्य-राज्य बाइंड M-.करता है 'evil-repeat-pop-next। तो एक सामान्य-राज्य बंधन को इसके साथ परिभाषित किया जा सकता है:

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

या evil-jump-to-tagसामान्य स्थिति में किसी भी कुंजी को रिबंड करना :

(nmap [remap evil-jump-to-tag] "\\ M-.")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.