私は何年もの間Vimをプライマリエディタとして使用しており、その間にEmacsを数回試しました。それから私はEvilを発見し、それが私が最終的にEmacsに移ることができるように十分にスピーディーな動きに対する私の要求を満たしていると判断しました。
では、すべてのEvilユーザーにとって、それを通常のEmacs機能とどのように統合しますか?このモードと他のモードとの間に競合が発生しましたか?このトピックに関する共有に値する経験/ヒントは何ですか?
私は何年もの間Vimをプライマリエディタとして使用しており、その間にEmacsを数回試しました。それから私はEvilを発見し、それが私が最終的にEmacsに移ることができるように十分にスピーディーな動きに対する私の要求を満たしていると判断しました。
では、すべてのEvilユーザーにとって、それを通常のEmacs機能とどのように統合しますか?このモードと他のモードとの間に競合が発生しましたか?このトピックに関する共有に値する経験/ヒントは何ですか?
私は高度にカスタマイズされたvimを使用しましたが、今ではさらにカスタマイズされたemacsを使用しています。キーマッピングのすべてのインスタンスは、私のキーマッピング構成ファイルhttps://github.com/mbriggs/.emacs.d-oldv2/blob/master/init/init-keymaps.elにあると思います。
覚えておいてください、私は本物のemacsユーザーが異端だと考えるものを再バインドしているので、「本物の」emacsを学びたいと思ったらYMMV(私は本当にしません)。
元ビマーに私がお勧めすることの1つはこれです
;;; 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が実際にほとんどすべてを終了するようにします(ミニバッファーで保留中のプロンプトなど)
emacsから来て、vimを試し、得るものがたくさんあることに気付いた私は、最初に悪を使い始めたとき、たくさんの実験をしました。以下は物議を醸すものですが、ターミナル、Firefox、ココアなどでより一般的に使用されているemacsキーを保持したかったのですが、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の「1画面上または下に移動」操作と重複しています。ただし、代わりに次のものを使用することに慣れています。
(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」(または他の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)
また、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 / c ++で実際に機能するタブ設定など、その他の非常に優れた関数の実装については、次を確認できます。https://github.com/Russell91/emacsで、私のgitの完全な.emacs、init.el、my-keymaps.el、およびmy-functions.elバージョンを確認してください。
私はまた、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とは対照的です。
私は1か月前にEvilを使い始めました。その前に、私はあまり成功せずにviper/vimpulseを使おうとしました。正直なところ、vimpulseは非常に優れていますが、さまざまなモードで使用するのは少し面倒でした(たとえば、vimpulseが常に狂ったコンパイルモード)。
私がEvilに切り替えたとき、私はついにEmacsの完全なパワーを探求し始めました、そして私を信じて、私は後悔しませんでした。Evilは、私が使用したすべてのモード(主に編集、コンパイル、スクラッチ、eshell)でうまく機能し、info / man/helpを読んでも問題なく機能しています。
それを除いて、:b-TAB-then-complete-nameまたは:bnの代わりに:b <0-9>を実行していたので、バッファスイッチングが奇妙であることがわかりました。ただし、Evil開発者は(場合によっては)重複する機能を削減しようとするため、代わりに:!(シェルコマンドを実行するには)ネイティブM-!を使用する必要があります。
カスタムexコマンドを追加/再定義したい場合は、evil-maps.elを開いて編集してください(vimで試してみてください)。
Evilはまだ若いですが、有望なプロジェクトであり、公式のEmacsディストリビューションでviperに取って代わる日を待っています。
:を終了するときにバッファを保存するのが好きinsert-mode
です(編集:スクラッチやmagitバッファの場合など、このバッファに関連付けられたファイルがない場合は保存を要求しないでください)
(defun my-save ()
(if (buffer-file-name)
(evil-save))
)
(add-hook 'evil-insert-state-exit-hook 'my-save)
その他の可能性については、http ://wikemacs.org/index.php/Evilを参照してください。
コメントは改善のために歓迎します!
私はevil-leaderを使用し、「Mx」の代わりに「、xm」を使用しているため、Altキーを押すことはめったにありません。複数のリーダーキーをサポートするgeneral.elもあります。
evil-matchit、「%」を押してタグペア間をジャンプします。
evil-nerd-commenter、「9、ci」を押して9行をコメント/コメント解除します
ESCキーの使用は避け、代わりに「kj」を押すことができます。
自由ソフトウェアを信じてください!VimとEmacsのパワーを組み合わせたEvilでは不可能なことは何もありません。たとえば、多くの人は、Evilキーバインディングは、大量の再バインディングなしで既存のプラグインEmacsと競合すると想定しています。それは実際には間違っています
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が好きです。
以前は、vimで学んだように、キーコードを使用してjkをESCにマッピングしていましたが、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-surround-modeなどに使用すると、プレーンに配置するのに役立ちませんevil-mode-hook
。したがって、package-installを使用してevilとevil-surroundをインストールする場合は、次のことを実行することで、開始することができますM-x evil-mode
。
(eval-after-load "evil-surround-autoloads"
'(add-hook 'evil-local-mode-hook #'evil-surround-mode))
(もちろん、常にevil-modeを実行し、常にevilをインストールしている場合は、そのautoloadのものは必要ありませんが、古いemacsenを備えたマシン、または何も持たないマシンで使用できるように、.emacsを十分に一般的にすることをお勧めします。 elpaパッケージがインストールされています。)