省時省力寫 LaTeX: 新手Emacs快速配置與插件管理

承接上期五分鐘說服你用Emacs寫LaTeX, 在本期我將帶領(lǐng)大家進行用于 LaTeX 寫作的 Emacs 基本配置, 講解從軟件安裝到插件管理的全過程. 最后將給大家推薦兩組非常實用的插件: 第一組插件 which-key + keycast + helpful 將幫助我們快速熟悉 Emacs 的操作和概念, 第二組插件 vertico + marginalia + orderless 將有效提升我們在小緩沖區(qū)的補全體驗, 并附上 cdlatax 和 AucTeX 的基本設(shè)置.
Table of Contents
Emacs 安裝
Emacs 可以在 Windows, Linux, MacOS 全平臺上運行, 甚至在 Android 上也可以通過 termux 等命令行工具使用. 2023年4月底的最新的正式版本 28.2, 但下一版本的測試版版本號已經(jīng)來到了29.090, 不日也將正式發(fā)布. 下面介紹的安裝方法主要針對的是最新正式版.
無論在什么平臺上, Emacs 的安裝通常是利用開源軟件管理器實現(xiàn)的. 在 Windows 和 MacOS 上大家就需要自行安裝這樣的軟件管理器. 我們下面詳細(xì)說明.
Linux
Linux 系統(tǒng)用自帶軟件管理器就可以安裝 Emacs. 比如, 在 Ubuntu 上我們可以使用 apt. 安裝 Emacs 只需要在命令行中輸入
MacOS
蘋果電腦上我們需要先安裝 Homebrew (官網(wǎng): https://brew.sh/). 安裝方法是在命令行中輸入
當(dāng) Homebrew 安裝成功后會有提示. 這時候用可以利用 Homebrew 安裝 Emacs 了. 只需要在命令行中輸入
Windows
Windows 下安裝 Emacs 主要有兩種方法. 第一種是從這里: https://www.msys2.org/安裝并下載 msys2, 安裝結(jié)束后打開它的 mingw64.exe 命令行 (默認(rèn)目錄是 C:/msys64/) 并輸入
通過 msys2 安裝的好處是上面還可以很方便安裝其它開源軟件, 如 git, epdfinfo 等. 在 BV1pg4y1s7Z9 中我們就利用 msys2 配置了 pdf-tools. 這是 Emacs 中一款很好用的 pdf 閱讀器.
另一種安裝方法是直接從官網(wǎng): http://ftp.gnu.org/gnu/emacs/windows/emacs-28/上下載安裝包. Emacs 28 的安裝包已經(jīng)優(yōu)化了不少, 會自動把程序安裝至
安裝 Emacs 后的額外設(shè)置
在安裝完 Emacs 之后, 我強烈推薦大家在你使用的機器上交換 <大寫鎖定鍵> 與 <control>. Emacs 常常使用 以 <control> 開始的快捷鍵. 在 Emacs 誕生之初時通用的鍵盤, <control> 確實是在當(dāng)今鍵盤 <caps lock> 的位置的. 交換這兩個鍵的具體操作在不同系統(tǒng)上也不一樣.
在 Windows 下我們需要去修改注冊表. 方法如下
<Win> + r 輸入 regedit 打開注冊表
找到 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
打開或新建 Scancode 文件, 把內(nèi)容修改為
保存 Scancode 文件并重啟電腦
在 Ubuntu 下, 可以使用圖形界面的 gnome-tweaks 找到交換 <caps lock> 和 <control> 的設(shè)置. 安裝 gnome-tweaks 可以通過 apt 進行:
然后打開 gnome-tweaks 的鍵盤設(shè)置, 在高級選項里有關(guān)于 <control> 鍵的設(shè)置. 你不僅僅可以交換它與 <caps lock>, 也可以進行許多別的設(shè)置.
又或者, 在很多 Linux 系統(tǒng)的命令行下輸入
也可以交換 <caps lock> 與 <control>.
在 MacOS 中, 大家可以在 system -> keyboard -> functional keys 中調(diào)整所有功能鍵的鍵位.
最后再啰嗦一句, 交換 <caps lock> 與 <control> 絕不是可有可無的事情, 它在我們?nèi)粘J褂?Emacs 中真的非常重要! 大家千萬不要怕麻煩.
剩下兩個設(shè)置只有 Windows 用戶需要進行. 第一是把 Emacs 的家目錄, 在 Emacs 中通過 ~ 訪問, 改成 C:/Users/<用戶名>/. 默認(rèn)的家目錄是 C:/Users/<用戶名>/AppData/Roaming/. 從這個目錄出發(fā)不方便我們訪問像 "我的文檔" 這種常用文件夾, 所以我們需要手動修改家目錄為 C:/Users/<用戶名>/, 與 Linux 和 MacOS 保持一致. 方法是搜索 Edit system variables, 打開環(huán)境變量的設(shè)置, 然后增加一個用戶的環(huán)境變量 HOME, 把它設(shè)置為 C:/Users/<用戶名>/.
第二是保證你的 Emacs 安裝目錄在系統(tǒng)變量 PATH 上. 如果不在, 還是在同一個界面, 把包含你 emacs.exe 的文件夾路徑手動添加到 PATH 變量中.
Emacs 基本知識講解與必知快捷鍵
在Emacs 中大家需要理解的一個核心概念就是命令. 在 Emacs 中所有的操作, 無論簡單復(fù)雜都是命令. Emacs 這個單詞就來自于 macro, 即宏命令. 比如說我們想執(zhí)行打開一個文件的操作, 有3種方式等價的操作方式:
在菜單欄里選擇 file -> visit new file, 然后和普通的軟件一樣選擇你要打開的文件.
執(zhí)行 open-file 命令. 方法是按下 M-x (M = Alt), 然后在最下面的小緩沖區(qū)輸入 open-file, 然后輸入文件名.
按下 C-x C-f 快捷鍵, 并輸入文件名.
Emacs 中有許多有用的命令. 你未來也可以自己通過 elisp 語言編寫自己命令. Emacs 把其中最常用的命令都綁定了快捷鍵, 用戶自己也可以設(shè)置自己的快捷鍵. 當(dāng)我們用熟了之后, 很多快捷鍵就會像打字一樣形成肌肉記憶. 作為新手, 我們有很多鍵盤的快捷操作可以用鼠標(biāo)代替. 下面這張表我給大家總結(jié)了新手必知的幾個快捷鍵. 在表中, C 表示 control 鍵, M 表示 alt. 這也是 Emacs 快捷鍵通用寫法. 最右邊一列是快捷鍵對應(yīng)的命令名, 也就是第一列所有的快捷鍵都等價于 M-x 加上第三列.
快捷鍵
操作
命令名C-g
中止當(dāng)前一!切!命!令!keyboard-quit
C-/
撤銷命令undo
文件操作
?
?C-x C-f
打開文件find-file
C-x C-s
保存文件save-buffer
C-x b
切換文件 (緩沖區(qū))switch-to-buffer
C-x 1
關(guān)閉其它窗口delete-other-window
C-h f/v/k
查詢命令/變量/快捷鍵describe-function/variable/key
文本處理
?
?M-x
復(fù)制kill-ring-save
C-w
剪切kill-region
C-y
粘貼yank
中止命令與撤銷命令
在 Emacs 中發(fā)生誤操作時, 你需要知道如何中止與撤銷命令. 當(dāng)你的快捷鍵輸入一半想反悔時 (是的, Emacs 的快捷鍵可以很長!), 可以使用 C-g 重新來輸入, 又或者 Emacs 在執(zhí)行命令時卡住了, 你可以通過 C-g 來讓它恢復(fù)正常.
如果你需要撤回上一條命令, 則需要使用 C-/. 但值得注意的是, 撤回撤回命令的命令也是同一個鍵; 這偶爾會讓人抓狂.
文件與窗口相關(guān)命令
下面我們介紹 Emacs 中最基礎(chǔ)的幾個管理界面的快捷鍵.
首先是打開文件, C-x C-f, 命令名是 find-file. 這里的 find 隱含 Emacs 會根據(jù)不同情況執(zhí)行不同操作: 若文件存在, 則是普通的打開文件; 若文件不存在, 則是打開一個新文件.
第二個是保存文件, C-x C-s, 對應(yīng) save-buffer, 即把當(dāng)前緩沖區(qū) (更新后) 的內(nèi)容寫進文件里.
大多數(shù)情況將緩沖區(qū) (buffer) 等同于文件不會影響你的 Emacs 使用. 這里簡單講講它們的不同. 文件存在于電腦硬盤上, 而Emacs 的緩沖區(qū)只顯示文件內(nèi)容. 當(dāng)你把文件內(nèi)容讀入緩沖區(qū)以后, 又在 Emacs 外修改了文件的內(nèi)容, 緩沖區(qū)中的內(nèi)容并不會改變, 除非你明確指示 Emacs 重新讀取. 而在 Windows 中, 一個文件同時只能被一個 Windows 程序打開. Emacs 的緩沖區(qū)也不一定對應(yīng)著文件, 在模式欄大家可以看到當(dāng)前緩沖區(qū)的名字. 名字被兩個 * 號包含的一般是非文件的緩沖區(qū), 例如 *Message* 用于顯示 Emacs 給用戶的信息, 編譯 LaTeX 時 *Output* 會存放編譯輸出結(jié)果等.
第三個命令是切換緩沖區(qū)/文件, C-x b, 對應(yīng) switch-to-buffer. 執(zhí)行后在最下方的小緩沖區(qū)會提示輸入你想要切換的緩沖區(qū)名字, 默認(rèn)是上一個顯示的緩沖區(qū), 直接回車就行.
在 Emacs 中同時顯示多個緩沖區(qū)的方法是打開多個窗口 (window), 然后在每個窗口中顯示一個緩沖區(qū). 有時 Emacs 自動創(chuàng)建新的窗口, 例如展示幫助信息時. 新手最常用的操作是保留當(dāng)前光標(biāo)所在窗口, 而關(guān)掉其它所有窗口. 這可以通過, C-x 1, 即 delete-other-window 實現(xiàn). 我們可以用鼠標(biāo)輔助我們在不同窗口間切換.
幫助命令
Emacs 中查詢幫助信息的快捷鍵是 C-h <字母>. 常用的有 C-h f, 查詢命令, C-h v, 查詢變量, 以及 C-h k, 查詢快捷鍵. 通常 C-h 命令會自動創(chuàng)建新的窗口顯示幫助信息. ?我們可以先把光標(biāo)移到我們工作的緩沖區(qū), 然后用 C-x 1 關(guān)閉掉幫助信息窗口. 注意此時幫助信息的緩沖區(qū)并沒有關(guān)閉, 重新顯示可以通過 C-x b 并查找以 *help* 命名的緩沖區(qū).
復(fù)制/剪切/粘貼
Emacs 有自己一套復(fù)制/剪切/粘貼的快捷鍵: M-w / C-w / C-y. 這和一般程序的 C-c / C-x / C-v 不同, 需要大家習(xí)慣. 所有復(fù)制或剪切的內(nèi)容都會進入一個叫 kill-ring 的地方, 它相當(dāng)于一個剪粘版的歷史記錄. 粘貼快捷鍵 C-y 會粘貼最近一條記錄, 如果你想訪問之前的記錄, 可以緊跟著 C-y 再按下一次或多次 M-y.
Emacs 插件管理
接下來我們介紹如何更好地管理 Emacs 插件, 或叫 Emacs 包 (package). 插件可以給我們帶來更多的功能, 是 Emacs 使用中不可缺少的一環(huán). 插件的安裝和設(shè)置與其它的 Emacs 設(shè)置一樣, 都放在 Emacs 的啟動文件 ~/.emacs.d/init.el 中. 關(guān)于插件安裝與設(shè)置, 我推薦大家使用現(xiàn)在常用的 use-package 語法, 它的語法更簡潔, 還可以很方便地自動安裝插件.
Emacs 中下載新的插件可以通過不同的方式 (這本身也是通過某些插件管理的). 常用的有兩種, 一種是用內(nèi)置的 package.el, 這里插件名字就叫 package, .el 后綴來自于 Emacs 的編程語言 Elisp. 第二種是用 straight.el. package.el 會從官方的插件庫或鏡像網(wǎng)站上下載新插件, 而 straight 用下載插件的源代碼并編譯, 一般是利用 git 從 github 上下載. 為了使用 straight 你需要系統(tǒng)上已經(jīng)安裝了 git 程序, 并且能正常地訪問 github.com. 以下我們介紹兩種安裝方式如何設(shè)置.
我們在 package.el 和 straight.el 的設(shè)置示例中都手動檢查并安裝了 use-package. Emacs 29 后 use-package 已經(jīng)是內(nèi)置插件, 相關(guān)代碼可以省去.
package.el 設(shè)置示例
以下我們提供了 package.el 的一個設(shè)置示例. 大家需要把如下代碼放入設(shè)置文件 ./.emacs.d/init.el 中.
這段代碼的第一部分先啟用了 package.el, 然后通過 package-archives 變量設(shè)置了下載插件的網(wǎng)址. 在國內(nèi)也可以使用清華的軟件源. 接下來 package-refresh-contents 刷新了插件列表. 然后我們自動檢測 use-package 是否安裝, 如果沒有安裝則自動下載安裝. 最后, 我們設(shè)置了 use-package-always-ensure 變量為 t, 這樣以后我們所有用 use-package 聲明的插件都會自動安裝.
straight.el 設(shè)置示例
straight 需要用 git 從 github 等網(wǎng)站上下載源碼. 請再三確認(rèn) git 在系統(tǒng)路徑上 (尤其是用 msys2 安裝的 Windows 用戶).
因為 straight.el 與 package.el 難以共存, 所以我們必須早早手動禁用內(nèi)置的 package.el. 這必須修改一個我們平時很少用的 .emacs.d/early-init.el. 我們需要在 early-init.el 中加入
接下來, 我們需要在 init.el 中加入以下代碼:
這里大部分的代碼是 straight.el 的 github 主頁上提供的下載與安裝 straight 的代碼, 然后再用 straight 安裝 use-package. 最后我用把 straight-use-package-by-default 變量設(shè)為 t, 這是在使用 straight 時進行插件自動安裝的設(shè)置.
推薦插件
下面我給大家推薦兩組非常實用的插件. 在進行好 package.el 或者 straight.el 的設(shè)置后 (注意: 不能同時使用), 安裝與設(shè)置插件只需要把相關(guān)的 use-package 代碼塊復(fù)制到 init.el 即可. 而且在兩個體系下的代碼塊基本是通用的.
我們之前也都設(shè)置了自動安裝插件. 當(dāng)你第一次執(zhí)行 init.el 時 (通常是第一次重啟 Emacs 的時候), Emacs 會自動檢測你在 init.el 中聲明的插件是否已經(jīng)安裝, 若沒有則通過指定的方法 (package.el 或 straight.el) 自動下載安裝. 如果大家在一臺新的機器上使用 Emacs, 把 init.el 文件復(fù)制到新機器上就可以直接獲得一模一樣的使用體驗!
你也可以在修改完 init.el 后, 執(zhí)行 M-x eval-buffer 命令手動加載新加的 use-package 代碼塊.
在復(fù)制代碼塊中最常見的問題是某個地方在復(fù)制的過程中漏了括號. 大家已經(jīng)發(fā)現(xiàn) elisp 語言中括號是必須配對的. 我們可以在修改 init.el 后手動的用 M-x match-paren 檢查括號是否匹配. 如果有不匹配的括號, 那么光標(biāo)就會跳過沒有匹配成功的括號上, 否則這個命令不會用任何效果.
插件組合1: 更多的幫助信息
我們首先介紹 which-key + keycast + helpful. 安裝代碼如下
which-key 可以在按下快捷鍵的時候自動提示你接下來可能的快捷鍵. 比如按下 C-h, 就會提示接下來你按 v, f, k 等可以查看哪種類型的幫助. 如果把鼠標(biāo)懸停在選項上也會在浮窗中顯示對應(yīng)命令的幫助.
keycast 則會顯示當(dāng)前你使用的快捷鍵及對應(yīng)的命令名. 它有4種顯示的位置. 代碼中我們選擇在 headrer-line , 也就是 Emacs 窗口的最上方顯示. 如果大家想在別的地方顯示, 比如模式欄, 可以把 (keycast-header-line-mode 1) 改成 (keycast-mode-line-mode 1).
這兩個插件可以幫助新手快速熟悉 Emacs 的快捷鍵和命令. 對于老用戶來說, 也可以幫你快速熟悉新安裝的插件. 我自己平時也是常開的.
helpful 則優(yōu)化了幫助界面的信息顯示, 包括更多有用的信息和高亮.
插件組合2: 更好的補全界面
在 Emacs 中輸入命令或打開文件, 切換緩沖區(qū)等等都會用到小緩沖區(qū)補全. 第二組插件是針對小緩沖區(qū)補全的. 代碼如下
vertico 把每個補全選項放在單獨的一行, 配合 marginalia 會在每個選項的右邊加入更多相關(guān)信息.
在小緩沖區(qū)中輸入時, 我們可以按 <tab> 補全當(dāng)前的輸入. 加入 vertico 之后, 我們可以用 C-n 和 C-p 或者上下移動鍵來選擇不同的補全選項. C-n 和 C-p 也是 Emacs 中上下移動光標(biāo)的快捷鍵.
最后的 orderless 允許我們在小緩沖區(qū)補全時忽略單詞的順序. 例如, 如果我們輸入 M-x, 想要匹配 find-file 命令, 在默認(rèn)情況下必須先輸入 find, 再輸入 file 才能找到 find-file. 如果你用了 orderless, 則可以通過 file find 找到, 或者部分的單詞 fil fin <tab> 找到.
基本的 cdlatex + AucTeX 設(shè)置
最后我們提供一個簡單可用的 cdlatex 和 AucTeX 設(shè)置. 大家只要把這段代碼復(fù)制進 init.el 就可以實現(xiàn)視頻中五分鐘說服你用Emacs寫LaTeX的大部分功能.
這個基本設(shè)置不一定能實現(xiàn) pdf 正向或反向搜索, 因為這取決于操作系統(tǒng)與 pdf 閱讀器. 如果你想在 Emacs 中獲得統(tǒng)一的 pdf 體驗, 可以考慮使用 pdf-tools (見視頻 BV1pg4y1s7Z9).
關(guān)于 cdlatex 的安裝, 要注意的是, 它并不在任何的軟件源時. 如果使用 package.el, 你需要手動下載這個文件 (github 或者我網(wǎng)盤里的備份), 并用 :load-path 關(guān)鍵字指定文件的目錄. 如果是 straight, 則需要我們指定 github 源碼的網(wǎng)址.
AucTeX 是通過 use-package tex 激活的. 因為不同名的問題, 我們要額外加入 :ensure auctex 或 :straight auctex. 另外, 其實 Emacs 已經(jīng)內(nèi)置了 AucTeX, 但不一定是最新版本, 我們這里的 use-package 則會把它更新到最新版.
有用的鏈接
Emacs 官網(wǎng): https://www.gnu.org/software/emacs/
我的 Emacs 設(shè)置: https://gitee.com/mickey991/emacs-latex/tree/master/my-emacs-config