ZeroEmacs: 从零配置你的Emacs

终于有人闲的从零开始折腾Emacs配置了 :kissing_smiling_eyes:
我想要不要引入一些工具,比如use-package来简化这个配置
配置文件要不要切分成

  1. 编程语言相关
  2. 代码补全相关
  3. 一些插件
  4. 图形界面
  5. 自定义设置custom
  6. 其他杂项

其实不需要 use-package,就用 define-key, with-eval-after-load, require, autoload 之类的就可以。

我有个视频讲到这个,下面是一个实例:

3 个赞

开启counsel-mode后,类似find-file和counsel-find-file功能上应该差不多了吧,不需要用counsel-find-file来替换find-file?

1 个赞

是直接remap掉了一大部分

(defvar counsel-mode-map
  (let ((map (make-sparse-keymap)))
    (dolist (binding
              '((execute-extended-command . counsel-M-x)
                (describe-bindings . counsel-descbinds)
                (describe-function . counsel-describe-function)
                (describe-variable . counsel-describe-variable)
                (describe-symbol . counsel-describe-symbol)
                (apropos-command . counsel-apropos)
                (describe-face . counsel-describe-face)
                (list-faces-display . counsel-faces)
                (find-file . counsel-find-file)
                (find-library . counsel-find-library)
                (imenu . counsel-imenu)
                (load-library . counsel-load-library)
                (load-theme . counsel-load-theme)
                (yank-pop . counsel-yank-pop)
                (info-lookup-symbol . counsel-info-lookup-symbol)
                (pop-to-mark-command . counsel-mark-ring)
                (geiser-doc-look-up-manual . counsel-geiser-doc-look-up-manual)
                (bookmark-jump . counsel-bookmark)))
      (define-key map (vector 'remap (car binding)) (cdr binding)))
    map)
  "Map for `counsel-mode'.
Remaps built-in functions to counsel replacements.")
1 个赞

我也有个配置用来测试新package/以及qa提bug用 :joy:
如果嫌use-package 太重了 可以参考一下purcell的require-package这个函数

;;; On-demand installation of packages
    (require 'cl-lib)
    (defun require-package (package &optional min-version no-refresh)
      "Install given PACKAGE, optionally requiring MIN-VERSION.
    If NO-REFRESH is non-nil, the available package lists will not be
    re-downloaded in order to locate PACKAGE."
      (or (package-installed-p package min-version)
          (let* ((known (cdr (assoc package package-archive-contents)))
                 (versions (mapcar #'package-desc-version known)))
            (if (cl-find-if (lambda (v) (version-list-<= min-version v)) versions)
                (package-install package)
              (if no-refresh
                  (error "No version of %s >= %S is available" package min-version)
                (package-refresh-contents)
                (require-package package min-version t))))))
1 个赞

引用下 redguardtoo 用来测试 package 的最小配置

我觉得,既然是从零配置,每添加一个功能,最好能阐述理由。

在Emacs中,bookmarks是中央控制台,是交通指挥枢纽,是机场的塔台,是Navigation Control Center,是我们随身携带的地图。

应用ZeroEmacs得心应手,如回家一般的熟悉,自己的各种瓶瓶罐罐摆放在何处,应该将bookmarks从doom迁移过来。

(setq bookmark-default-file "~/.doom.d/bookmarks")

load-file 加载之后,无论在哪种配置上,都稳坐指挥台。

ZeroEmacs目前的所有配置:

(setq user-emacs-directory "~/.zeroemacs/")

(add-to-list 'load-path "~/.zeroemacs/elpa/ivy-0.13.1/")
(add-to-list 'load-path "~/.zeroemacs/elpa/counsel-0.13.1/")
(add-to-list 'load-path "~/.zeroemacs/elpa/swiper-0.13.1/")

(require 'ivy)
(require 'swiper)
(require 'counsel)

(ivy-mode 1)

(global-set-key "\C-s" 'swiper-isearch)
(global-set-key (kbd "M-x") 'counsel-M-x)
(global-set-key (kbd "C-x C-f") 'counsel-find-file)
(global-set-key "\C-xb" 'ivy-switch-buffer)

;; Set bookmarks
(setq bookmark-default-file "~/.doom.d/bookmarks")

(provide 'config)
;;; config.el ends here

楼主怎么不用 (package-initialize),否则每加一个包都要 add-to-list 'load-path 包路径一次再 require 一次,包少还好,包多了还是有点麻烦的。

是不是用了(package-initialize)但是没生效,还是有其它目的

谢谢,之前不知道 package-initialize 这个函数。

01 哈哈,每次配置崩了,就要瞬回一次蛮荒时代,简直没法想自己是怎么调教成功这个小怪兽的

1 个赞

今天也是, doom 因为网络的原因差点没重装好,才体会到有点基本配置做家底真很nice,至少能倒退回青铜和铁器时代。

设置好Emacs最高频的应用bookmarks这个中央控制台和全局地图,同时也要配置好查看每个街区的局部地图工具 dired。

dire默认开启状态,展示文件的全部信息:

这对文件的打开,查找,重命名带来不便,因此按键 ( 调用 dired-hide-details-mode 将详情关掉。

;; Set dired
(add-hook 'dired-mode-hook #'dired-hide-details-mode)

设置好bookmarks和dired,全局的工作告一段落。

顺带手给ZeroEmacs创建快捷启动 alias

# zeroemacs from terminal
alias zemacs="emacs -nw -Q -l ~/.zeroemacs/config.el"
# zeroemacs from GUI
alias zeroemacs="emacs -Q -l ~/.zeroemacs/config.el"

在加载每个文件的时候错误处理一下,

在编辑evil模块相关文件前开个emacs-server,

或者维护一份vim配置,问题还是挺小的(逃

dired似乎不太好定制,我好久以前发过一贴问 如何定制dired显示的内容 最后也没搞定,我只看 |名称|修改日期|大小| 这三个,并且文件名要显示在第一列,文件名显示在所有文件信息的最后面才看到,这个总感觉不符合直觉(除了dired外,我常用的其它各种文件管理器,任务管理器都是以文件名称为第一列), 现在用org-mode自已整了一个 org-mode超链接文件的打开方式 org-file-apps - #2,来自 wsug

1 个赞

我是自己从零调教的,所以瞬回上古真心往事不堪回首,真是在Emas上浪费太多时间了啊 :rofl:

1 个赞

+1,我通常用daemon+emacsclient,正常app启动仅仅用来调试,不然真是瞬间连开个文件困难(我还Emacs里映射交换了Cmd和Ctrl,崩了真是手指完全打架)

1 个赞

厉害,刚接触的时候从零开始太难了。很早就听说过spaceemacs,但是spaceemacs对键盘毫无逻辑的魔改,屡次劝退了想要学习使用的热情;Spaceemacs用户平常很少用其工作,他们日常用jetbrain和vscode,只是人前炫技的时候用,所以当时对emacs的感觉就是花里胡哨。

之后机缘巧合用了prelude开始上路,直到用了doom切到高速路。

从零开始配置emacs能坚持到现在,真牛人,普通人早就劝退了。

1 个赞

好多人是从知道spaceemacs开始知道了emacs。但是当打开spaceemacs的时候,打开emacs-manual只有两眼一抹黑,键位完全不对应,驴唇马嘴。只能转而去读spaceemacs的手册。

于是,包括我在内的很多人,在没有弄清楚spaceemacs只是emacs的一个畸形配置之前,就怀抱着怎么会有a-emacs,b-eamcs,c-emacs这么多乱七八糟的emacs的疑惑离开了。

doom 的键位还是蛮合理的, 但编辑时时不时卡顿。 所以自定义一份还是必要的。 满足基本需求。

2 个赞