Najlepsza praktyka Evil Mode? [zamknięte]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 4 lata temu .

Popraw to pytanie

Używam Vima jako głównego edytora od lat i próbowałem Emacsa kilka razy w tym czasie. Potem odkryłem zło i uznałem, że spełnia moje żądanie speedy ' ego ruch na tyle dobrze, że w końcu mogę przejść do Emacsa.

Więc, dla wszystkich złych użytkowników, jak zintegrować go z normalnymi funkcjami Emacsa? Czy napotkaliście jakieś konflikty między tym trybem a innymi? Jakie są Twoje cenne doświadczenia/porady na ten temat?

Author: tshepang, 2011-12-13

7 answers

Użyłem wysoce spersonalizowanego Vima, a teraz używam jeszcze bardziej spersonalizowanego Emacsa. Myślę, że każdą instancję keymappingu znajdziesz w moim pliku konfiguracyjnym keymappingu https://github.com/mbriggs/.emacs.d-oldv2/blob/master/init/init-keymaps.el

Pamiętaj, że zmieniam rzeczy, które prawdziwi użytkownicy Emacsa uznaliby za herezję, więc YMMV, jeśli kiedykolwiek chcesz nauczyć się" prawdziwego " Emacsa(naprawdę nie).

Jedną rzeczą, którą polecam każdemu ex vimmer jest to

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

Tak, że esc w rzeczywistości kończy praktycznie wszystko (np. oczekujące monity w minibufferze)

 72
Author: Matt Briggs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 15:46:37

Jako ktoś, kto przyszedł z Emacsa, wypróbował Vima i zdał sobie sprawę, że jest wiele rzeczy do zdobycia, zrobiłem wiele eksperymentów, kiedy po raz pierwszy zacząłem używać zła. Podczas gdy poniższe są kontrowersyjne, chciałem zachować klucze Emacsa, które są używane bardziej uniwersalnie w terminalu, Firefoksie, cocoa itp..., ale nie chciał stracić możliwości edycji Vima. W końcu zdecydowałem się ponownie zainstalować następujące klucze w moim .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)))))

Niestety, nakładają się one na vim " move one Ekran w górę lub w dół " operacje. Jednak, stałem się wygodny stosując następujące zamiast:

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

Ponadto, jeśli pochodzisz z Vima i chcesz uzyskać szybką ścieżkę z insert do trybu normalnego za pomocą "jk" (lub dowolnej innej kombinacji dwusuwowej), najlepszym sposobem jest skopiowanie tekstu z http://www.emacswiki.org/emacs/download/key-chord.el i wklej go do swojego~/.emacs.D / key-akord.el . Następnie dodaj następujące do swojego .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)

Również, jeśli pochodzisz z vim i myślisz kopiowanie do schowka w Emacsie nie jest dobre, pewnie masz rację. Jednak po uruchomieniu sudo apt-get install xsel może okazać się przydatne:

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

Oczywiście będziesz musiał sam zdecydować, czy którakolwiek z tych kontrowersyjnych zmian jest tego warta, ale być może te podstawowe zmiany Cię zainspirują.

Dla innych naprawdę fajnych implementacji funkcji, takich jak kasowanie i wklejanie, kasowanie bez kopiowania do schowka, wydajny ruch 4x / 16x, użycie liczeń dla wklej specyfikację rejestru, ustawienia karty, które faktycznie działają w c / c++ i więcej, możesz sprawdzić pełną .emacs, init.el, my-keymaps.el, i moje-funkcje.el versons on my git at https://github.com/Russell91/emacs

 34
Author: RussellStewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-16 22:33:53

Byłem również użytkownikiem Vipera / Vimpulse, z ogromną ilością konfiguracji. Potem znalazłem tryb zła.

Jakie są Twoje cenne doświadczenia/porady na ten temat?

To jest cała moja konfiguracja evil-mode, i działa świetnie dla mnie:

(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))
Czy napotkaliście jakieś konflikty między tym trybem a innymi?

Nie, w przeciwieństwie do Vipera/Vimpulse, który sprawiał problemy w kilku trybach.

 30
Author: Kenny Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 17:50:12

