如果你有在終端機裡工作,一定遇過需要編輯設定檔的時候。不管是改 SSH 設定、調整 swap、還是編輯 crontab,總是會碰到要打開某個檔案修改內容的情境。很多教學會叫你用 vim,但第一次打開 vim 的人通常連怎麼離開都不知道。其實有一個對新手更友善的選擇——nano。在之前的 常用 Linux 指令教學裡有簡單提過 nano,這篇就來完整介紹 nano 的所有操作方式和實用設定。

nano 是什麼

GNU nano 是一款在終端機裡運作的文字編輯器。它最早是為了取代 Unix 上的 Pico 編輯器而開發的自由軟體版本。nano 的設計哲學就是「簡單好用」——打開檔案就能直接打字編輯,不需要像 vim 那樣先搞懂什麼是 Normal mode、Insert mode。而且 nano 的畫面底部會直接顯示常用的快捷鍵,就算忘記操作也能隨時看到提示,非常適合剛開始接觸終端機的使用者。

很多人會問 nano 和 vim 到底該學哪個,這邊用一個表格快速比較一下:

特性nanovim
學習曲線低,打開就能打字高,需要學習模式切換
畫面提示底部顯示快捷鍵沒有提示,需要記指令
功能豐富度基本編輯功能足夠極度強大,可高度客製化
適合場景快速編輯設定檔、小型修改大量程式開發、專業文字編輯
預設安裝大部分 Linux 發行版內建Ubuntu 預設只有精簡版 vi
離開方式Ctrl+X:q!(還要先按 Esc)

簡單來說,如果你只是偶爾需要在終端機裡改個設定檔或做些小修改,nano 就非常夠用了。如果你是每天都在終端機裡寫大量程式碼的人,vim 的效率確實會更高,但那個學習成本也不是一天兩天的事。

安裝 nano

macOS 安裝

macOS 系統內建就有 nano 指令可以用,但其實它是 Pico(nano 的前身)的 symlink。你可以用 ls -l 確認:

# 查看 macOS 內建的 nano 其實指向 pico
ls -l /usr/bin/nano
# lrwxr-xr-x  1 root  wheel  4 /usr/bin/nano -> pico

Pico 是 1990 年代 Pine 郵件軟體附帶的編輯器,GNU nano 最初就是為了做出一個自由軟體版本的 Pico 替代品。但經過多年發展,GNU nano 已經加入了大量 Pico 沒有的功能,像是 undo/redo、行號顯示、語法高亮、搜尋取代等。macOS 內建的這個 Pico 版本非常精簡,很多本篇教學提到的功能都不支援。建議用 Homebrew 安裝完整版的 GNU nano,如果還沒裝過 Homebrew 可以參考 macOS Homebrew 新手教學|安裝與使用指南

# 安裝 GNU nano
brew install nano

# 用 which -a 確認系統上有哪些 nano
which -a nano
# /opt/homebrew/bin/nano    ← Homebrew 安裝的 GNU nano
# /usr/bin/nano             ← macOS 內建的 Pico

# 確認版本(應該要看到 GNU nano 而不是 pico)
nano --version

安裝完之後,Homebrew 版的 nano 路徑是 /opt/homebrew/bin/nano,只要 Homebrew 的路徑有在你的 PATH 前面(預設就是),輸入 nano 就會自動使用新版。如果發現 nano --version 還是顯示 Pico,可以在 ~/.zshrc 裡面加上 alias 強制指定:

# 在 ~/.zshrc 加入 alias 確保使用 Homebrew 版的 nano
echo "alias nano='/opt/homebrew/bin/nano'" >> ~/.zshrc

# 重新載入設定
source ~/.zshrc

Linux 安裝

大部分的 Linux 發行版都已經預裝了 nano,直接在終端機輸入 nano 就能確認。如果沒有的話,用套件管理工具安裝就可以。

# Ubuntu / Debian
sudo apt install nano

# CentOS / RHEL / Fedora
sudo dnf install nano

