感觉我自己其实上手时, 一个很大的动力, 就是因为我发现这是 我知道的第一个 可以随意更改快捷键的编辑器, 真的没有任何限制 …, 而我, 我非常想要一个随心所欲, 操作(主要是移动光标) 不需要该死的鼠标的编辑器.
就像很多初次接触 Emacs 的人那样, 觉得 Emacs 很多默认快捷键太奇怪, 因此就开始改, 然后, 刚开始的好多天, 我就光思考 怎样更改快捷键, 什么操作该用那个快捷键 之类的定制思路了, 每次换绑一个快捷键, 就带来极大的成就感 (大家应该懂的, 不是被动的接受, 而是努力去改变!)
然后就按照自己的方式去用 (老实讲, 到这一步, 我感觉 Emacs 的学习曲线真的比 Vim 容易太多了).
我先把我这个快捷键方案玩熟, 再往后, 就是在 baidu 上找各种定制, 例如大家都知道的, 什么显示中文年份(甲午)之类的, 各种配置玩的不亦乐乎,虽然, 我完全不知道这些改动在什么地方生效, 也可以慢慢用一些插件, 好在我学 Emacs 算是比较晚了, 当时 Emacs 23 刚出来, 已经解决了中文编码的问题.
后来, 随着用的时间更多, 发现大把的快捷键冲突. (因为我更改了太多的快捷键, 违背了 Emacs 一些不成文的规定), 然后你会发现, 只要引入一个插件, 你就需要定制一番才能用, 所以, 后来, 大部分默认快捷键, 还是逐渐回归了. (当时很多自己加入的额外的快捷键, 还是保留的)
多年下来, 在别的编辑器上看到的, 或者自己搜到的, 很多插件加入了进来, 我从来不用包管理(虽然我会用), 我都是直接在 github 上下载 ???.el
插件, 有问题也会主动提 issue. (我觉得我提的有关 emacs 的 issue 相比较其他分类, 应该是最多的) 那么多插件, 有的用的很熟了, 而有的, 花好大劲儿配置好, 要么用不好, 要么感觉用不到, 后来发现 aesome-emacs 之后, 发现其实自己在用的, 大部分也是大家在用的.
最后针对小白普及下 Emacs 下面怎么换绑快捷键, 也算是针对我这种上手方式的一个总结:
;; 如果你希望全局换绑快捷键, 例如: 所有模式下 Ctrl+f 换成 Ctrl+l
(define-key key-translation-map [(control f)] [(control l)])
;; 如果你希望全局定义一个快捷键, 用 global-set-key (但在特殊模式下, 有可能被该模式自定义绑定覆盖)
(global-set-key [(control right)] 'transpose-current-char) ;光标前所在字母右移
;; 特定默认下设定快捷键, 要在特定的 hook 下, 定义特定的 map. (需要自己去源码里找, 找 -hook, -map 关键字即可.)
(add-hook 'isearch-mode-hook
'(lambda ()
(define-key isearch-mode-map [(control b)] 'isearch-delete-char)
))
然后, 最近对我自己这些年积攒下来的插件做了一个彻底的清理, 然后, 配置文件清凉了不少.
这里也贴一下我的 init.el
的内容, 也方便大家了解(至少对我来说)有哪些常用的包. (我没有用包管理来下载, 都是自己
提前下载好的, 每个包一个目录, 包含这个包相关的一个或数个 el 文件, 外加一个我写的 _init
结尾的配置文件,
所有的目录会动态的加入 load-path
;; -*-Emacs-Lisp-*-
;; ------------------------------显示相关设置------------------------------
(setq custom-theme-directory (expand-file-name "plugins/themes" default-directory))
;; (load-theme 'zenburn t)
(load-theme 'zerodark t)
;; Optionally setup the modeline, 需要 magit 才可以用.
;; (zerodark-setup-modeline-format)
;; ==============================开启的功能==============================
(relative-load "keybindings.el")
(relative-load "autoloads.el")
(require 'org-mode_init)
(require 'ibuffer_init)
(require 'ido_init)
(require 'dired_init)
;; 下面两个库都针对 kill-ring-save, kill-region 等函数添加了 device.
;; 因为判断选区时, 总是首先判断 rect-mark, 因此要确保 rect-mark_init 在
;; browse-kill-ring 之后 require, 行为才正确.
(require 'browse-kill-ring_init)
(require 'rect-mark_init)
(require 'yafolding_init)
(require 'super-save_init)
;; (require 'workgroups_init)
(require 'mark-lines_init)
(require 'avy_init)
(require 'beacon_init)
(require 'which-key_init)
(require 'fill-column-indicator_init)
(require 'zoom-frm_init)
;; (require 'spaceline_init)
(require 'smart-mode-line_init)
(require 'flycheck_init)
(require 'neotree_init)
(require 'move-dup_init)
;; (require 'aggressive-indent_init)
(require 'auto-indent-mode_init)
(require 'edit-server_init)
(require 'markdown-mode_init)
;; FIXME: 尝试 require 文件,没有也不失败。
(require 'auto-complete_init)
(require 'yasnippet_init)
(require 'iedit_init)
(require 'undo-tree_init)
(require 'toggle-quotes_init)
(require 'tabbar_init)
(require 'helm_init)
;; ============================== 编程相关 ==============================
(require 'mode-compile_init)
(require 'smart-tags-jump_init)
(require 'highlight-indent-guides_init)
(require 'highlight-escape-sequences_init)
(require 'feature-mode_init)
(require 'rainbow-delimiters_init)
(require 'yaml-mode_init)
(require 'git-emacs_init)
(require 'git-gutter_init)
(require 'gist_init)
(require 'rvm_init)
(require 'enh-ruby-mode_init)
(require 'ruby-test-mode_init)
(require 'robe-mode_init)
(require 'yari_init)
(require 'web-mode_init)
(require 'scss-css-mode_init)
(require 'js2-mode_init)
(require 'rust-mode_init)
(require 'go-mode_init)
;; 加载 dotfiles 时,阻止 gc.
;; (when (file-exists-p (expand-file-name ".emacs" config))
;; (let ((gc-cons-threshold 20000000))
;; (load ".emacs")))
EDIT:
想起个事情, helm , 我想这个插件大名, 应该无人不知, 无人不晓吧? 了解的人应该也知道, 这个项目堪称 emacs 社区的一个模范项目, 遇到问题, 作者总是第一时间回应, 当然这也应该是 Emacs 社区特别成功的 开源项目之一了吧.
但是维护这个项目花费了作者太多的时间, 现在这个作者在募捐, 默认是 20 欧, 数字你可以改, 币种也可以改, 我就改成了 $10 , 我觉得不在多, 关键在于态度, 请每一位力所能及的 emacser 都尽一份力.