關於大家都會的配置文件的架構

這一期講配置文件的架構,相對前幾期的文章來講,乾貨要少一些——一方面我用的是原生的 Emacs,不涉及到 Layer 的概念,另一方面我安裝的包非常少,除了語言相關的插件外,只有一個 ample-theme,一個 highlight-symbol,和一個 magit,所以也不會涉及到延遲載入。但是呢,由於這個專欄的名字叫做 "Ghost in Emacs",那自己所親手調教的 Ghost 是以怎樣的方式存在於 Emacs 里,無疑是一個不能迴避的話題,所以這裡不得不獻醜了。

首先,Emacs 默認的配置文件,是位於電腦上 ~/.emacs.d/ 目錄下的一個叫做 init.el 的文件,".el" 這個後綴代表該文件使用的是 Emacs-Lisp 語言。新人常見的配置,無非就是設置一下啟動信息,編輯界面,自動縮進,顯示行號,括弧自動匹配,默認編碼等等。但是當用戶自定義的函數、宏、hook 和快捷鍵多起來了之後呢,為了便於管理和查看,就有必要把它們分散到若干個角色不同的文件里。對我而言,這些文件分別是:

init.el ——位於系統默認路徑下的配置文件,其內容只有一行

(load "d:/sync/emacs.d/load.el")n

然後通過 load.el 這個文件,重新定義 Emacs 里的用戶路徑和 load-path

;; buffern;; fontn;; framen;; languagen;; startupn;; windownn;; ~loadn(setq default-directory "d:/sync/")n(add-to-list load-path "d:/sync/emacs.d/")n(load "defun.el")n(load "kbd.el")n(load "hook.el")n

其中,buffer font frame language startup window 分別指相關的配置代碼,具體我就略過了,最後的這個 ~load 最重要,分別重新設置了 Emacs 的默認路徑,添加了新的 load-path,然後把我自定義的各種玩意兒,按照函數/宏,快捷鍵,hook 三個分類分別放到了 defun.el, kbd.el, hook.el 三個子文件中去。

之所以要設置這樣一個 load.el 而不是把它們的內容直接放到 init.el 里,是因為我需要在多個不同的電腦里同步 Emacs 的配置,但是呢,我又不希望在同步配置文件的時候,把其他插件的安裝包也給同步了(避免臃腫和衝突)。所以這裡我手動設置了 init.el ,然後只同步 load.el 及其之後的文件:

defun.el ——裡邊包含我所定義的各種函數/宏/命令,格式分別為

(defun f-come-function (args)n ... ...)n(defmacro m-some-macro (args)n ... ...)n(defun c-some-command (args)n (interactive)n ... ...)n

很多時候,人們自己寫函數,都是為了將它綁到某個快捷鍵上,一般都直接寫在一起,例如

(defun c-some-command (args)n (interactive)n ... ...)n(global-set-key (kbd "A") c-some-command)n

但是,如果你經常修改命令或者快捷鍵的話,你或許會覺得把它們分開存放更便於管理。所以我特地設置了一個用於存放快捷鍵命令的文件—— kbd.el,在裡邊我定義了兩個 Minor-Mode 和一系列快捷鍵

(define-minor-mode number-moden ... ...)n(define-minor-mode visual-moden ... ...)n(global-set-key ... ...)n(m-map-key ... ...)n

其中相當一部分快捷鍵設置所需要的命令,都提前在 defun.el 中定義好了。

最後一個是 hook.el ——用於存放各種語言或者插件(內置的以及下載的)的設置和 hook,以 python 為例

(defun f-python-mode ()n ... ...)n(add-hook python-mode-hook f-python-mode)n

還有一些 minor-mode-map 的設置例如

(define-key edmacro-mode-map (kbd "C-x C-k RET") kill-this-buffer)n

以及主題設置

(load-theme ample t)n

這裡需要注意的是,在設置各種 hook 之前,必須要對 package.el 進行初始化設置

(package-initialize)n

其他插件的設置才能正常執行。另外,如前文所說,由於我需要在多個電腦上同步配置,但是又不想同步所有下載的插件包,那當我換了一台新電腦之後,就得有一種機制去自動檢測我所需要的各種包是否正常安裝了——這件事情好像有很多辦法去做,這裡我自己寫了個函數

((lambda (&rest packages)n (dolist (pkg packages)n (unless (package-installed-p pkg)n (when (y-or-n-p (format "Package "%s" not found. Install it? " pkg))nt (package-install pkg)))))n ample-themen essn ghcn highlight-symboln magitn markdown-moden matlab-moden )n

放在 (package-initialize) 之後就好了。

以上就是這一期的無聊內容,寫完覺得鬱鬱寡歡好想睡覺。下一期我們再講一個非常好玩非常實用的主題:正則替換和宏操作。具體內容為——增量的正則替換(替換成等差數列),列表的正則替換 (替換為指定的列表),重複替換(每一種不同的替換都重複執行 n 次後再進行下一種),以及對原生 kmacro.el 的改造和優化,順帶的也把 cua-mode 里的 cua-sequence-rectangle 給升級了一下下。

(冷漠臉,不知道為什麼好想躺屍。。。。。。


推薦閱讀:

Emacs常見鍵綁定方式匯總
對於新手來說 如何用atom搭建python的ide?
atom的active-power-mode插件能關掉窗口抖動嗎?
VSCode、Atom和Sublime為什麼不支持代碼標籤成對摺疊呢?
VScode如何根據不同文件類型設置諸如tab的長度、ruler位置等選項?

TAG:Emacs | Lisp | 文本编辑器 |