Emacs/概念 - Arch Linux 中文维基

跳至內容

# Emacs/概念

出自 Arch Linux 中文维基
< Emacs

本文介紹 Emacs 的基本概念。

## 屏幕組織

在圖形顯示器上，例如在使用 X 窗口系統的 GNU/Linux 上，Emacs 占用一個圖形窗口。在文本終端上，Emacs 占用整個終端屏幕。我們將使用幀一詞來指 Emacs 占用的圖形窗口或終端屏幕。Emacs 在這兩種幀上的表現非常相似。通常一開始只有一個幀，但也可以根據需要創建其他幀。

每個幀都由幾個不同的區域組成。幀頂部是菜單欄，可以通過一系列菜單訪問命令。在圖形顯示屏上，菜單欄的正下方是工具欄，這是一排圖標，點擊後可執行編輯命令。幀的最下方是回顯區，這裡顯示信息，當 Emacs 要求輸入信息時，你也可以在這裡輸入信息。

幀的主要區域，即工具欄（如果有的話）下方和回顯區上方，稱為窗口。因此，在本手冊中，我們將在這個意義上使用「窗口「一詞。圖形顯示系統通常使用含義不同的「窗口」一詞，但如上所述，我們將這些圖形窗口稱為「幀」。

Emacs 窗口是顯示緩衝區的地方，緩衝區就是你正在編輯或查看的文本或其他圖形。在圖形顯示器上，窗口的一側有一個滾動條，可以用來滾動緩衝區。窗口的最後一行是模式行。它顯示緩衝區中的各種信息，如是否有未保存的更改、正在使用的編輯模式、當前行號等。

啟動 Emacs 時，幀中通常只有一個窗口。不過，您可以水平或垂直細分這個窗口，創建多個窗口，每個窗口都可以獨立顯示一個緩衝區。

在任何時候，一個窗口都是選定窗口。在圖形顯示屏上，選定窗口顯示一個較突出的光標（通常為實心和閃爍）；其他窗口顯示一個不太突出的光標（通常為空心方框）。在文本終端上，只有一個光標，顯示在選定窗口中。選定窗口中顯示的緩衝區稱為當前緩衝區，編輯工作就在這裡進行。大多數 Emacs 命令都隱式地應用於當前緩衝區；未選中窗口中顯示的文本主要供參考。如果在圖形顯示屏上使用多個幀，則選擇特定幀就會選擇該幀中的窗口。

### 點

所選窗口中的光標顯示大多數編輯命令生效的位置，稱為點。許多 Emacs 命令會將點移動到緩衝區中的不同位置；例如，在所需位置單擊滑鼠鍵 1（通常是左鍵），就可以將點移動到該位置。

默認情況下，所選窗口中的光標繪製為實心塊，似乎位於一個字符上，但您應該將 point 視為兩個字符之間；它位於光標下的字符之前。例如，如果您的文本是 「`Arch Linux 中社區`」，光標在「`社`」上，那麼點就在「`中`」和「`社`」之間。如果在該位置插入字符，結果就是「`Arch Linux 中文社區`」，點位於「`文`」和「`社`」之間。因此，光標仍和以前一樣位於「`社`」之上。

### 回顯區

幀最下方的一行是回顯區。它用於顯示各種用途的少量文字。

回顯區之所以叫回顯區，是因為它的作用之一就是回顯，即在輸入多字符命令時顯示其中的字符。單字符命令不會有回顯。多字符命令如果在輸入過程中停頓超過一秒，就會產生回顯。然後，Emacs 會回顯顯示該命令到目前為止的所有字符，以提示您輸入其餘字符。一旦開始回顯，命令的其餘部分就會在你輸入時立即回顯。這種行為旨在為自信的用戶提供快速響應，同時為猶豫不決的用戶提供最大程度的反饋。

當命令無法執行時，回顯區還用於顯示錯誤信息。錯誤信息可能伴有蜂鳴聲或屏幕閃爍。

