開發環境與工具

開發環境(development environment) 是一組用來開發軟體的工具。核心是文字編輯能力,以及語法上色、型別檢查、程式碼格式化、自動補完等功能。像 VS Code 這類 整合開發環境(IDE),會把這些能力整合在同一個應用程式中。以終端機為主的工作流程則會組合多個工具,例如 tmux(終端機多工器)、Vim(文字編輯器)、Zsh(shell),以及語言專屬命令列工具,如 Ruff(Python linter 與 formatter)和 Mypy(Python 型別檢查器)。

IDE 與終端機工作流程各有優缺點。例如圖形化 IDE 通常較好上手,且現在多半內建較好的 AI 功能(如 AI 自動補完);另一方面,終端機流程更輕量,也可能是在沒有 GUI 或無法安裝軟體環境中的唯一選擇。建議你兩者都先有基本熟悉度,並至少精通其中一種。如果你還沒有偏好的 IDE,建議從 VS Code 開始。

本講會介紹:

文字編輯與 Vim

寫程式時,你多半是在程式碼間移動、閱讀片段並修改內容,而不是從頭到尾逐行閱讀或一次寫很長段文字。Vim 是專門為這種工作分布優化的編輯器。

Vim 的核心哲學。 Vim 的基礎概念很優雅:它的介面本身就是一門「用來移動與編輯文字」的程式語言。按鍵(具有記憶性命名)是指令,而這些指令可以組合。Vim 盡量避免滑鼠,因為太慢;甚至也盡量少用方向鍵,因為手部移動太多。結果是:它像腦機介面一樣,操作速度能逼近你的思考速度。

其他軟體中的 Vim 支援。 你不一定要直接使用 Vim 才能受益於它的核心理念。許多涉及文字編輯的工具都支援「Vim mode」,可能是內建或透過外掛。例子包含:VS Code 的 VSCodeVim 外掛、Zsh 的 內建 Vim 模擬支援,甚至 Claude Code 也有內建 Vim 編輯模式。你常用的文字工具,很可能都能用某種方式啟用 Vim mode。

模式化編輯(Modal editing)

Vim 是 modal editor:針對不同類型任務有不同操作模式。

同一按鍵在不同模式下意義不同。比如 x 在 Insert 模式只會輸入字元 "x";在 Normal 模式會刪除游標下字元;在 Visual 模式會刪除選取內容。

預設設定下,Vim 會在左下角顯示目前模式。初始模式是 Normal。你大多時間會在 Normal 與 Insert 之間切換。

<ESC>(Esc 鍵)可從任何模式回到 Normal。從 Normal 可用 i 進入 Insert、R 進入 Replace、v 進入 Visual、V 進入 Visual Line、<C-v>(Ctrl-V,也常寫作 ^V)進入 Visual Block、: 進入 Command-line。

使用 Vim 時會大量按 <ESC>,可以考慮把 Caps Lock 重映射成 Escape(macOS 教學),或設定一組替代按鍵映射

基本操作:插入文字

在 Normal 模式按 i 進入 Insert。此時 Vim 行為和一般編輯器類似,直到你按 <ESC> 回到 Normal。光靠這些基礎就能開始用 Vim 編輯檔案(雖然若長時間停留在 Insert,效率不會太高)。

Vim 介面是一門程式語言

Vim 的介面就是程式語言:按鍵是指令,而指令可 組合。這使移動與編輯非常高效,尤其當操作變成肌肉記憶後,就像熟悉鍵盤配置後打字會變得很快。

移動(Movement)

你應該大部分時間待在 Normal,靠移動指令在檔案中導航。Vim 把移動也稱為「名詞(nouns)」,因為它們描述的是文字範圍。

選取(Selection)

Visual 模式:

可搭配移動鍵擴展選取範圍。

編輯(Edits)

過去用滑鼠做的事,在 Vim 中可用鍵盤與「編輯指令 + 移動指令」組合完成。這正是 Vim 看起來像程式語言的地方。編輯指令也被稱為「動詞(verbs)」,因為動詞會作用在名詞上。

次數(Counts)

名詞與動詞可搭配次數,讓動作重複執行指定次數。

修飾子(Modifiers)

你可以用修飾子改變名詞語意。常見修飾子包括 i(inner/inside)與 a(around)。

綜合範例

下面是一個有問題的 fizz buzz 實作:

def fizz_buzz(limit):
    for i in range(limit):
        if i % 3 == 0:
            print("fizz", end="")
        if i % 5 == 0:
            print("fizz", end="")
        if i % 3 and i % 5:
            print(i, end="")
        print()

def main():
    fizz_buzz(20)

我們可在 Normal 模式下用以下指令序列修掉問題:

學習 Vim

