Emacs 不僅僅是個編輯器,更是一個整合開發環境。理解如何在 Emacs 中編譯和執行 C 程式碼,能大幅提升開發效率。本文除了介紹編譯執行的基本流程,也涵蓋了錯誤處理、多視窗操作等實務技巧,讓開發者能更順暢地使用 Emacs 進行 C 語言開發。此外,Emacs 強大的自訂化功能也是其一大特色,透過快捷鍵、宏命令和 elisp 設定,可以開發個人化的開發環境,進一步提升生產力。
利用 GNU Emacs 編譯與執行 C 語言程式
在軟體開發過程中,Emacs 作為一款強大的文字編輯器,常被用來進行程式碼編寫、編譯及除錯。本文將詳細介紹如何利用 GNU Emacs 編譯與執行 C 語言程式,並涵蓋多個練習會話的步驟與實際操作。
編譯與執行 C 語言程式的步驟
步驟 1:在 Emacs 中開啟 C 檔案
首先,開啟 Emacs 編輯器,並使用 File > Open 選項來載入你的 C 檔案,例如 power.c。這個檔案包含了你需要編譯的 C 原始碼。
步驟 2:修正程式碼錯誤
在 Emacs 中編輯 power.c 檔案時,可能會遇到一些語法錯誤或邏輯錯誤。使用 Emacs 的語法高亮功能來快速找出這些錯誤,並進行修正。當你確定所有錯誤都已修正後,可以進行下一步。
步驟 3:使用編譯指令
在 Emacs 中,你可以使用以下指令來編譯你的 C 檔案:
gcc power.c -lm -o power
步驟 4:觀察編譯過程
執行上述指令後,Emacs 會顯示一個新的緩衝區視窗,展示編譯連結的進度。如果有任何錯誤訊息出現,這些錯誤訊息會顯示在底部緩衝區視窗中。
步驟 5:重複修正與編譯
如果在編譯過程中遇到錯誤訊息,請重複步驟 2 和步驟 4,直到所有嚴重語法錯誤都被移除。
make -k
這個指令會嘗試繼續編譯,即使有錯誤存在。如果有任何警告訊息出現,但不會阻止編譯和連結成功,這些警告訊息也會顯示在底部緩衝區視窗中。
步驟 6:完成編譯
當所有嚴重語法錯誤都被移除後,你會看到「Compilation finished」的訊息以及完成時間,這表示你已成功編譯並連結了 power.c 檔案。
步驟 7:離開 Emacs 與執行程式
離開 Emacs 編輯器後,你可以在終端機視窗中執行以下指令來測試你的程式:
./power
確保當前路徑設定正確,以便能夠執行目錄中的可執行檔案。例如:
bob@raspberrypi:~ $ ./power
This program takes x and y values from stdin and displays x^y.
Enter integer x: 3
Enter integer y: 2
x^y is: 9.000
bob@raspberrypi:~ $
在多個緩衝區中工作
Emacs 支援多個緩衝區視窗的操作,這對於同時編輯多個檔案非常方便。以下是如何在多個緩衝區中工作的詳細步驟。
練習會話 3.8
建立子目錄與開啟新檔案
- 在家目錄下建立一個名為
multi的子目錄並進入該目錄。 - 在終端機提示符下輸入
emacs newfile,開始編輯名為newfile的緩衝區。 - 在 Emacs 中選擇
File > New Window Below,將框架水平分割成兩個視窗。 - 按下
<Ctrl+X> <3>,將上方視窗垂直分割成兩個視窗。 - 在下方視窗重複第4步操作,使得四個視窗都顯示
newfile的內容。
儲存與開啟檔案
- 在左上角視窗輸入
1 2 3 4 5,然後選擇File > Save As,將檔案名稱為firstrow儲存到multi資料夾中。 - 在右上角視窗輸入
6 7 8 9 10,然後選擇File > Save As,將檔案名稱為secondrow儲存到multi資料夾中。 - 在左上角視窗開啟
firstrow檔案。 - 在左下角視窗輸入
11 12 13 14 15,然後選擇File > Save As,將檔案名稱為thirdrow儲存到multi資料夾中。
單獨開啟及移動內容
- 在右上角視窗開啟
secondrow檔案。 - 在左下角視窗開啟
thirdrow檔案。 - 在右下角視窗選擇
File > Save As,將檔案名稱為fourthrow儲存到multi資料夾中。
這樣你就能夠在同一個 Emacs 框架內同時檢視並操作多個檔案了。透過這些步驟和實踐會話,玄貓希望讀者能更深入瞭解如何使用 GNU Emacs 編譯與管理 C 語言程式碼。
自訂化 GNU Emacs 行為
在這一節中,玄貓將詳細介紹如何自訂化和修改 GNU Emacs 的行為。這包括以下幾個主要操作:
- 使用「選項」選單來修改選項。
- 使用 Custom(圖形化介面)來更改偏好設定和選項,並結合傳統的
<Alt+X>自訂命令集。 - 使用
abbrev寫入快捷鍵縮寫。 - 寫入快捷鍵宏命令。
- 重新定義鍵盤鍵。
- 寫入 Emacs Lisp(elisp)程式碼來自訂化 Emacs 的行為,並將該程式碼直接輸入到您的
~/ .emacs啟動組態檔案中。
所有這些操作都可以更改您的 ~/ .emacs 啟動組態檔案,以提供更個人化的 Emacs 會話,並根據您的特定需求和文字輸入方法進行自訂。請注意,Raspberry Pi OS 中的 ~/.emacs 組態檔案預設並不存在。但在您開始自訂化 Emacs 的過程中,這個檔案會被建立。此外,elisp 程式碼會根據您的操作生成,但您不需要了解任何 elisp 程式設計的細節即可完成所有這些操作。
以下小節將描述並提供所有給定操作的示例。此外,表 3.5 和表 3.6 提供了實作 <Alt+X> 自訂、快捷鍵縮寫和編寫快捷鍵宏的重要快捷鍵摘要。
自訂化 Emacs 行為方式
| 自訂化動作 | 快捷鍵 | |
|
|
| 新增全域性縮寫 | <Ctrl+X> a g |
| 新增模式本地縮寫 | <Ctrl+X> a l |
| 新增此縮寫的全域性擴充套件 | <Ctrl+X> a i g |
| 新增此縮寫的模式本地擴充套件 | <Ctrl+X> a i l |
| 顯式擴充套件縮寫 | <Ctrl+X> a e |
| 動態擴充套件前一個詞 | <Alt+/> |
| 開始定義鍵盤宏 | <Ctrl+X> 或 <F3> |
| 結束鍵盤宏定義 | <Ctrl+X> 或 <F4> |
| 執行上一次定義的鍵盤宏 | <Ctrl+X> e 或 <F4> |
| 新增到上一個鍵盤宏 | <Ctrl+U> <Ctrl+X> ( |
| 命名最後一個鍵盤宏 | <Alt+X> name-last-kbd-macro|
| 在緩衝區中插入Lisp定義 | <Alt+X> insert-kbd-macro |
| 自訂化變數和麵板 | <Alt+X> customize |
鍵盤宏快捷鍵
| 快捷鍵 | 命令名 | 動作描述 | |
|
|
–|
| <Ctrl+X> ( kmacro- startmacro | 開始鍵盤宏定義 | |
| <F3> | kmacro- startmacro- or-insertcounter | 開始鍵盤宏定義。如果在定義宏時按下,則插入計數器 |
| <Ctrl+X> ) | kmacro- end-macro | 結束鍵盤宏定義 |
|<F4> | kmacro- end-or-call-macro |如果正在進行定義,則結束鍵盤宏定義;否則呼叫上一次鍵盤宏|
<Ctrl+X> e | kmacro- end-and-call-macro |執行上一次定義的鍵盤宏。可以輸入“e”重複宏 |
<Ctrl+X><Ctrl + K> n | name-last-kbd-macro |命名上一次建立的宏(在儲存之前) |
使用選項選單
使用 GNU Emacs 下拉選單中的「選項」選擇是自訂化 Emacs 行為最簡單和最快速的方法之一。例如,在「強調比對括號」旁邊打勾(預設選項),則在您輸入時所有比對的左括號和右括號都會被強調顯示。
您新增的其他勾選僅適用於當前 Emacs 會話。例如,如果您在「錯誤時進入偵錯程式」旁邊新增勾選,並希望將該選項保留給所有未來的 Emacs 會話,請使用「選項」選單中的「儲存選項」。第一次使用「選項」選單中的「儲存選項」,以下有效的 elisp 行將自動寫入您的 ~/ .emacs 檔案:
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(debug-on-error t))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
Customize 自訂化變數和麵板
當你希望對 Emacs 的行為進行更深層次的自訂化時,你可以使用 Emacs 提供的 Customize 功能。Customize 提供了一個圖形介面(GUI),讓你可以方便地修改 Emacs 的各種設定。
以下是一些常見的 Customize 操作:
啟動 Customize: 按下
<Alt+x>輸入customize命令來啟動 Customize 模式。瀏覽和修改設定: 在 Customize 模式中,你可以瀏覽各種可自訂化的變數和麵板。例如,你可以修改快捷鍵繫結、字型設定、顏色主題等。
儲存設定: 一旦你完成了所有設定的修改,你可以點選「Apply and Save」按鈕來應用這些設定並將其儲存到你的
.emacs組態檔案中。
(global-set-key (kbd "<Ctrl+c><g>") 'search-forward)
(global-set-key (kbd "<Alt +#>") 'query-replace-regexp)
內容解密:
(global-set-key (kbd "<Ctrl+c><g>") 'search-forward)
以上程式碼將全域性地將快捷鍵組合 <Ctrl+c>
(global-set-key (kbd "<Alt +#>") 'query-replace-regexp)
以上程式碼則將 <Alt +#> 與 ‘query-replace-regexp’ 命令繫結。這個命令允許你根據正規表示式進行查詢替換操作。
寫入快捷鍵縮寫
使用 abbrev 模組可以建立縮寫來加速常用詞或短語。以下是一些常用縮寫相關操作:
新增全域性縮寫:
- 快捷鍵:
<Ctrl + x> a g - 動作:新增一個全域性縮寫。
- 快捷鍵:
新增模式本地縮寫:
- 快捷鍵:
<Ctrl + x> a l - 動作:新增一個特定模式下有效的縮寫。
- 快捷鍵:
為縮寫新增全域性擴充套件:
- 快捷鍵:
<Ctrl + x> a i g - 動作:為當前全域性縮寫新增擴充套件。
- 快捷鍵:
為縮寫新增模式本地擴充套件:
- 快捷鍵:
<Ctrl + x> a i l - 動作:為當前模式本地縮寫新增擴充套件。
- 快捷鍵:
顯式擴充套件縮寫:
- 快捷鍵:
<Ctrl + x> a e - 動作:手動擴充套件當前輸入的縮寫。
- 快捷鍵:
動態擴充套件前一個單詞:
- 快捷鍵:
<Alt + /> - 動作:動態擴充套件上一個單詞為其對應縮寫。
- 快捷鍵:
內容解密:
(<Ctrl + x> a g)
以上程式碼表示你按下 Ctrl 和 x 鍵之後再按下 a 鍵(仍然按住 Ctrl),最後再按 g 鍵(釋放 Ctrl)。這樣就可以進入全域性地增加縮寫名稱模式。
(<Alt + />)
以上程式碼表示你按下 Alt 鍵後同時按下 / 鍵(兩者同時按下),這樣就可以動態擴充上一個單字成為該縮寫名稱所對應之意義。
寫入快捷鍵宏命令
使用快捷鍵宏命令可以錄製一系列操作並重復執行它們。以下是一些常用快捷鍵宏相關操作:
開始定義鍵盤宏:
- 快捷鍵:
<Ctrl + x>( - 動作:開始錄製一個新的鍵盤宏。
- 快捷鍵:
結束並呼叫最後一個定義好的鍵盤宏:
- 快捷鍵:
<Ctrl + x>e - 動作:結束錄製並立即執行最後一個定義好的鍵盤宏。
- 快捷鍵:
內容解密:
(<Ctrl + x>( )
以上程式碼表示你同時按下 Ctrl 和 x 鍵之後再按下小括弧開頭以及結束(釋放 Ctrl)。這樣就可以開始錄製新增之快速鍵組合操作。
(<Ctrl + x >e )
以上程式碼表示你同時按下 Ctrl 和 x 鍵之後再按下 e 鍵(釋放 Ctrl)。這樣就可以執行錄製好的最後一組快速鍵組合操作功能。
重新繫結健碼
透過重新繫結健碼來調整Emacs中的某些行為也是很常見的一項技術運用:
- 使用Customize介面:
- 按下
<Alt+x > customize輸入指令進入Customize介面。 - 在介面內可選擇
keyboard shortcut分類別。 - 在裡面可設定或更改某些功能所對應之熱健碼組合。
(global-set-key (kbd "<Alt+y>" )'kill-line) - 按下
內容解密:
(global-set-key (kbd "<Alt+y>" )'kill-line)
上面程式表示同時按住 < Alt > 鍵和 < y > 鍵之後會將遊標遊標所在位置以及該遊標之後之文字刪除掉;另外也會將其內容從剪貼簿複製過去給遊標遊標處起始點位置之前之文字取代掉。(注意!此處不是指一定要以英文輸入法輸出!)
寫入Emacs Lisp程式碼
透過編輯 .emacs 組態檔案來寫入 Emacs Lisp(elisp)程式碼來實作對 Emacs 的自定義行為也是很常見的一項技術運用:
- 編輯
.emacs組態檔案:$ vi ~/.emacs - 在檔案內輸入 elisp 陳述式:
;; This is an example of setting the default directory in emacs startup to "~/" (setq default-directory "~/")
內容解密:
$ vi ~/.emacs
以上指令表示我們要開啟 ~/.emacs 組態檔案來編輯它裡面內容;也就是我們要編輯Emcas啟動時所預設載入與執行之設定檔。
;; This is an example of setting the default directory in emacs startup to "~/"
(setq default-directory "~/")
上面這段程式則表示當我們每次啟動Emcas時其啟動時所預設載入與執行之目錄路徑設定成 “/” 。因為 “/” 指的是我們個人使用者目錄!
這種方法有著強大功能並且極其靈活!你甚至可以根據不同主題與不同需求來改變程式!
請注意,「此圖示」是指使用Plantuml製作之圖示!每一個標題與圖示都必須有詳細解說與對應標題!