有些命令會在回顯區顯示提示信息，告訴您該命令執行了什麼操作，或為您提供一些特定信息。這些信息與錯誤信息不同，不會伴有蜂鳴聲或閃光。例如，`C-x =`（按住 Ctrl 鍵並鍵入 x，然後放開 Ctrl 鍵並鍵入 =）會顯示一條信息，說明點的字符、它在緩衝區中的位置以及它在窗口中的當前列。耗時較長的命令在運行過程中通常會顯示以「...」結尾的信息（有時還會以百分比的形式顯示運行進度），並在完成後添加 「done」（已完成）。

回顯區的消息保存在一個名為 *Messages* 的特殊緩衝區中。如果錯過了屏幕上短暫出現的信息，可以切換到 *Messages* 緩衝區再次查看。*Messages* 緩衝區有一定的行數限制，由變量 `message-log-max` 指定。(我們也沒有解釋變量；有關變量的更多信息，請參閱變量）。超過這個限制，每當在末尾添加一行新的信息時，就會從開頭刪除一行。

回顯區還用於顯示 minibuffer，這是一個特殊窗口，您可以在此輸入命令參數，如要編輯的文件名。使用微型緩衝區時，回顯 區顯示的文本以提示字符串開頭，活動光標顯示在微型緩衝區內，minibuffer 暫時被視為選定窗口。您可以通過鍵入 C-g 退出 minibuffer。

### 模式行

每個窗口的底部都有一個模式行，用於描述當前緩衝區中正在發生的事情。當只有一個窗口時，模式行會出現在回顯區的正上方；它是幀中倒數第二行。在圖形顯示屏上，模式行以 3D 方框的形式顯示。Emacs 通常還會用不同於未選定窗口的顏色來繪製選定窗口的模式線，以使其更加突出。

模式線中顯示的文本格式如下：

    cs:ch-fr  buf      pos line   (major minor)

在文本終端上，該文本後面會有一連串延伸至窗口右邊緣的破折號。在圖形顯示屏上，這些破折號會被省略。

cs 字符串及其後的冒號字符描述了當前緩衝區使用的字符集和換行約定。通常，Emacs 會自動為您處理這些設置，但有時掌握這些信息也很有用。

cs 描述緩衝區中文本的字符集。如果是破折號（'-'），則表示沒有特殊的字符集處理（行結束約定可能除外，下一段將介紹）。= 表示不進行任何轉換，通常用於包含非文本數據的文件。其他字符表示各種編碼系統，例如'1'表示 ISO Latin-1。

在文本終端上，cs 前面還有兩個字符，分別描述鍵盤輸入和終端輸出的編碼系統。此外，如果使用的是輸入法，cs 前面還會有一個字符串，用來標識輸入法。

cs 後面的字符通常是冒號。如果顯示的字符串不同，則表示文件編碼的行尾約定不盡相同。通常，文件中的文本行以換行符分隔，但有時也使用其他兩種約定。MS-DOS 慣例使用一個回車符，後面跟一個換行符；在編輯此類文件時，冒號會根據作業系統的不同變為反斜線（'\'）或'(DOS)'。舊版 Macintosh 系統採用的另一種習慣是使用回車符代替換行符；編輯此類文件時，冒號會變為正斜線（'/'）或'(Mac)'。在某些系統上，對於使用換行符作為行分隔符的文件，Emacs 會顯示"(Unix)"而不是冒號。

在為 emacsclient 創建的幀中，下一個字符是"@"。對於作為守護進程運行的 Emacs 進程的幀來說，這種指示很典型。

如果窗口中顯示的緩衝區與磁碟上相應文件的內容相同，即緩衝區未修改，則顯示兩個破折號（'--'）。如果緩衝區已修改，則顯示兩顆星（'**'）。對於只讀緩衝區，如果緩衝區已修改，則顯示"%*"，否則顯示"%%"。

ch 後面的字符通常是破折號（'-'）。但是，如果當前緩衝區的默認目錄在遠程計算機上，則會顯示"@"。

fr 給出所選幀的名稱。它只出現在文本終端上。初始幀名為 "F1"。

buf 是窗口中顯示的緩衝區名稱。通常與正在編輯的文件名相同。請參閱使用多個緩衝區。

pos 顯示窗口頂部上方或底部下方是否有附加文本。如果緩衝區較小，窗口中可以看到全部緩衝區，則 pos 為"全部"。否則，如果您看到的是緩衝區的開頭，則是 "Top"；如果您看到的是緩衝區的結尾，則是 "Bot"；或者是 "nn%"，其中 nn 是窗口頂部以上緩衝區的百分比。使用 "Size Indication"（大小指示）模式，還可以顯示緩衝區的大小。

行是字符 "L"，後跟在點處的行號。(打開列號模式，也可以顯示當前列號。請參閱可選模式行功能）。

major 是緩衝區中使用的主要模式名稱。主要模式是緩衝區的主要編輯模式，如文本模式、Lisp 模式、C 模式等。請參閱主要模式。某些主要模式會在主要模式名稱後顯示附加信息。例如，編譯緩衝區和 Shell 緩衝區會顯示子進程的狀態。

minor （次要）模式是一些已啟用的 minor 模式的列表，它們是在主要模式基礎上提供附加功能的可選編輯模式。

有些功能雖然不是真正的 minor 模式，但只要開啟，就會與次要模式一起列出。Narrow 表示顯示的緩衝區的編輯範圍僅限於部分文本。Def 表示當前正在定義鍵盤宏（請參閱鍵盤宏）。

此外，如果 Emacs 處於遞歸編輯層內，模式周圍的括號會出現方括號（'[...]'）。如果 Emacs 處於另一個遞歸編輯層中的一個遞歸編輯層，則會出現雙方括號，依此類推。由於遞歸編輯級別會對 Emacs 產生全局影響，因此每個窗口的模式行中都會出現此類方括號。

您可以更改模式行的外觀及其內容格式。請參閱可選模式行功能。此外，模式行對滑鼠敏感；單擊模式行的不同部分可執行各種命令。此外，將滑鼠指針懸停在模式行的滑鼠敏感區域上會顯示工具提示，其中包含通過單擊模式行可以調用的命令信息。

### 菜單欄

每個 Emacs 幀的頂部通常都有一個菜單欄，您可以用它來執行常用操作。無需在此一一列舉，因為你可以更容易地看到它們。

在支持滑鼠的顯示器上，你可以用滑鼠從菜單欄中選擇命令。菜單項右邊的箭頭表示它指向一個輔助菜單或子菜單。菜單項末尾的"..."表示該命令在實際執行之前會提示你進一步輸入。

菜單欄中的某些命令也有普通的按鍵綁定；如果有，按鍵綁定會顯示在項目本身之後。要查看某個菜單項的完整命令名稱和文檔，請鍵入 C-h k，然後用滑鼠以通常的方式選擇菜單欄（請參閱 "按鍵文檔"）。

您也可以不使用滑鼠，而是按 `F10` 鍵調用第一個菜單欄項目（運行命令 `menu-bar-open`）。然後可以使用箭頭鍵或 `C-b`、`C-f`（左/右）、`C-p` 和 `C-n`（上/下）瀏覽菜單。要激活選定的菜單項，請按 `RET`；要取消菜單導航，請按 `C-g` 或 `ESC ESC ESC`。(不過請注意，如果 Emacs 是使用圖形用戶界面工具包創建的，那麼菜單的繪製和控制都是由工具包完成的，取消菜單導航的按鍵順序可能與上述描述不同）。

在文本終端上，可以選擇訪問回顯區的菜單欄菜單。為此，請將變量 `tty-menu-open-use-tmm` 設置為非零值。然後鍵入 `F10` 將運行 `tmm-menubar` 命令，而不是下拉菜單。(您也可以鍵入 `M-``，它將始終調用 tmm-menubar。）tmm-menubar 可讓您用鍵盤選擇菜單項。回顯區會出現一個臨時選項。您可以使用上下箭頭鍵在菜單中移動到不同的項目，然後鍵入 `RET` 來選擇項目。每個菜單項也由一個字母或數字（通常是項目名稱中某個單詞的首字母）指定。該字母或數字與項目名稱之間用"==>"隔開。您可以鍵入該項目的字母或數字來選擇該項。

## 用戶輸入類型

GNU Emacs 主要是為使用鍵盤而設計的。雖然可以使用滑鼠通過菜單欄和工具欄發出編輯命令，但效率通常不如鍵盤。

Emacs 中的鍵盤輸入是基於 ASCII 的重度擴展版本。簡單字符，如 "a"、"B"、"3"、"="和空格符（表示為 SPC），可通過鍵入相應的鍵來輸入。控制字符，如 `RET`、`TAB`、`DEL`、`ESC`、`F1`、`Home` 和 `LEFT`，以及非英語鍵盤上的某些字符，也可以通過這種方式輸入。

Emacs 還能識別使用修改鍵輸入的控制字符。例如，按住 `Ctrl` 鍵的同時按 a，就可以輸入 `Control-a`；我們將其簡稱為 `C-a`。同樣，`Meta-a` 或簡稱 `M-a` 是按住 `Alt` 鍵並按 `a` 鍵輸入的。修改鍵也可用於非字母數字字符，例如 `C-F1` 或 `M-LEFT`。

您還可以使用以 `ESC` 開頭的雙字符序列輸入 `Meta` 字符。因此，輸入 `ESC a` 可以輸入 `M-a`。輸入 `ESC C-a` 可以輸入 `C-M-a`（同時按住 `Ctrl` 和 `Alt`，然後按 `a`）。與 `Meta` 不同，`ESC` 是作為一個單獨的字符輸入的。輸入下一個字符時不要按住 `ESC`，而是按下 `ESC` 並鬆開，然後輸入下一個字符。在某些 `Meta` 鍵無法正常工作的文本終端上，這一功能非常有用。

Emacs 還支持另外 3 個修改鍵，請參閱修改鍵。

Emacs 廣泛支持使用滑鼠按鈕、滑鼠滾輪和其他指向設備（如觸摸板和觸控螢幕）。

在圖形顯示器上，窗口管理器可能會阻止某些鍵盤輸入，包括 `M-TAB`、`M-SPC`、`C-M-d` 和 `C-M-l`。如果遇到這種問題，可以自定義窗口管理器，使其不阻塞這些鍵，或者重新綁定受影響的 Emacs 命令。

簡單字符和控制字符以及某些非鍵盤輸入（如滑鼠點擊）統稱為輸入事件。

## 按鍵

有些 Emacs 命令只需一個輸入事件即可調用，例如 `C-f` 在緩衝區中向前移動一個字符。其他命令需要兩個或多個輸入事件才能調用，例如 `C-x C-f` 和 `C-x 4 C-f`。

按鍵序列（簡稱按鍵）是由一個或多個輸入事件組成的序列，作為一個單元是有意義的。如果一個按鍵序列調用了一個命令，我們就稱它為一個完整按鍵；例如，`C-f`、`C-x C-f` 和 `C-x 4 C-f` 都是完整按鍵。如果一個鍵序的長度不足以調用命令，我們就稱它為前綴鍵；從前面的例子中，我們可以看到 `C-x` 和 `C-x 4` 都是前綴鍵。每個按鍵序列要麼是完整按鍵，要麼是前綴按鍵。

前綴按鍵與後面的輸入事件組合成一個更長的按鍵序列。例如，`C-x` 是一個前綴鍵，因此單獨鍵入 `C-x` 並不會調用命令；相反，Emacs 會等待進一步的輸入（如果暫停超過一秒，它就會回顯 `C-x` 鍵以提示輸入；參見回顯區）。`C-x` 與下一個輸入事件組合成一個雙事件按鍵序列，它本身可以是一個前綴鍵（如 `C-x 4`），也可以是一個完整的按鍵（如 `C-x C-f`）。按鍵序列的長度沒有限制，但在實際應用中很少超過三個或四個輸入事件。

您不能在一個完整鍵上添加輸入事件。例如，由於 `C-f` 是一個完整的鍵，所以 `C-f C-k` 這個雙事件序列是兩個鍵序列，而不是一個。

默認情況下，Emacs 的前綴鍵是`C-c、C-h、C-x、C-x RET、C-x @、C-x a、C-x n、C-x r、C-x t、C-x v、C-x 4、C-x 5、C-x 6、ESC` 和 `M-g`（`F1` 和 `F2` 是 `C-h` 和 `C-x 6` 的別名）。例如，如果刪除了 `C-x 4` 的前綴定義，那麼 `C-x 4 C-f` 就會成為一個無效的鍵序。請參閱自定義按鍵綁定。

在前綴鍵後輸入幫助字符（`C-h` 或 `F1`），會顯示以該前綴開頭的命令列表。唯一的例外是 `ESC`： `ESC C-h` 等同於 `C-M-h`，後者的功能完全不同。不過，您可以使用 `F1` 顯示以 `ESC` 開頭的命令列表。

## 滑鼠輸入

默認情況下，Emacs 支持所有正常的滑鼠操作，例如通過單擊滑鼠左鍵設置光標，以及通過拖動滑鼠指針選擇區域。所有滑鼠操作都可以用來綁定命令，綁定方式與綁定鍵盤事件相同（請參閱#按鍵）。本節概述了如何在 Emacs 中使用滑鼠。

單擊滑鼠左鍵時，Emacs 會收到一個 mouse-1 事件。要查看該事件綁定了什麼命令，可以鍵入 `C-h c`，然後按下滑鼠左鍵。同樣，滑鼠中鍵是 mouse-2，滑鼠右鍵是 mouse-3。如果你使用的是帶滾輪的滑鼠，滾輪事件通常會綁定到 wheel-down 或 wheel-up，或者 mouse-4 和 mouse-5，但這取決於作業系統的配置。

一般來說，傳統 X 系統和終端會報告 mouse-4 和 mouse-5，而所有其他系統都會報告 wheel-down 和 wheel-up。

有些滑鼠還有水平滾輪，觸摸板通常也支持水平滾動。這些事件在所有系統中都會報告為 wheel-left 和 wheel-right，但終端和傳統 X 系統除外，在這些系統中報告為 mouse-6 和 mouse-7。

您還可以將鍵盤修飾符與滑鼠事件結合起來，例如，您可以綁定一個特殊命令，當您按住 Meta 鍵並使用滑鼠中鍵時觸發該命令。在這種情況下，事件名稱將是 M-mouse-2。

在某些系統中，還可以綁定用於處理觸控螢幕事件的命令。在這種情況下，事件名稱為觸控螢幕更新（touchscreen-update）和觸控螢幕結束（touchscreen-end）。

## 按鍵與命令

本文中有很多段落告訴你特定按鍵的作用。但 Emacs 並不直接為按鍵賦予含義。相反，Emacs 將含義分配給已命名的命令，然後通過將按鍵與命令綁定來賦予按鍵含義。

每個命令都有一個由程式設計師選擇的名稱。名稱通常由幾個英文單詞組成，中間用破折號隔開，例如 next-line 或 forward-word。在內部，每個命令都是一種特殊的 Lisp 函數，與命令相關的操作通過運行函數來執行。請參閱《Emacs Lisp 參考手冊》中的"什麼是函數"。

鍵與命令之間的綁定記錄在稱為鍵映射的表中。

當我們說 "C-n 垂直向下移動一行" 時，我們忽略了一個微妙的區別，這個區別在普通使用中無關緊要，但對於 Emacs 的定製卻至關重要。命令 next-line 是垂直向下移動一行。`C-n` 具有這種效果是因為它綁定了 next-line。如果將 `C-n` 與 forward-word 命令重新綁定，`C-n` 將向前移動一個字。

在本文中，我們經常把 `C-n` 等按鍵說成是命令，儘管嚴格來說，按鍵是與命令綁定的。通常情況下，我們在提到運行命令的按鍵後，會在括號內註明真正執行命令的命令名稱。例如，我們會說 "命令 C-n（next-line）將點垂直向下移動"，意思是命令 next-line 將點垂直向下移動，而按鍵 `C-n` 通常與之綁定。

既然是討論自定義，我們就應該介紹一下變量。通常情況下，命令的說明中會說："要改變這一點，請設置變量 mumble-foo"。變量是用來存儲數值的名稱。本文中記錄的大多數變量都是用於自定義的：Emacs 的某些命令或其他部分會檢查變量，並根據你設置的值做出不同的行為。在你對自定義變量感興趣之前，可以忽略有關變量的信息。然後再閱讀有關變量的基本信息，這樣有關特定變量的信息就會變得有意義。

分類：​

- Emacs

Emacs/概念
新增話題