ईविल मोड सबसे अच्छा अभ्यास? [बन्द है]


104

मैं सालों से अपने प्राथमिक संपादक के रूप में विम का उपयोग कर रहा हूं और उस दौरान कई बार Emacs की कोशिश की। तब मैंने ईविल की खोज की और फैसला किया कि यह मेरी गति को अच्छी तरह से पूरा करने की मांग को पूरा करता है कि मैं आखिरकार एमएसीएस पर जा सकता हूं।

तो, आप सभी ईविल उपयोगकर्ताओं के लिए, आप इसे सामान्य एमएसीएस कार्यों के साथ कैसे एकीकृत करते हैं? क्या आपने इस मोड और अन्य के बीच किसी भी टकराव का सामना किया है? इस विषय पर आपके साझा करने योग्य अनुभव / सुझाव क्या हैं?

जवाबों:


71

मैंने एक उच्च अनुकूलित विम का उपयोग किया है, और अब एक और भी अधिक अनुकूलित emacs का उपयोग करता है। मुझे लगता है कि आपको मेरी कीमैपिंग कॉन्फ़िग फ़ाइल https://github.com/mbriggs/.emacs.d-oldv2/blob/master/init/init-keymaps.el में कीमैपिंग के हर उदाहरण मिलेंगे

ध्यान रखें, मैं सामान को रीबाइंड कर रहा हूं कि असली emacs उपयोगकर्ताओं को विधर्मी समझेंगे, इसलिए YMMV यदि आप कभी भी "असली" emacs सीखना चाहते हैं (मैं वास्तव में नहीं)।

एक बात मैं किसी भी पूर्व की सिफारिश करूँगा vimmer यह है

