以你多年的经验,请写出一个新手学习emacs的路线建议。


#1

以你自己的体会,写一下你认为应该怎么学emacs,如果让你教一个新手,你建议他怎么学。

好吧,其实我就是哪个新手,请大佬们指教!


#2

先读陈斌的一年一文, 虽然某些方面语气的确有点不讨人喜欢, 但是大部分的确写的很好.

还有就是尽量用linux, 其次就mac, 在windows下免不了各种折腾的… 因为Emacs只有配套上各种套件一起使用才有威力(e.g. Ripgrep, TeX, Git等等…)然而这种工具在windows下总会有各种各样的问题

新手可以考虑Spacemacs开箱即用, 或者直接抄purcell的配置. 陈斌本人的配置我看起来总觉得有点混乱, 不如purcell的清爽. 推荐Spacemacs是因为好看, 功能多, 还可以体验一下Vim的操作方式(By Evil ). 总不能遇到个新人就用丑不拉几的界面把人家劝退了吧


#3

新人的话说什么都没用啊,都会吓跑的。我就是吓跑之后又转悠回来的那种,和大神的区别是,我用emacs just for fun,偶尔写下脚本(公司要求win上开发),如果你想认真学好,我建议你听大神的,如果你想玩,可以看看我 stanhe 。没准你被吓跑了,很久之后想起有些功能可以自己实现就又回来了呢,like me 。:joy:


#4

先读本书 《 一万小时天才理论》


#5

我没教别人用过 Emacs,所以只能按照自己的经验来建议。

我学 Emacs 的方式跟很多人(比如陈斌)建议的不一样,我是把 Emacs 自己一点点配置起来的,我觉得用这种方式,才会对 Emacs 和各种插件了解得更透彻。

  • 上手

    打开 Emacs 之后,会看到一个 GNU Emacs 的 logo,下面写着:

    “Welcome to GNU Emacs, one component of the GNU/Linux operating system.”

    再往下是 Emacs Tutorial, Emacs Guided Tour … 等等。

    点开其中的 Emacs Tutorial, 从头到尾,边看边按照指示操作,熟悉 Emacs 的按键模式。

  • 进阶

    然后就开始在实际使用 Emacs 的过程中,不断解决问题,不断提高。

    比如你发现每次 find-file 很麻烦,要解决这个问题,发现 https://github.com/emacs-tw/awesome-emacs 上面列出了 ido, helm, ivy 等等解决方案,比较一下,试一试,然后加入到自己的配置当中。

    这样做的好处,是你对加进来的每个插件,都进行了一番审视,对其功能也就更加了解,出问题时也更容易定位。

    tips:

    • 读到不清楚的 Emacs 相关概念时,比如 buffer/frame/window,建议读一下相关文档,补全知识体系
    • 建议用 git 管理配置,插件可以用 git submodule 管理
    • 我自己在重新构建自己的 Emacs 配置,git history 目前还比较清晰,可以参考一下:https://github.com/RenWenshan/wenshan-emacs/commits/master
  • Emacs Lisp

    这一步可以跟上一步同时进行,Emacs 的核心优势,就是可以用 Emacs Lisp 快速解决很多问题,用 Emacs 却不学 Emacs Lisp 是很可惜的。

    • 读 Emacs 自带的 An Introduction to Programming in Emacs Lisp (M-x info 里能找到)
    • 建议读 Writing GNU Emacs Extensions,学写 Emacs 插件

    到这一步,在 Emacs 里就很舒适了。


#6

天天用就行,尽量用它完成各种编辑工作,当然,实在不方便的也不必强求,像 Java 这类的非要用 Emacs 来搞,那完全就是找虐!


#7

找个不错的配置经常用,比如spacemacs,使用过程中一点点发现它的功能,说不定哪天就喜欢上了,同时可以尝试加一些自己想要的小功能,有点像谈恋爱。

我以前用的时候,还没有spacemacs这样的东西,基本是从石器时代过来,感觉走了不少弯路。


#8

我八年前(35岁时), 转行从事软件开发 (之前一家国企抄表员), 而我打算转行时, 做的第一件事, 就是玩 Emacs.

事实上, 刚开始, 我在 Windows 下玩的(那时候, Linux 完全是个小白), 足足折腾了有三四个月, 然后这么多年下来, 除了我上班的本职工作(Ruby 程序员), 玩的最多的就是我的 Emacs 编辑器了, 到现在都八年了, 自己写的配置文件, 从一开始很少, 到后来一大堆, 再到现在精简再精简(虽然还是有挺多), 虽然感觉自己对 elisp 还是小白, 整个 elisp 的生态也没有很熟, 但是这么多年下来, 好歹算是玩出感觉了 …

我刚开始用那会儿, 好像只有王垠写过几篇文章介绍 Emacs 好像, 在然后, 就几乎没有在看任何中文相关的 emacs 资料了, 还专门打印了一本 emacs 的 guides (好象是这个名字?), GNU 网站可以免费下载 pdf 的那本, 不过, 最后几乎没看.

还要提下用 Emacs 的一大红利:

github 上我见过的大部分 emacser, 都是真真正正的 顶尖 高手, follow 一个用 emacs 的 guy, 你会 get 到很多好玩的东西, 因为他们通常都是其他某个领域真正的专家. (我不算), 国内我想一定也是这样吧, 这个 社区藏龙卧虎, 大神应该也不少, 前两个月, 我记得看了个新闻, Deepin 的首席技术总监 王勇离职了, 并且宣称要回归 emacs 社区, 他应该也在我们这个国内社区内吧. 哈哈

所以, 我的建议和 wenno 一样, 刚开始抄点, 后来,只能靠慢慢自己配置, 摸索.


#9

那你认为,新手应该怎么学才能更有效率,更快上手呢?


#10

王勇不就是本论坛的manateelazycat吗. 你还回复过他的帖子呢, 哈哈


#11

感觉我自己其实上手时, 一个很大的动力, 就是因为我发现这是 我知道的第一个 可以随意更改快捷键的编辑器, 真的没有任何限制 …, 而我, 我非常想要一个随心所欲, 操作(主要是移动光标) 不需要该死的鼠标的编辑器.

就像很多初次接触 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 :smile: , 我觉得不在多, 关键在于态度, 请每一位力所能及的 emacser 都尽一份力.


#12

好吧, 果然大神在此, 拜膜一下, 哈哈

顺便说一句, 单位电脑一直在用 Deepin, 支持国产!


EDIT: 好吧, 其实我 Github 有 follow 他, 我说这名字, 感觉有点熟 …


#13

image


#14

看 emacsrock 的视频 http://emacsrocks.com/