Я использую Vim в качестве основного редактора в течение многих лет и несколько раз пытался использовать Emacs за это время. Затем я обнаружил Evil и решил, что он удовлетворяет моему требованию относительно быстрого движения достаточно хорошо, чтобы я мог наконец перейти к Emacs.
Итак, для всех вас, злых пользователей, как вы интегрируете его с нормальными функциями Emacs? Вы столкнулись с конфликтами между этим режимом и другими? Каковы ваши опыты/советы по этой теме?
Ответ 1
Я использовал специально настроенный vim, и теперь использую еще более настроенные emacs. Я думаю, что вы найдете каждый экземпляр keymapping в моем конфигурационном файле keymapping https://github.com/mbriggs/.emacs.d-oldv2/blob/master/init/init-keymaps.el
Имейте в виду, я переписываю вещи, которые настоящие пользователи emacs рассматривали бы ересь, поэтому YMMV, если вы когда-нибудь захотите изучить "настоящие" emacs (я действительно этого не делаю).
Одна вещь, которую я бы рекомендовал любому ex 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 фактически почти что-то оставляет (например, ожидающие запросы в минибуфере)
Ответ 2
Как кто-то, кто пришел от emacs, попробовал vim и понял, что есть огромное количество вещей, я много экспериментировал, когда впервые начал использовать зло. В то время как следующие противоречивы, я хотел сохранить ключи emacs, которые используются более универсально в терминале, firefox, cocoa и т.д...., но не захотели потерять возможности редактирования vim. Я решил решить переустановить следующие ключи в моем .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)))))
К сожалению, они перекрываются с операциями vim "перемещать один экран вверх или вниз". Тем не менее, мне стало удобно использовать следующее:
(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)
))
Кроме того, если вы отправляетесь из vim и хотите быстрый путь от вставки к нормальному режиму с помощью "jk" (или любой другой комбинации с двумя штрихами), лучший способ - скопировать текст из 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)
Кроме того, если вы пришли из vim и думаете, что копирование в буфер обмена в emacs не подходит, вы, вероятно, правы. Однако после запуска 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, использование счетчиков для спецификации реестра папок, настроек табуляции, которые фактически работают для c/С++ и т. вы можете проверить полные файлы .emacs, init.el, my-keymaps.el и my-functions.el на моем git на https://github.com/Russell91/emacs
Ответ 3
Я также был пользователем Viper/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))
У вас возникли конфликты между этим режимом и другими?
Нет, в отличие от Viper/Vimpulse, который вызывал проблемы в нескольких режимах.
Ответ 4
Я начал использовать Evil месяц назад; перед этим я пытался использовать viper/vimpulse без особого успеха. Честно говоря, vimpulse довольно приятный, но использование его в различных режимах было немного затруднительным (например, режим компиляции, когда vimpulse всегда сходил с ума), оставляя emacs в некотором режиме между vi-emacs-something.
Когда я переключился на Evil, я, наконец, начал изучать полную силу Emacs, и поверьте, я не пожалел. Зло прекрасно работает во всех режимах, которые я использовал (в основном, в редактировании, компиляции, скрежете и неэше), и даже чтение информации /man/help работает без проблем.
Кроме того, я только обнаружил, что переключение буфера было нечетным, как я делал: b < 0-9 > вместо: b-TAB-then-complete-name или: bn. Обратите внимание, однако, что разработчики Evil (в некоторых случаях) пытаются уменьшить дублирующиеся функциональные возможности, поэтому вместо этого:! (для команды exec shell), вы должны использовать собственный M -!.
Если вы обнаружили желание добавить/переопределить некоторые пользовательские команды ex, просто откройте evil-maps.el и отредактируйте его (попробуйте в vim!).
Зло еще молодой, но перспективный проект, и я жду того дня, когда заменит гадюку в официальном дистрибутиве Emacs.
Ответ 5
Мне нравится сохранять буфер при выходе из 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
Комментарии приветствуются для улучшения!
Ответ 6
-
Я использую evil-leader и использую ", xm" для замены "M-x", поэтому я редко нажимаю клавишу Alt. Существует также general.el, который поддерживает несколько ключей лидера.
-
evil-matchit, нажмите "%" для перехода между парой тегов.
-
evil-nerd-commenter, нажмите "9, ci", чтобы прокомментировать/раскомментировать 9 строк
-
избегайте использования клавиши ESC, вы можете вместо этого нажать "kj" .
-
Имейте веру в бесплатное программное обеспечение! Нет ничего невозможного с Злом, которое объединяет силу Вима и Эмакса. Например, многие люди предполагают, что привязки клавиш Evil конфликтуют с существующими плагинами Emacs без тяжелой перевязки. Это действительно неправильно
Ответ 7
Исходя из 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
)))
Кроме того, мне нравятся плагины evil-surround (хотя я считаю, что smartparens - более полное решение) и evil-leader.
Я использовал key-chord для отображения jk в ESC, как я научился делать в vim, но он настаивал на том, чтобы рассматривать 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)
, который не очень vimmy (хотя, возможно, вы тоже можете сделать свой 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 были достаточно общими, чтобы я мог использовать его на машинах со старым emacsen или без каких-либо пакетов elpa.)