# Arch Linux
sudo pacman -S nano

# 確認安裝版本
nano --version

基本操作教學

開啟檔案

用 nano 開啟檔案的方式非常直覺,直接在 nano 後面接檔案名稱就好。如果檔案不存在,nano 會自動建立一個新檔案。

# 開啟已存在的檔案
nano myfile.txt

# 如果檔案不存在,nano 會建立新檔案
nano newfile.txt

# 開啟檔案並顯示行號(需要 GNU nano,macOS 內建版不支援)
nano -l myfile.txt

# 開啟檔案並跳到第 50 行
nano +50 myfile.txt

# 用 root 權限編輯系統設定檔
sudo nano /etc/hosts

了解 nano 的畫面

打開 nano 之後,畫面大致分成三個區塊:

  • 標題列(最上方):顯示 nano 的版本、目前開啟的檔案名稱。如果檔案被修改過但還沒儲存,會出現「Modified」字樣。
  • 編輯區(中間):檔案的內容,游標在這裡閃爍,你可以直接打字編輯。
  • 快捷鍵列(最下方兩行):顯示常用的操作快捷鍵。這是 nano 最貼心的設計,隨時都能看到提示。

在快捷鍵列裡面會看到兩種符號,這邊特別說明一下:

  • ^ 代表 Ctrl 鍵。例如 ^X 就是按 Ctrl + X
  • M- 代表 Meta 鍵,在大部分系統上就是 Alt 鍵。例如 M-U 就是按 Alt + U。macOS 使用者需要額外設定才能使用 Meta 快捷鍵,後面的常見問題會詳細說明。

儲存與離開

這大概是用 nano 最需要知道的兩個操作了。

儲存檔案(不離開):按 Ctrl + O(WriteOut),nano 會在底部顯示檔案名稱讓你確認,直接按 Enter 就會儲存。如果想存成別的檔名,這時候可以修改檔名再按 Enter

離開 nano:按 Ctrl + X。如果檔案有修改過但還沒儲存,nano 會問你要不要存檔:

  • Y:儲存後離開。接著會顯示檔名讓你確認,按 Enter 就好。
  • N:不儲存直接離開(放棄所有修改)。
  • Ctrl + C:取消,回到編輯畫面繼續編輯。

所以最常見的操作流程就是:編輯完內容後,按 Ctrl + X,按 Y 確認儲存,按 Enter 確認檔名,搞定。

實用開啟參數

nano 有幾個常用的命令列參數,可以在開啟檔案的時候加上去。下面標示「GNU nano」的參數代表 macOS 內建版(Pico)不支援,需要透過 Homebrew 安裝 GNU nano 才能使用。