;;; esc quits
(defun minibuffer-keyboard-quit ()
  "Abort recursive edit.
In Delete Selection mode, if the mark is active, just deactivate it;
then it takes a second \\[keyboard-quit] to abort the minibuffer."
  (interactive)
  (if (and delete-selection-mode transient-mark-mode mark-active)
      (setq deactivate-mark  t)
    (when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
    (abort-recursive-edit)))
(define-key evil-normal-state-map [escape] 'keyboard-quit)
(define-key evil-visual-state-map [escape] 'keyboard-quit)
(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)

ताकि वास्तव में esc बहुत कुछ (जैसे मिनीबफ़र में लंबित संकेतों को छोड़ता है)


7
मिनीबफ़र-कीबोर्ड-छोड़ के लिए परिभाषा यहाँ पाई जा सकती है: github.com/davvil/.emacs.d/blob/master/init.el
एडम बेल

1
उस बारे में क्षमा करें।>> मेरे पास बहुत सारा सामान है, कभी-कभी मैं ऐसे फ़ंक्शन का उपयोग करता हूं जो मुझे लगता है कि बनाया गया है, लेकिन वास्तव में कहीं और से आ रहा है
मैट ब्रिग्स

3
मुझे लगता है कि यह मेरे लिए काम नहीं करता है। मैं 24.4 नवीनतम Emacs का उपयोग करता हूं, क्या कोई एक ही अनुभव करता है?
Dzung Nguyen

1
लिंक टूट गया है। मेरा मानना ​​है कि यह नया है: github.com/mbriggs/.emacs.d/blob/master/config/keybinds.el
शॉन लेदर

1
@SeanLeather एक काम कर रहे लिंक का उत्तर दिया गया।
क्रिस्टोफर बॉटलम्स

34

जैसे कि कोई व्यक्ति जो शाप से आया था, उसने विम की कोशिश की, और महसूस किया कि बड़ी संख्या में चीजें हासिल करने के लिए हैं, मैंने बहुत से प्रयोग किए जब मैंने पहली बार बुराई का उपयोग करना शुरू किया। हालांकि निम्नलिखित विवादास्पद हैं, मैं इमैक कीज़ को टर्मिनल, फ़ायरफ़ॉक्स, कोको, आदि में अधिक सार्वभौमिक रूप से उपयोग करना चाहता था, लेकिन विम संपादन क्षमताओं को खोना नहीं चाहता था। मैंने अपने .emacs में निम्नलिखित कुंजियों को फिर से बनाने का निर्णय लिया:

(define-key evil-normal-state-map "\C-e" 'evil-end-of-line)
(define-key evil-insert-state-map "\C-e" 'end-of-line)
(define-key evil-visual-state-map "\C-e" 'evil-end-of-line)
(define-key evil-motion-state-map "\C-e" 'evil-end-of-line)
(define-key evil-normal-state-map "\C-f" 'evil-forward-char)
(define-key evil-insert-state-map "\C-f" 'evil-forward-char)
(define-key evil-insert-state-map "\C-f" 'evil-forward-char)
(define-key evil-normal-state-map "\C-b" 'evil-backward-char)
(define-key evil-insert-state-map "\C-b" 'evil-backward-char)
(define-key evil-visual-state-map "\C-b" 'evil-backward-char)
(define-key evil-normal-state-map "\C-d" 'evil-delete-char)
(define-key evil-insert-state-map "\C-d" 'evil-delete-char)
(define-key evil-visual-state-map "\C-d" 'evil-delete-char)
(define-key evil-normal-state-map "\C-n" 'evil-next-line)
(define-key evil-insert-state-map "\C-n" 'evil-next-line)
(define-key evil-visual-state-map "\C-n" 'evil-next-line)
(define-key evil-normal-state-map "\C-p" 'evil-previous-line)
(define-key evil-insert-state-map "\C-p" 'evil-previous-line)
(define-key evil-visual-state-map "\C-p" 'evil-previous-line)
(define-key evil-normal-state-map "\C-w" 'evil-delete)
(define-key evil-insert-state-map "\C-w" 'evil-delete)
(define-key evil-visual-state-map "\C-w" 'evil-delete)
(define-key evil-normal-state-map "\C-y" 'yank)
(define-key evil-insert-state-map "\C-y" 'yank)
(define-key evil-visual-state-map "\C-y" 'yank)
(define-key evil-normal-state-map "\C-k" 'kill-line)
(define-key evil-insert-state-map "\C-k" 'kill-line)
(define-key evil-visual-state-map "\C-k" 'kill-line)
(define-key evil-normal-state-map "Q" 'call-last-kbd-macro)
(define-key evil-visual-state-map "Q" 'call-last-kbd-macro)
(define-key evil-normal-state-map (kbd "TAB") 'evil-undefine)

(defun evil-undefine ()
 (interactive)
 (let (evil-mode-map-alist)
   (call-interactively (key-binding (this-command-keys)))))

दुर्भाग्य से, विम के साथ ये ओवरलैप "एक स्क्रीन को ऊपर या नीचे ले जाते हैं" ऑपरेशन। हालाँकि, मैं इसके बजाय निम्नलिखित का उपयोग करके सहज हो गया हूं:

(define-key evil-normal-state-map (kbd "DEL") (lambda ()
                    (interactive)
                    (previous-line 10)
                    (evil-scroll-line-up 10)
                    ))

(define-key evil-normal-state-map (kbd "=") (lambda ()
                      (interactive)
                      (next-line 10)
                      (evil-scroll-line-down 10)
                      ))

इसके अलावा, यदि आप विम से आ रहे हैं और "jk" (या किसी अन्य 2 स्ट्रोक संयोजन) का उपयोग करके सामान्य मोड में सम्मिलित होने से एक त्वरित मार्ग चाहते हैं, तो सबसे अच्छा तरीका http://www.emacswiki.org/ से पाठ की प्रतिलिपि बनाना है emacs / download / key-chord.el और इसे अपने ~ / .emacs.d / key-chord.el में पेस्ट करें। फिर निम्नलिखित को अपने .emacs में जोड़ें:

;load a file named key-chord.el from some directory in the load-path (e.g. "~/.emacs.d")
(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "jk" 'evil-normal-state)

इसके अलावा, अगर आप विम से आ रहे हैं और आपको लगता है कि इमेक में कॉपी-टू-क्लिपबोर्ड अच्छा नहीं है, तो आप शायद सही हैं। हालाँकि, आपको sudo apt-get install xsel चलाने के बाद निम्नलिखित उपयोगी मिल सकता है:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(evil-define-command paste-from-clipboard()
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)

जाहिर है, आपको खुद तय करना होगा कि इनमें से कोई भी विवादास्पद बदलाव इसके लायक है या नहीं, लेकिन शायद ये बुनियादी बदलाव आपको प्रेरित करेंगे।

कुछ अन्य वास्तव में शांत फ़ंक्शन कार्यान्वयन के लिए, जैसे कि हटाएं और पेस्ट करें, क्लिपबोर्ड पर कॉपी किए बिना हटाएं, कुशल 4x / 16x आंदोलन, पेस्ट रजिस्टर विनिर्देश के लिए गणना का उपयोग, टैब सेटिंग्स जो वास्तव में सी / सी ++ के लिए काम करती हैं, और अधिक, आप देख सकते हैं पूर्ण .emacs, init.el, my-keymaps.el, और my-functions.el के छंदों को मेरे git https://github.com/Russell91/emacs पर


2
यह सब बहुत अच्छा है, मैंने wikemacs में कुछ जोड़ा: wikemacs.org/index.php/Evil#Configuration
Ehvince

मैं समझती हूं कि आपकी इच्छाशक्ति ईमैक से आपकी आदतें पुन: उपयोग करने की है। फ़ायरफ़ॉक्स में काम करने के लिए, मैं अत्यधिक Vimperator एडोन की कोशिश करने की सलाह देता हूं, जो आपके ब्राउज़िंग के लिए कार्यक्षमता जैसी कई विम लाता है। हालाँकि, यह डिफ़ॉल्ट रूप से vim आंदोलन कमांड का उपयोग कर रहा है (जैसा कि lessकमांड और अन्य के लिए मामला है)।
जन वल्किनस्की

आप के रूप में ही, मुझे सम्मिलित-राज्य-मोड में दुष्ट बंधन पसंद नहीं है, इसलिए मैं सामान्य-राज्य-मानचित्र में "i" को "बुराई-एमएसीएस-राज्य" के रूप में रीबेंड करता हूं।
user49117

के कीबोर्ड को ओवरराइड करने के बजाय evil, मैं इसे हटा देता हूं, इसलिए यह सामान्य एमएसीएस की कीबोर्ड सेटिंग पर वापस आ जाता है, उदाहरण(dolist (m (list evil-normal-state-map evil-motion-state-map evil-insert-state-map)) (define-key m "\C-e" 'nil))
बाच लियन

30

मैं एक वाइपर / Vimpulse उपयोगकर्ता भी हुआ करता था, जिसमें भारी मात्रा में कॉन्फ़िगरेशन होता था। तब मुझे ईविल-मोड मिला।

इस विषय पर आपके साझा करने योग्य अनुभव / सुझाव क्या हैं?

यह मेरा संपूर्ण बुराई-मोड कॉन्फ़िगरेशन है, और यह मेरे लिए बहुत अच्छा काम करता है:

(require 'evil)
(evil-mode 1)

;; Remap org-mode meta keys for convenience
(mapcar (lambda (state)
    (evil-declare-key state org-mode-map
      (kbd "M-l") 'org-metaright
      (kbd "M-h") 'org-metaleft
      (kbd "M-k") 'org-metaup
      (kbd "M-j") 'org-metadown
      (kbd "M-L") 'org-shiftmetaright
      (kbd "M-H") 'org-shiftmetaleft
      (kbd "M-K") 'org-shiftmetaup
      (kbd "M-J") 'org-shiftmetadown))
  '(normal insert))

क्या आपने इस मोड और अन्य के बीच किसी भी टकराव का सामना किया है?

नहीं, वाइपर / विम्पुल के विपरीत जो कई मोड में परेशानी पैदा कर रहा था।


मुझे यह त्रुटि मिल रही है: संकेत: चर के रूप में प्रतीक का मान शून्य है: राज्य को कहां परिभाषित किया गया है?
जस्टिंगोर्डन

आप कोशिश कर सकते हैंevil-emacs-state
केनी मेयर

2
क्या आप स्पष्ट कर सकते हैं कि आपने कहां रखा है?
Justingordon

1
यह शानदार है, मैंने ठीक यही देखा। अपवित्र करते हैं!
jplindstrom


17

मैंने एक महीने पहले ईविल का उपयोग करना शुरू कर दिया था; इससे पहले, मैंने बहुत सफलता के बिना वाइपर / विम्पुल का उपयोग करने की कोशिश की। ईमानदार होने के लिए, विम्पुलस काफी अच्छा है, लेकिन विभिन्न मोड के साथ इसका उपयोग करना थोड़ा परेशानी भरा था (जैसे संकलन मोड जहां विम्पुल हमेशा पागल हो गया था) वी-एमएसीएस-कुछ के बीच किसी न किसी मोड में emacs छोड़ रहा है।

जब मैंने ईविल पर स्विच किया, तो मैंने आखिरकार पूर्ण एमएसीएस शक्ति का पता लगाना शुरू कर दिया, और मेरा विश्वास करो, मुझे अफसोस नहीं हुआ। ईविल उन सभी मोडों में अच्छी तरह से काम करता है जो मैंने उपयोग किए थे (ज्यादातर संपादन, संकलन, स्क्रैच और एशेल) और यहां तक ​​कि पढ़ने की जानकारी / आदमी / मदद बिना किसी समस्या के काम कर रही है।

सिवाय इसके कि, मैंने केवल बफर स्विचिंग को अजीब पाया, जैसा कि मैं करता था: b <0-9> इसके बजाय: b-TAB-then-complete-name या: bn। हालाँकि, ध्यान दें कि ईविल डेवलपर डुप्लिकेट फ़ंक्शंस को कम करने के लिए (कुछ मामलों में) कोशिश करता है, इसलिए:! (शेल कमांड निष्पादित करने के लिए), आपको मूल M- का उपयोग करना चाहिए!

यदि आप कुछ कस्टम पूर्व कमांड को जोड़ने / फिर से परिभाषित करने का आग्रह करते हैं, तो बस बुराई-मैपसेल खोलें और इसे संपादित करें (vim में प्रयास करें!)।

ईविल अभी भी युवा है, लेकिन होनहार परियोजना है और मैं उस दिन की प्रतीक्षा कर रहा हूं जब आधिकारिक Emacs वितरण में वाइपर की जगह लेगा।


4
क्या इसका तात्पर्य यह है कि विम में जोड़ना / पुनः परिभाषित करना संभव नहीं है?
जॉन टाय

1
@JohnTyree उपयोगकर्ता परिभाषित आदेशों को विम में एक ऊपरी-केस पत्र के साथ शुरू करने की आवश्यकता होती है, जबकि सभी अंतर्निहित कमांड एक निचले-केस पत्र से शुरू होते हैं।
ऑस्टिन टेलर

10

जब मैं बाहर निकलता हूं तो मैं बफर को सहेजना पसंद करता हूं insert-mode: (संपादित करें: इस बफर के लिए कोई संबद्ध फ़ाइल नहीं होने पर सहेजने के लिए न कहें, जैसे कि खरोंच या मैजिट बफर में)

(defun my-save ()
  (if (buffer-file-name)
    (evil-save))
)

   (add-hook 'evil-insert-state-exit-hook 'my-save)

अधिक संभावनाओं के लिए: http://wikemacs.org/index.php/Evil देखें

टिप्पणियाँ सुधार के लिए स्वागत है!


धन्यवाद। BTW, आपका लिंक टूट गया है।
अमोस

धन्यवाद। विकीमेक्स वापस आएंगे। साइट रखरखाव के अधीन है, उम्मीद है कि बहुत लंबे समय के लिए फिर से नहीं।
एहविंस

9
  1. मैं बुराई-नेता का उपयोग करता हूं और "एमएक्स" को बदलने के लिए ", एक्सएम" का उपयोग करता हूं, इसलिए मैं शायद ही कभी Alt कुंजी दबाता हूं। वहाँ भी है। सामान्य जो कई नेता कुंजी का समर्थन करता है।

  2. बुराई-मिलान , टैग जोड़ी के बीच कूदने के लिए "%" दबाएँ।

  3. bad-nerd-commenter , "9, ci" को 9 पंक्तियों पर टिप्पणी / अनसुना करने के लिए दबाएँ

  4. ESC कुंजी का उपयोग करने से बचें, आप इसके बजाय "kj" दबा सकते हैं ।

  5. मुफ्त सॉफ्टवेयर में विश्वास है! एविल के साथ कुछ भी असंभव नहीं है जो विम और इमैक की शक्ति को मिलाता है। उदाहरण के लिए, बहुत से लोग मानते हैं कि ईविल कीबाइंडिंग मौजूदा प्लगइन्स एमएसीएस के साथ भारी पुन: बंधन के बिना संघर्ष करती है। यह वास्तव में गलत है


0

Emacs की तरफ से आने वाला, मैं M- को बहुत पसंद करता हूं। गो-टू-डेफ़िनिशन हो, लेकिन जो फ़ंक्शन चलता है वह M-.सभी मोड में भिन्न होता है। मैं इसे नियमित तरीके से ओवरराइड कर सकता हूं (define-key evil-normal-state-map (kbd "M-.") 'foo)जहां fooवर्तमान प्रमुख मोड की जांच करता है और उपयुक्त फ़ंक्शन चलाता है, लेकिन ऐसा लगता है कि इसे बहुत सारे हार्डकोडिंग की आवश्यकता होगी। एक अधिक सामान्य समाधान यह है:

(defun evil-emacs-key-binding (key)
  (evil-execute-in-emacs-state)
  (key-binding key))

(defmacro evil-revert-key-binding (state-map key)
  `(define-key ,state-map ,key (lambda ()
                                 (interactive)
                                 (call-interactively
                                  (evil-emacs-key-binding ,key)))))

(eval-after-load "evil-autoloads"
  '(add-hook 'evil-after-load-hook
        (lambda ()
          (evil-revert-key-binding evil-normal-state-map (kbd "M-."))
          ;; and so on
        )))

इसके अलावा, मुझे प्लगइन्स बुराई-घेरना पसंद है (हालांकि मुझे लगता है कि स्मार्टपैरन्स एक अधिक संपूर्ण समाधान है) और बुराई-नेता

मैं ईएससी के लिए jk को मैप करने के लिए की-कॉर्ड का उपयोग करता था जैसे कि मैंने विम में करना सीखा है, लेकिन इसने kj को jk के समान मानने पर जोर दिया, इसलिए इसके बजाय मैं निम्नलिखित का उपयोग कर रहा हूं:

(defun evil-escape-if-next-char (trigger)
  "Watches the next letter. If `trigger', then switch to normal mode,
otherwise keep the previously inserted key and forward unpressed
key to `unread-command-events'."
  (self-insert-command 1)
  (let ((next-key (read-event)))
    (if (eq trigger next-key)
        (progn
          (delete-char -1)
          (evil-normal-state))
      (setq unread-command-events (cons next-key unread-command-events)))))

(defun evil-escape-if-next-char-is-k (arg)
  (interactive "p")
  (if (= arg 1)
      (evil-escape-if-next-char ?k)
    (self-insert-command arg)))

(eval-after-load "evil-autoloads"
  '(add-hook 'evil-after-load-hook
             (lambda ()
               ;; … other stuff …
               (define-key evil-insert-state-map (kbd "j") 'evil-escape-if-next-char-is-k))))

मैं उपयोग (setq evil-move-cursor-back nil)करता हूं जो बहुत विमी नहीं है (हालांकि अप्रत्यक्ष रूप से आप अपने vimrc को भी ऐसा कर सकते हैं), मैं बस डालने के बाहर निकलने के बाद कर्सर को वापस जाने की आदत नहीं डाल पाया।

प्रैक्टिकल टिप: evil-local-mode-hookसामान के लिए उपयोग करें जैसे आलसी लोडिंग बुराई-चारों ओर मोड, यह इसे सादे में डालने में मदद नहीं करेगा evil-mode-hook। इसलिए यदि आप पैकेज-इंस्टाल के साथ बुराई और बुराई को चारों ओर से स्थापित करते हैं, तो आप इसे तब कर सकते हैं जब आप इसे करते M-x evil-modeहैं

(eval-after-load "evil-surround-autoloads"
  '(add-hook 'evil-local-mode-hook #'evil-surround-mode))

(बेशक, यदि आप हमेशा बुराई-मोड चलाते हैं और हमेशा बुराई स्थापित होती है, तो उस ऑटोलैड सामान की कोई आवश्यकता नहीं है, लेकिन मैं अपने .emacs को सामान्य रूप से पसंद करना चाहता हूं कि मैं इसे पुराने एमकेन के साथ मशीनों पर या बिना किसी का उपयोग कर सकता हूं। कल्पा संकुल स्थापित।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.