跳转至

Emacs

本頁面為 Emacs 的入門教程。

15 分鐘入門 Emacs。

簡介

Emacs 是一款非常容易上手的編輯器,只需要簡短的幾行配置就能使用,但是想要非常熟練地使用 Emacs 進行各項工作還是需要一定的時間。

作為入門教程,這裏僅介紹 Emacs 的基本功能,以及較方便地用 Emacs 編寫、調試代碼的方法。

入門

命令

命令在 Emacs 中有很大的作用。

使用 Application 鍵1(Windows 系統下 Emacs 未指定這個鍵,需要手動設置)或者快捷鍵 M-x(Alt+x)可以打開命令輸入,輸入完按下回車可以執行命令。

通常使用 es 或者 eshell 命令來打開 Eshell(類似一個終端)。

輸入命令通常可以用快捷鍵代替。

緩衝 (buffer)

緩衝即打開的文件和進程,在不保存的情況下,在緩衝中修改並不會修改到文件。

在緩衝區的底部點擊緩衝的名字或者使用快捷鍵可以切換緩衝。

編譯、調試和運行

編譯和調試功能的入口在頂部菜單欄的 Tools 下拉欄。使用者也可以通過命令或者自定義快捷鍵使用編譯和調試功能。

可以使用終端或 Eshell 運行程序。

按下 Tools 中的調試 (gud-gdb) 後,輸入程序名(一般會自動輸好,但如果中途將程序另存為或者打開了兩個需要調試的程序,自動輸好的文件名可能會有誤)即可開始調試。

分屏

這個功能能讓使用者同時查看各個緩衝的內容,而不需要來回切換緩衝,方便測試、調試代碼。

分屏功能可以同時顯示多個窗口,用鼠標拖動窗口的邊緣可以縮放窗口。

幾個快捷鍵:

  • 刪除分屏 "C-x 0":將這個分屏刪去
  • 橫向分屏 "C-x 3":將這個分屏橫向分成兩半
  • 縱向分屏 "C-x 2":將這個分屏縱向分成兩半

推薦的窗口布局為將窗口分為四塊:先橫向分,調整一塊的寬度約為 ¾ 屏,作為編輯窗口。將另一塊橫向分,一塊作為調試和編譯信息顯示的窗口,另一塊再縱向分,一塊打開輸入文件,一塊打開輸出文件。

快捷鍵

Emacs 擁有極為豐富的快捷鍵,可以大幅提高工作的效率。使用者可以在配置中自定義快捷鍵或者設置快捷鍵的映射。

由於快捷鍵過多,所以 Emacs 快捷鍵的使用與操作系統不同。

為了方便描述,做如下約定:

字符 鍵位
C Ctrl
M Alt
任意鍵位

一般有以下三種:

  • F?ESC:直接按下對應的功能鍵。
  • M-?C-?C-M-?:按下Alt或者Ctrl的同時按下 ?
  • ? ?:先按下第一個 ? 代表的鍵,鬆開再按下第二個 ? 代表的鍵。

下面是一些常用的快捷鍵:

  • C-x h:全選
  • C-x leftC-x right:切換到上/下一個緩衝
  • C-x d:打開一個目錄
  • C-x C-f:打開一個文件(如果不存在文件則新建文件)

個性化

剛安裝好的 Emacs 外觀難看且不好使用,因此需要對其進行個性化設置。

由於配置不好記,所以部分可以直接設置的部分建議不要記配置。

直接設置

  • Options:Highlight Matching Parentheses 高亮匹配括號
  • Options:Blink Cursor 設置光標閃爍
  • Options Show/Hide:Tool Bar 顯示/不顯示工具欄(默認顯示,建議不顯示)
  • Options:Use CUA Keys 勾選後可以使用 Ctrl + C,Ctrl + V 等快捷鍵進行復制粘貼
  • Options Customize-Emacs:Custom Theme 選擇配色方案,選擇完後需要點擊保存
  • Options:Save Options 保存配置

配置

在 home 目錄下顯示隱藏文件(Windows 系統在 用户目錄AppData\Roaming 目錄下),".emacs" 就是配置文件(如果沒有説明之前沒保存),打開修改即可。如果 Emacs 已打開,則需要重啓 Emacs,配置才能生效。