Zacząłem używać Evil miesiąc temu; wcześniej próbowałem używać Vipera / vimpulse bez większego powodzenia. Szczerze mówiąc, vimpulse jest całkiem fajny, ale używanie go z różnymi trybami było trochę kłopotliwe(np. tryb kompilacji, w którym vimpulse zawsze szalał) pozostawienie Emacsa w jakimś trybie między vi-emacsem-czymś.

Kiedy przerzuciłem się na zło, w końcu zacząłem odkrywać pełną moc Emacsa i uwierz mi, nie żałowałem. Evil działa ładnie we wszystkich trybach, których używałem (głównie edycja, kompilacja, scratch i eshell), a nawet czytanie info / man / help działa bez żadnych problemów.

Poza tym, znalazłem tylko przełączanie bufora dziwne jak kiedyś :B zamiast :B-TAB-then-complete-name lub: bn. Zauważ jednak, że Evil developers próbuje (w niektórych przypadkach) zmniejszyć duplikaty funkcjonalności, więc zamiast tego :! (do polecenia Exec shell), powinieneś użyć natywnego M -!.

Jeśli znajdziesz chęć dodania / redefinicji niektórych niestandardowych poleceń ex, po prostu otwórz evil-maps.el i edytuj (spróbuj tego w vim!).

Evil to wciąż młody, ale obiecujący projekt i czekam na dzień, kiedy zastąpi Vipera w oficjalnej dystrybucji Emacsa.

 17
Author: dennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-13 16:16:09

Lubię zapisywać bufor po wyjściu z insert-mode: (edited: nie pytaj o zapis, gdy nie ma skojarzonego pliku dla tego bufora, jak w buforze scratch lub magit)

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

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

Więcej możliwości: zobacz http://wikemacs.org/index.php/Evil

Komentarze mile widziane !

 10
Author: Ehvince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-30 15:52:56
  1. Używam evil-leader i używam ", xm "aby zastąpić" M-x", więc rzadko wciskam klawisz Alt. Istnieje również Ogólne.el , który obsługuje wiele kluczy leader.

  2. Evil-matchit, Naciśnij "%", aby przejść między parami tagów.

  3. Evil-nerd-commenter, Naciśnij "9, ci" aby skomentować / uncomment 9 linijek

  4. Unikaj używania klawisza ESC, możesz wcisnąć "kj".

  5. Miej wiarę w wolne oprogramowanie! Nic nie jest niemożliwe ze złem, które łączy moc Vima i Emacsa. Na przykład, wiele osób zakłada, że złe skróty klawiaturowe kolidują z istniejącymi wtyczkami Emacs bez ciężkiego ponownego wiązania. to właściwie źle

 9
Author: chen bin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:52:45

[[10]] od strony Emacsa bardzo wolę M-. być go-To-definition, ale funkcja, która działa na M-. różni się w różnych trybach. Mógłbym zastąpić go w zwykły sposób za pomocą (define-key evil-normal-state-map (kbd "M-.") 'foo) Gdzie foo sprawdza bieżący tryb główny i uruchamia odpowiednią funkcję, ale brzmi to jakby wymagało dużo twardego kodowania. Bardziej ogólne rozwiązanie jest takie:

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

Poza tym podobają mi się pluginy evil-surround (choć uważam, że smartparens jest bardziej kompletnym rozwiązaniem) i evil-leader .

Używałem key-chord do mapowania jk do ESC, jak nauczyłem się robić w Vimie, ale nalegał na traktowanie kj jako tego samego, co jk, więc zamiast tego używam następującego:

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

Używam (setq evil-move-cursor-back nil), co nie jest zbyt vimmym (chociaż można to zrobić również w vimrc), po prostu nigdy nie przyzwyczaiłem się do cofania kursora po wyjściu z insert.

Praktyczna wskazówka: używaj evil-local-mode-hook do takich rzeczy jak leniwe Ładowanie evil-surround mode, nie pomoże to umieścić go w plain evil-mode-hook. Tak więc, jeśli zainstalujesz evil i evil-surround za pomocą package-install, możesz uruchomić go, gdy wykonasz M-x evil-mode, wykonując

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

(oczywiście, jeśli zawsze uruchamiasz evil-mode i zawsze masz zainstalowane evil, nie ma potrzeby automatycznego ładowania rzeczy, ale wolę mieć swój .emacs jest na tyle ogólny, że mogę go używać na maszynach ze starym emacsenem lub bez zainstalowanych pakietów elpa.)

 0
Author: unhammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 10:25:25