參數功能範例支援
+行號開啟後跳到指定行nano +100 app.log全部
-m啟用滑鼠支援nano -m myfile.txt全部
-l顯示行號nano -l config.yamlGNU nano
-B儲存時自動建立備份檔(filename~nano -B /etc/nginx/nginx.confGNU nano
-i自動縮排(新行會跟上一行對齊)nano -i script.shGNU nano
-E將 Tab 轉換為空格nano -E code.pyGNU nano

如果你在 macOS 上還沒安裝 GNU nano,想知道目前游標在第幾行,可以按 Ctrl + C 查看游標位置,會顯示行號、欄位和總字元數。

游標移動與瀏覽

基本移動

除了用方向鍵移動游標之外,nano 也有一些快捷鍵可以更快速地在檔案裡面移動。

# 基本移動
Ctrl + A    # 跳到行首
Ctrl + E    # 跳到行尾
Ctrl + Y    # 向上翻一頁(Page Up)
Ctrl + V    # 向下翻一頁(Page Down)

# 跳到指定行號
Ctrl + _    # 輸入行號後按 Enter 跳過去(Ctrl + Shift + -)

# 跳到檔案開頭 / 結尾
Alt + \     # 跳到檔案第一行
Alt + /     # 跳到檔案最後一行

快速移動

如果想要一次移動一個單字而不是一個字元,可以用下面的快捷鍵:

# 以單字為單位移動
Ctrl + Space    # 往前跳一個單字
Alt + Space     # 往後跳一個單字

# 以段落為單位移動(需要 GNU nano 新版)
Alt + (         # 跳到上一個段落
Alt + )         # 跳到下一個段落

編輯操作

剪下、複製與貼上

通常可以直接使用滑鼠進行文字的選取,使用 Ctrl + C (Command + C) 複製,使用 Ctrl + V (Command + V) 貼上,但如果在沒有滑鼠的純終端機介面,或是不想頻繁交換使用鍵盤滑鼠,可以使用純鍵盤操作。

nano 的剪下貼上邏輯跟一般的文字編輯器有點不一樣,它是以「整行」為單位操作的。

# 剪下游標所在的那一整行
Ctrl + K

# 複製游標所在的那一整行(不會刪除)
Alt + 6

# 貼上剛才剪下或複製的內容
Ctrl + U

有一個很實用的技巧:連續按多次 Ctrl + K 會把多行一起剪下到同一個剪貼簿裡,之後按 Ctrl + U 就能一次貼上所有剪下的行。但如果中間有移動過游標,剪貼簿就會被重置,只會剪下最後那一行。

選取文字

如果不想整行操作,而是只想選取一部分文字,可以用標記功能。

# 在游標位置設定標記(開始選取)
Alt + A

# 移動游標選取範圍(選取的文字會反白)
# 用方向鍵或上面提到的移動快捷鍵都可以

# 對選取的範圍進行操作
Ctrl + K    # 剪下選取的文字
Alt + 6     # 複製選取的文字

# 貼上
Ctrl + U

# 取消選取
Alt + A     # 再按一次取消標記

復原與重做

改錯了不用怕,nano 支援 undo 和 redo。

# 復原上一步操作(Undo)
Alt + U

# 重做(Redo)
Alt + E

需要注意的是,undo/redo 功能需要 GNU nano 2.3.5 以上的版本才有。如果你在 macOS 上用的是系統內建的 nano(其實是 Pico),是沒有 undo 功能的,強烈建議用 Homebrew 安裝新版。

搜尋與取代

搜尋文字

在一個很長的檔案裡面要找特定內容,用搜尋比用眼睛慢慢看快多了。

# 開啟搜尋(Where Is)
Ctrl + W
# 輸入要搜尋的文字,按 Enter

# 搜尋下一個符合的結果
Alt + W

# 在搜尋畫面中切換搜尋方向
Alt + B     # 切換為向前搜尋 / 向後搜尋

# 在搜尋畫面中啟用正規表達式搜尋
Alt + R     # 切換 regex 模式

取代文字

搜尋加取代是編輯設定檔的時候很常用的功能,例如把舊的 IP 位址全部換成新的。

# 開啟搜尋並取代
Ctrl + \

# 操作流程:
# 1. 輸入要搜尋的文字,按 Enter
# 2. 輸入要取代成的文字,按 Enter
# 3. nano 會找到第一個符合的位置,問你要怎麼處理:
#    Y - 取代這個,然後找下一個
#    N - 不取代,跳到下一個
#    A - 全部取代(不再逐一詢問)

舉個實際的例子,假設你要把 Nginx 設定檔裡面的 port 從 8080 改成 3000:

# 開啟設定檔
sudo nano /etc/nginx/sites-available/default

# 按 Ctrl + \ 開啟搜尋取代
# Search: 8080
# Replace with: 3000
# 按 A 全部取代

# Ctrl + X → Y → Enter 儲存離開

快捷鍵對照表

把常用的快捷鍵整理成一張表,方便隨時查閱。Mac使用者使用 Option 鍵代替 Alt 鍵即可按出相應的功能。

分類快捷鍵功能
檔案Ctrl + O儲存檔案
檔案Ctrl + X離開 nano
檔案Ctrl + R插入其他檔案的內容
移動Ctrl + A / Ctrl + E跳到行首 / 行尾
移動Ctrl + Y / Ctrl + V上一頁 / 下一頁
移動Ctrl + _跳到指定行號
移動Alt + \ / Alt + /跳到檔案開頭 / 結尾
編輯Ctrl + K剪下整行
編輯Alt + 6複製整行
編輯Ctrl + U貼上
編輯Alt + A開始 / 取消選取
編輯Alt + U復原(Undo)
編輯Alt + E重做(Redo)
搜尋Ctrl + W搜尋
搜尋Alt + W搜尋下一個
搜尋Ctrl + \搜尋並取代
顯示Alt + N顯示 / 隱藏行號
顯示Alt + P顯示 / 隱藏空白字元
顯示Alt + #切換行註解

設定檔 .nanorc

設定檔位置

nano 的設定檔有兩個層級:

  • 全域設定/etc/nanorc,影響所有使用者。
  • 個人設定~/.nanorc(或 ~/.config/nano/nanorc),只影響自己,而且會覆蓋全域設定。

建議把設定寫在 ~/.nanorc,這樣不會影響到其他人,也比較好管理。

推薦設定

以下是一組實用的設定,每一行都有註解說明。把這些內容貼到 ~/.nanorc 就可以了。

# ============================
# 顯示設定
# ============================

# 顯示行號
set linenumbers

# 在狀態列持續顯示游標位置(行號、欄位、字元數)
set constantshow

# ============================
# 編輯行為
# ============================

# Tab 寬度設為 4 個字元
set tabsize 4

# 把 Tab 鍵轉換成空格
set tabstospaces

# 啟用自動縮排(新行會對齊上一行的縮排)
set autoindent

# 啟用滑鼠支援(可以用滑鼠點擊定位游標)
set mouse

# ============================
# 捲動與顯示
# ============================

# 捲動時保持游標在畫面中間附近,不會貼到最邊緣才捲動
set scrollerbound

# 超過螢幕寬度的行軟換行,避免需要水平捲動
set softwrap

# ============================
# 語法高亮
# ============================

# Linux:載入系統預裝的語法高亮定義檔
include "/usr/share/nano/*.nanorc"

# macOS Homebrew:如果用 Homebrew 安裝,改用下面這行
# include "/opt/homebrew/share/nano/*.nanorc"

NOTE: #開頭的文字是註解的意思,不會被 nano 讀取,你也可以在不想生效的設定最前面加上 # 讓 nano 忽略設定,想要快速測試不同設定效果的時候很方便。

語法高亮

GNU nano 內建就支援語法高亮,而且預設已經有很多常見語言和格式的定義檔,像是 Python、JavaScript、YAML、JSON、Bash、HTML、CSS 等。只要在 ~/.nanorc 裡面加上 include 那一行,nano 就會根據檔案的副檔名自動套用對應的語法顏色。

不同系統上語法定義檔的路徑不太一樣:

系統語法高亮檔路徑
Ubuntu / Debian/usr/share/nano/*.nanorc
CentOS / Fedora/usr/share/nano/*.nanorc
macOS(Homebrew)/opt/homebrew/share/nano/*.nanorc
Arch Linux/usr/share/nano/*.nanorc

如果你發現某些檔案類型沒有語法高亮,也可以自己寫定義檔放到 ~/.nano/ 目錄下面,然後在 ~/.nanorc 裡面 include 進來。不過大部分常見的檔案類型都已經有內建支援了。

實際應用情境

用 sudo nano 編輯系統設定檔

這是 nano 最經典的用途。Linux 上很多系統設定檔都需要 root 權限才能修改,用 sudo nano 就能直接編輯。

# 編輯網路設定
sudo nano /etc/hosts

# 編輯 SSH 設定
sudo nano /etc/ssh/sshd_config

# 編輯 swap 設定(可以參考 Swap 教學文章)
sudo nano /etc/fstab

# 編輯 Nginx 站台設定
sudo nano /etc/nginx/sites-available/default

像是之前在 Linux Swap 是什麼?怎麼新增?GCP VM 設定筆記 裡面,都有用到 sudo nano 來編輯系統設定檔。有了這篇教學,再回去看那些文章裡面的 nano 操作應該就很清楚了。

設定 nano 為預設編輯器

有些指令(像 crontab -egit commit)會呼叫系統預設的文字編輯器,如果預設是 vim 而你想改成 nano,可以在 Shell 設定檔裡面加上環境變數。

# 把以下兩行加到 ~/.bashrc 或 ~/.zshrc
export EDITOR=nano
export VISUAL=nano

# 加完之後重新載入設定
source ~/.bashrc   # 如果用 bash
source ~/.zshrc    # 如果用 zsh

設定之後,crontab -e 就會自動用 nano 開啟,不用再選編輯器了。

在 tmux 中使用 nano

如果你有在用 tmux,在 tmux 的 Pane 裡面開 nano 是非常常見的工作方式。可以一邊用 nano 編輯設定檔,另一邊的 Pane 跑 log 或測試指令,改完存檔馬上就能看到效果。而且在 tmux Session 裡面用 nano 編輯的好處是,就算 SSH 斷線,你的編輯狀態也不會消失,重新 attach 回來就能繼續。

常見問題

nano 的 ^ 和 M- 是什麼意思?

^ 代表 Ctrl 鍵,M- 代表 Meta 鍵。Meta 在大部分 Linux 系統上就是 Alt 鍵。另外一種按法是先按 Esc 再按對應的字母,效果一樣。例如 M-U(Undo)可以按 Alt + U,也可以先按 Esc 再按 U

macOS 上 Alt 快捷鍵沒反應怎麼辦?

macOS 的終端機預設不會把 Option(⌥)鍵當作 Meta/Alt 使用,所以 nano 的 M- 快捷鍵會沒反應。解決方法依你用的終端機 App 而不同:

macOS 內建 Terminal.app:打開 Terminal → 選單列的「Settings…」→ 選你在用的 Profile →「Keyboard」分頁 → 勾選「Use Option as Meta key」。

iTerm2:打開 iTerm2 → Preferences → Profiles → Keys → General → 把「Left Option key」改成「Esc+」。

設定完之後,Option + U 就等於 M-U(Undo),其他 Meta 快捷鍵也都能正常使用了。如果不想改設定,也可以用「先按 Esc 再按字母」的方式來替代。

nano 可以同時開多個檔案嗎?

可以。直接在指令後面接多個檔名就好:

# 同時開啟多個檔案
nano file1.txt file2.txt file3.txt

# 在檔案之間切換
Alt + <     # 切到上一個檔案
Alt + >     # 切到下一個檔案

# 在 nano 裡面開啟新檔案
Ctrl + R    # 插入其他檔案的內容到目前游標位置

nano 和 vim 我該學哪一個?

如果你只是偶爾需要在終端機裡編輯設定檔或做一些小修改,學 nano 就夠了。nano 的操作方式直覺,學習成本低,五分鐘就能上手。如果你是每天都在終端機裡寫程式的開發者,而且願意花時間學習,vim 的編輯效率確實會比較高。兩者並不衝突,很多人平常寫程式用 vim,但 SSH 上去改個設定檔的時候用 nano,看情境選擇就好。

怎麼在 nano 裡面顯示行號?

如果你用的是 GNU nano(Linux 或 macOS Homebrew 安裝),有三種方式:

  • 開啟時加上參數:nano -l filename
  • 在編輯中切換:按 Alt + N 可以即時開關行號
  • 永久設定:在 ~/.nanorc 裡面加上 set linenumbers

如果你用的是 macOS 內建版(Pico),以上功能都不支援。替代方案是按 Ctrl + C 查看游標目前的行號與欄位位置,或是用 Homebrew 安裝 GNU nano 來取得完整的行號顯示功能。