學 Vim 最好的方式是先掌握基礎(也就是上面內容),接著把常用工具盡量開啟 Vim mode,直接在實作中使用。盡量忍住滑鼠與方向鍵的習慣;有些編輯器可直接取消方向鍵綁定,幫助你養成好習慣。

延伸資源

程式碼智慧與語言伺服器

IDE 通常透過連到 language server 的擴充套件來提供語言專屬能力,這些伺服器實作了 Language Server Protocol,能對程式碼做語意層級理解。例如 VS Code 的 Python extension 依賴 Pylance,而 Go extension 依賴官方 gopls。安裝你所用語言的 extension 與 language server 後,IDE 可啟用許多語言專屬能力,例如:

設定 language server

對某些語言來說,安裝 extension 與 language server 就能直接用。對另一些語言,若要發揮最大效果,你需要讓 IDE 知道你的執行環境。例如在 VS Code 指向你的 Python environment,language server 才能辨識你已安裝的套件。環境管理會在打包與交付講座更深入說明。

依語言不同,language server 可能還有額外可調設定。例如在 VS Code 的 Python 支援中,若專案未使用 Python 可選型別註記,你可關閉靜態型別檢查。

AI 輔助開發

自 2021 年中 GitHub Copilot 採用 OpenAI 的 Codex model 推出以來,LLM 已在軟體工程中廣泛普及。目前主要有三種形式:autocomplete、inline chat、coding agent。

Autocomplete

AI autocomplete 在介面上和傳統自動補完很像:你打字時,它會在游標處提供補全。它可以是「自然就生效」的被動功能;進一步也可透過程式碼註解做提示工程來引導結果。

例如我們要寫個腳本:下載這份講義並擷取所有連結。可先從這段開始:

import requests

def download_contents(url: str) -> str:

模型可能會自動補完整個函式內容:

    response = requests.get(url)
    return response.text

我們也可用註解進一步引導補全。例如若函式命名不夠描述性:

def extract(contents: str) -> list[str]:

模型可能會補成這樣:

    lines = contents.splitlines()
    return [line for line in lines if line.strip()]

加入註解後可更精準引導:

def extract(content: str) -> list[str]:
    # extract all Markdown links from the content

這次模型會給出更好的補全:

    import re
    pattern = r'\[.*?\]\((.*?)\)'
    return re.findall(pattern, content)

這裡可看出一個限制:它只能在游標位置做補全。此例更好的寫法其實是把 import re 放在模組層級,而不是函式內。

上例故意用較差命名來示範註解如何引導補全;實務中你應使用更清楚的函式名(如 extract_links),並撰寫 docstring(模型也應能據此生成類似上面的高品質補全)。

示範起見,我們可把腳本補完整:

print(extract(download_contents("https://raw.githubusercontent.com/missing-semester/missing-semester/refs/heads/master/_2026/development-environment.md")))

Inline chat

Inline chat 讓你選取某行或區塊後,直接要求 AI 提出修改。在這種互動模式下,模型可直接改既有程式碼(不同於 autocomplete 只能補游標後方)。

延續前例,假設我們不想用第三方 requests 函式庫。可選取相關三行後啟用 inline chat,輸入:

use built-in libraries instead

模型可能建議:

from urllib.request import urlopen

def download_contents(url: str) -> str:
    with urlopen(url) as response:
        return response.read().decode('utf-8')

Coding agents

Coding agent 會在 Agentic Coding 講座深入介紹。

推薦軟體

常見 AI IDE 包含安裝 GitHub Copilot 外掛的 VS Code,以及 Cursor。GitHub Copilot 目前對學生、教師與熱門開源專案維護者提供免費方案。這個領域變化很快,主流產品的核心功能也大致接近。

擴充套件與其他 IDE 功能

IDE 本身已很強大,加上 extensions 更是如虎添翼。我們無法在一堂課涵蓋所有功能,這裡先提供幾個常見方向。也鼓勵你自行探索,網路上有很多熱門擴充套件清單,例如 Vim 外掛網站 Vim Awesome 與依安裝數排序的 VS Code extensions

練習

  1. 在所有支援 Vim mode 的工具中(如編輯器與 shell)啟用 Vim mode,並在接下來一個月的文字編輯都盡量使用它。只要覺得某件事很低效,或想到「一定有更好做法」,就去搜尋看看;通常真的有更好做法。
  2. 完成一題 VimGolf 挑戰。
  3. 為你正在開發的專案設定 IDE 擴充套件與 language server。確認預期功能(如跳到第三方函式庫定義)都正常。若手上沒有可用專案,可改用 GitHub 開源專案(例如這個)。
  4. 瀏覽 IDE 擴充套件清單,安裝一個你覺得實用的擴充套件。

編輯此頁面

本內容採用 CC BY-NC-SA 授權。