考場推薦的配置如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
;;設置一鍵編譯 可以自行添加參數 難背考場不建議使用 不建議依賴一鍵編譯
(defun compile-file ()(interactive)(compile (format "g++ -o %s %s -g -lm -Wall" (file-name-sans-extension (buffer-name))(buffer-name))))
(global-set-key [f9] 'compile-file)
;;;;設置編譯快捷鍵(如果設置了一鍵編譯不要與一鍵編譯衝突)
;;(global-set-key [f9] 'compile)

(global-set-key (kbd "C-a") 'mark-whole-buffer) ;;全選快捷鍵
(global-set-key (kbd "C-z") 'undo) ;;撤銷快捷鍵
(global-set-key [f10] 'gud-gdb) ;;GDB調試快捷鍵
(global-set-key (kbd "RET") 'newline-and-indent) ;;換行自動縮進
(global-set-key (kbd "C-s") 'save-buffer) ;;設置保存快捷鍵
(setq-default kill-ring-max 65535) ;;擴大可撤銷記錄

;;C++ 代碼風格 一般控制縮進規則
;;;"bsd" 所有大括號換行
;;;"java" 所有大括號不換行。else 接在右大括號後面
;;;"awk" 只有命名空間旁、定義類、定義函數時的大括號換行。else 接在右大括號後面
;;;"linux" 只有命名空間旁、定義類、定義函數時的大括號換行。else 接在右大括號後面。一般來説,這個風格應該有 8 格的空格縮進
(setq-default c-default-style "awk")
完整配置
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
;;設置一鍵編譯
(defun compile-file ()(interactive)(compile (format "g++ -o %s %s -g -lm -Wall" (file-name-sans-extension (buffer-name))(buffer-name))))
(global-set-key [f9] 'compile-file)
;;;;設置編譯快捷鍵(如果設置了一鍵編譯不要與一鍵編譯衝突)
;;(global-set-key [f9] 'compile)

;;考場必備
(global-set-key (kbd "C-a") 'mark-whole-buffer) ;;全選快捷鍵
(global-set-key (kbd "C-z") 'undo) ;;撤銷快捷鍵
(global-set-key [f10] 'gud-gdb) ;;GDB調試快捷鍵
(global-set-key (kbd "RET") 'newline-and-indent) ;;換行自動縮進
(global-set-key (kbd "C-s") 'save-buffer) ;;設置保存快捷鍵
(setq-default kill-ring-max 65535) ;;擴大可撤銷記錄
;;(define-key key-translation-map [apps] (kbd "M-x")) ;; windows 系統下設置命令快捷鍵

;;設置縮進
;;;C++ 代碼縮進長度。
(setq-default c-basic-offset 4)
;;;使用 tab 縮進
(setq-default indent-tabs-mode t)
;;;tab 的長度。務必和縮進長度一致
(setq-default default-tab-width 4)
(setq-default tab-width 4)

;;設置默認編碼環境
(set-language-environment "UTF-8")
(set-default-coding-systems 'utf-8)

;;不顯示歡迎頁面
(setq-default inhibit-startup-screen t)

;;設置標題
(setq-default frame-title-format "")

;;顯示行號
(global-linum-mode t)

;;高亮
(global-hl-line-mode 1);;高亮當前行
(show-paren-mode t);;高亮匹配括號
(global-font-lock-mode t);;語法高亮

;;允許emacs和外部其他程序的粘貼 好像默認允許
(setq-default x-select-enable-clipboard t)

;;設置字體是 Ubuntu Mono 的 16 號,如果字體不存在會報錯
(set-default-font "Ubuntu Mono-16")
;(set-default-font "Consolas-16") ;; windows 系統請用這條

;;鼠標滾輪支持
(mouse-wheel-mode t)

;;設置光標形狀為豎線(默認為方塊)
(setq-default cursor-type 'bar)

;;回答 yes/no 改成回答 y/n
(fset 'yes-or-no-p 'y-or-n-p)

;;透明度
(set-frame-parameter (selected-frame) 'alpha (list 85 60))
(add-to-list 'default-frame-alist (cons 'alpha (list 85 60)))

;;減少頁面滾動的行數,防止整頁地滾動
(setq-default scroll-margin 3 scroll-conservatively 10000)

;;優化文件樹結構
(ido-mode t)

;;配色方案
(setq default-frame-alist
         '((vertical-scroll-bars)
           (top . 25)
           (left . 45)
           (width . 120)
           (height . 40)
           (background-color . "grey15")
           (foreground-color . "grey")
           (cursor-color . "gold1")
           (mouse-color . "gold1")
           (tool-bar-lines . 0)
           (menu-bar-lines . 1)
           (scroll-bar-lines . 0)
           (right-fringe)
           (left-fringe)))

(set-face-background 'highlight "gray5")
(set-face-foreground 'region "cyan")
(set-face-background 'region "blue")
(set-face-foreground 'secondary-selection "skyblue")
(set-face-background 'secondary-selection "darkblue")
(set-cursor-color "wheat")
(set-mouse-color "wheat")

(custom-set-variables
 '(ansi-color-faces-vector
   [default default default italic underline success warning error])
;;啓動 Ctrl-x Ctrl-c Ctrl-v = 剪切 複製 粘貼
 '(cua-mode t nil (cua-base))
 '(show-paren-mode t)
;;隱藏工具欄
 '(tool-bar-mode nil))
;;關閉光標閃爍
 '(blink-cursor-mode nil)
(custom-set-faces)

拓展閲讀

要以終端模式啓動 Emacs,在啓動時添加參數 -nw。Emacs 有多種變體,如採用 native-comp 來減少延遲的 GCC Emacs 及其純 GTK 版本變體、針對 macOS 優化的 Emacs Macport。

Emacs 有中心化的軟件倉庫,配置後可通過 M-x package-install 來安裝插件。使用 鏡像站 可以加快下載速度。

Emacs 可以使用語言服務器(Language Server Protocol)來提高編輯體驗,目前推薦的 C++ 後端是 Clangd。前端可以採用 EglotEmacs LSP,參閲 此條目 可能對選擇前端有所幫助。

拓展名為 .org 的 Org Mode 文檔可以通過 Pandoc 轉換為 Markdown 文檔。

參考資料與註釋


  1. 該鍵的作用是調出鼠標右鍵菜單,一般為右Ctrl左邊的第一個鍵。