1 codenv 指令
指令 做什麼
codenv用數字選資料夾、選檔案,開好寫程式的畫面。按 n 新增資料夾或檔案,q 取消,直接按 Enter 是先不開檔案。
codenv layout重新選畫面要兩格還是三格。
codenv layout 2直接設成兩格:左邊寫程式、右邊看結果。
codenv layout 3直接設成三格:左邊 AI 或終端機、右上寫程式、右下看結果。
codenv root換程式資料夾;也可以直接打 codenv root ~/Documents/作業。資料夾不存在會自動建立,原本資料夾裡的程式不會搬過去。
codenv doctor檢查環境:編譯器、tmux、vim 設定、鍵盤設定,再請你按一下 F10 測試。F9、F10 沒反應時先跑這個。
程式預設放在 ~/programming_language 底下(安裝時可以選別的資料夾,之後用 codenv root 換),每個資料夾是一個科目或一次作業。新檔名一定要有副檔名(.cpp 或 .py)。
2 F9 與 F10
F9 :存檔,並檢查有沒有打錯。結果顯示在執行結果那格,最後一行用顏色標出 ✓ code is ok、⚠ code has warnings 或 ✗ code is error。游標留在 vim。之後一改程式,這一行會變成 ● 未儲存,存檔後變成 ✓ 已存檔,看一眼就知道有沒有存。剛用 vim 打開程式時,這一行一開始就是 ✓ 已存檔;按 Ctrl+S 存檔時它會反白閃一下,本來就存好了也會閃。
F10 :存檔、編譯、執行。有錯就跟 F9 一樣只顯示錯誤;沒錯就在執行結果那格執行,游標跳過去,程式要輸入資料就在那裡打。按 Esc 跳回 vim。
C++ 用 g++ -std=c++17 -Wall 編譯,執行檔放在旁邊的 bin 資料夾。Python 用 python3 執行。
怎麼看錯誤訊息
第 6 行: error: expected ';' in 'for' statement specifier
6 | for(r=1,r=r+1,r<10)
| ^
第一行:錯在第幾行、種類(error 是錯誤,不改就不能執行;warning 是提醒,可以執行但可能有問題)、說明。第二行把那行程式抄出來,^ 指出編譯器發現問題的位置。真正打錯的地方常常在 ^ 前面一點 。同一行在 vim 裡也會畫上紅色底線。
錯誤很多時,先修第一個 error 再按一次 F9 :後面的訊息常常是第一個錯連帶造成的。有 error 時 warning 先不顯示,最後會用一行灰字說還有幾個。
3 程式當掉時的訊息
程式有執行、但不是正常結束時,最後會出現紅字 ✗ code is error 和原因:
exit code 意思 常見原因
130 用 Ctrl+C 停止(不算錯) 程式停不下來時自己按的
134 程式中止 有例外(exception)沒有被處理
86 程式做了不允許的事 整數除以 0、陣列索引超出範圍。上面的 runtime error 那行會寫出第幾行(檔名:行:字)
138、139 記憶體存取錯誤 陣列索引超出範圍、指標沒設定好、遞迴太深
其他 回傳值不是 0 C++ 的 main 裡 return 1;Python 則看上面的錯誤訊息
4 vim 基本操作
vim 有兩種主要模式:一般模式 打的字是指令,輸入模式 打的字才會進到檔案。左下角出現 -- INSERT -- 代表在輸入模式。
按鍵 做什麼
i 進入輸入模式,開始打字
Esc 回到一般模式
:w存檔(沒有檔名時用 :w hw1.cpp 取名存檔)
:q / :q! / :wq關掉 / 不存檔直接關掉 / 存檔後關掉
:e!放棄還沒存的修改,回到上次存檔的內容
u復原(一般模式)
:e 檔名打開另一個檔案
:vsplit 檔名左右分兩格,在新的一格打開檔案
O / o 在這行上面 / 下面開一行新的並開始打字
更多按鍵(移動、刪除複製、搜尋取代、卡住時怎麼辦)在 vim 教學 。
5 編輯快捷鍵
這些按鍵跟 Windows 上的 C++ 編輯器(Dev-C++、Visual Studio)一樣,打字時也能用。
按鍵 做什麼
Ctrl +S 存檔
Ctrl +Z / Ctrl +Y 復原 / 重做
滑鼠拖曳、雙擊、Shift +方向鍵 選取文字;選取後直接打字會取代它,Backspace 刪掉
Ctrl +C / X / V 複製 / 剪下 / 貼上,跟 Mac 共用剪貼簿(⌘ Cmd +V 也能貼上)
Tab / Shift +Tab 選取多行時整塊增加 / 減少縮排;打字時 Shift+Tab 減少這行的縮排
Ctrl +F 搜尋:打要找的字按 Enter,再按 n 找下一個
fn +← / → 跳到行首 / 行尾(Home / End)
打 ( [ " 自動補上另一半;打 ) 會直接跳過已經有的那個;在空括號中間按 Backspace 兩個一起刪
{ 再按 Enter 自動補上 },游標停在中間縮排好的那行
做不到的 ⌘ Cmd 開頭的快捷鍵(⌘Z、⌘S、⌘C)會被 iTerm 自己攔走,傳不到 vim,請用上面的 Ctrl 版本。Ctrl+A 全選也不行,因為 Ctrl+A 是 tmux 的指令鍵。
想用 Cmd+S 存檔 在 iTerm 加一條按鍵設定,讓 Cmd+S 送出 Ctrl+S:按 ⌘ Cmd +, 打開設定 → 上方的 Profiles → Keys 分頁的 Key Mappings → 按清單下方的 + → 點 Keyboard Shortcut 的格子後按 Cmd+S → Action 選 Send Hex Code ,欄位填 0x13 → 下面的選單不要選 Apply to current session(只對目前分頁有效)→ 按 OK。馬上就能用,不用重開 iTerm。在 Claude Code 那格按 Cmd+S 不會存檔,只會顯示「要存程式請回到 vim 按 Ctrl+S」,打到一半的訊息不會不見。
6 tmux 入門
tmux 負責把一個終端機視窗切成好幾格,而且讓程式在背景繼續跑。先認識三個名詞:
名詞 是什麼 例子
格子(pane) 畫面上被切開的每一塊,各自跑一個程式 vim 一格、執行結果一格
分頁(window) 一整個畫面,裡面可以有好幾格;像瀏覽器的分頁 每次輸入 codenv 就開一個新分頁
工作階段(session) 一組分頁。關掉 iTerm 也不會消失,可以再接回來 最下面狀態列左邊的「Session 0」
最下面那條狀態列
Session 0 | [1] zsh [2] cpp
藍底是工作階段的名字;後面的 [1] zsh、[2] cpp 是分頁,數字是編號,按 Ctrl +A 再按數字就能切過去。
暫時離開,等一下再回來
按 Ctrl +A → d 會離開 tmux,回到一般的終端機,但裡面的程式、打到一半的檔案都還在背景。要回去就輸入:
往上看之前的輸出
在那一格用滑鼠滾輪往上捲就好。也可以按 Ctrl +A → [ 進入捲動模式,用方向鍵或 PageUp 移動,按 q 離開。每一格最多記得最近 10000 行。
7 tmux 快捷鍵
tmux 的快捷鍵都是兩段式:先按 Ctrl +A ,兩個都放開 ,再按下一個鍵。按錯了按 Esc 取消。
格子
按鍵 做什麼
Ctrl +A → | 左右分割(右邊開一格,資料夾跟目前這格一樣)
Ctrl +A → - 上下分割(下面開一格)
Ctrl +A → 方向鍵 或 h j k l 移到左 / 下 / 上 / 右那格(方向鍵可以連按)
Ctrl +A → o 依序換到下一格
Ctrl +A → q 在每一格上顯示編號,馬上按數字就跳過去
Ctrl +A → Ctrl +h j k l 把邊界往左 / 下 / 上 / 右推(按住 Ctrl 可以連續推)
Ctrl +A → z 把這格放大到整個畫面 / 還原
Ctrl +A → ! 把這格拆出去,變成獨立的分頁
Ctrl +A → x 關掉這格(會再問一次,按 Enter 確定、Esc 取消)
分頁
按鍵 做什麼
Ctrl +A → c 開一個新的分頁
Ctrl +A → n / p 下一個 / 上一個分頁
Ctrl +A → 1 ~9 直接切到第幾個分頁
Ctrl +A → w 列出所有分頁和格子,用 ↑↓ 選、Enter 切過去(右邊會預覽內容)
Ctrl +A → , 幫目前的分頁改名字(跟選單的「幫這個分頁取名」一樣)
Ctrl +A → & 關掉整個分頁(會再問一次,按 Enter 確定)
其他
按鍵 做什麼
Ctrl +A 連按兩次叫出中文選單(要另外裝 tmux-kit),見下一節
Ctrl +A → d 暫時離開 tmux(程式繼續在背景跑),用 tmux attach 回來
Ctrl +A → [ 捲動模式,往上看之前的輸出,q 離開
Ctrl +A → m ,或 F5 開關滑鼠功能(預設是開的)
Ctrl +A → r 重新讀取 tmux 設定(改了設定檔之後用)
Ctrl +A → a 把 Ctrl+A 本身傳給程式(例如命令列跳到行首)
Ctrl +A → ? 列出所有快捷鍵(英文),q 離開
Ctrl +A → : 直接打 tmux 指令(要打英文;中文輸入法開著的話先切成英文)
9 用滑鼠排列格子(tmux-kit)
要另外裝 tmux-kit 排列視窗是 tmux-kit 的功能,安裝方法見上一節 ,安裝時第 2 項選要裝。
格子、分頁多起來以後,用快捷鍵搬來搬去不好記。排列視窗把每個工作階段、分頁和格子畫成小縮圖,直接用滑鼠拖。
打開和收起
在 iTerm 裡按 Cmd +Ctrl +A 打開,再按一次收起來。在別的 App 按不會有反應,不會搶走那個 App 自己的快捷鍵。
切到別的 App 時,排列視窗會自動收起來;切回 iTerm 再按一次就出現。
也可以從 Ctrl+A 兩下的選單 選「用滑鼠排列格子(開視窗,Cmd+Ctrl+A)」。
按 Esc 、Cmd +W 或左上角的紅色按鈕都是收起來,下次按 Cmd+Ctrl+A 馬上出現。
視窗浮在 iTerm 上面,第一下就能直接拖,不用先點一下視窗。
iTerm 開成全螢幕也一樣,視窗會疊在現在的畫面上,不會跳到別的桌面。
可以做的事
想做的事 怎麼做
把格子搬到別的分頁 把格子拖到那個分頁的卡片上
把格子放到另一格旁邊 拖到那一格上面(那格比較寬就左右放,比較高就上下放)
把格子拆成新的分頁 拖到虛線框「新 window」,或在格子上按右鍵選「拆出去,變成新的 window」
交換兩個分頁的位置 按住分頁卡片的標題列拖到另一個分頁上
把分頁搬到別的工作階段 拖到那個工作階段的名字,或它的「新 window」
開新的工作階段 按右上角「新增 session」;把分頁或格子拖到這個按鈕或最下面的「新 session」,會開新的工作階段裝它
切換過去 點一下格子
改名字 雙擊分頁名字或格子,或按右鍵選改名;格子的名字留空就是拿掉。工作階段按它那一行的「改名」,或雙擊「Session …」
換排列方式 在分頁卡片上按右鍵,選左右並排、上下堆疊、左邊一大格、排成方格
工作階段改名、新增分頁、重新編號 工作階段那一行右邊的按鈕
視窗裡的 session、window、pane 就是 tmux 的工作階段、分頁、格子(見 tmux 入門 )。分頁名字旁邊的橘色小點代表那裡有新的動靜,例如 Claude 回覆完了。
不想要了 執行 tmux-kit 的解除安裝。檔案會移到家目錄的 tmux-kit-removed-日期時間 資料夾,不會直接刪掉。
zsh ~/.tmux-kit/uninstall.sh 複製
10 中文輸入法
注音、威注音這類輸入法開著時,你按的字母會先被拿去組字。codenv 的處理方式:
Ctrl+A 指令 :按下 Ctrl+A 的瞬間自動切成英文,指令做完再切回原本的輸入法。按完 Ctrl+A 稍等一下再按下一個鍵比較保險。
選單 :裝了 tmux-kit 的話,Ctrl+A 連按兩次叫出的選單只用方向鍵、Enter、Esc,完全不受輸入法影響。
vim 的快捷鍵 :Ctrl+S、Ctrl+Z、F9、F10 這些組合鍵和功能鍵,輸入法不會攔,照常能用。
11 滑鼠
點一下切換到那一格;滾輪上下捲動;拖曳格子之間的分隔線調整大小。
想把格子搬到別的分頁、交換分頁位置,可以裝 tmux-kit,按 Cmd +Ctrl +A 用排列視窗 拖曳。
在 vim 裡點一下移動游標,拖曳或雙擊選取文字,再按 Ctrl+C 複製。
在 vim 以外的格子(例如執行結果)想反白複製文字,要按住 Option 再拖曳,然後按 ⌘ Cmd +C 。
12 改成自己的習慣
codenv 是 MIT 授權,可以照自己的習慣改。最簡單的方法:把自己的設定寫在 .local 檔 。codenv 更新時會整個換掉 ~/.vimrc 和 ~/.tmux.conf,但不會動到 .local 檔,你的設定會一直保留。
想改的 寫在這個檔 什麼時候生效
vim ~/.vimrc.local下次打開 vim
tmux ~/.tmux.conf.local按 Ctrl+A → r 重新讀取
codenv 的資料夾、AI、格數 ~/.codenv.zsh 開頭的三行重開 iTerm(更新時會保留)
例如想讓 vim 的行號顯示成「離游標幾行」,用下面這行打開(沒有這個檔會自動建立):
touch ~/.vimrc.local && open -e ~/.vimrc.local 複製
在裡面寫 set relativenumber,存檔後重開 vim。寫在 .local 的設定會蓋過 codenv 的同一項設定。
想改得更多(例如改 F10 的行為),可以在 GitHub 上 fork 一份到自己的帳號來改,做法見技術文書的「原始碼與授權」 。
13 用 AI 輔助學習
用 AI 問程式問題時,先讓它知道「你是剛開始學 C++ 的新生、希望一步一步來」,它就不會一次丟一整支程式或一堆看不懂的名詞。下面這段是給 AI 的「記憶」,貼一次之後,每次對話它都會記得。
Gemini
打開 Gemini 的「將個人化記憶匯入 Gemini」頁面。
第 1 格的提示詞不用理它。
按下面方塊右邊的「複製」,貼到第 2 格「把你的資訊貼到這裡…」。
按「新增個人化記憶」。
使用者是大學一年級新生,正在修「計算機程式(一)」,課程教 C++,課本是 Savitch 的《Absolute C++》。使用者沒有任何程式基礎,第一次學寫程式,很多基本概念和名詞都還不懂。
課程內容依序是:第 1 章 C++ 基礎(cout、cin、變數、整數除法、%、型別轉換、++ 和 --、小數位數),第 2 章流程控制(if、switch、while、for、巢狀迴圈),第 3 章陣列(加總、最大最小值、搜尋、排序、矩陣)。成績有 60% 是三次上機考,要在電腦上自己把程式打出來、編譯、執行,考試用的編輯器是 Dev-C++;另外筆試 30%、作業 10%。
教使用者時的方式:
- 一律用繁體中文(台灣用語)回答。
- 一次只教一個概念或一個步驟,確認使用者懂了、做完了,再進下一步。不要一次丟出很多內容或一整支完整程式。
- 先用白話講,再補正式說法。專有名詞第一次出現時,用一句話解釋它是什麼。
- 解釋「為什麼」,不要只給答案。
- 使用者要練習上機考,所以寫作業或練習題時,先給提示和思考方向,讓使用者自己打程式;使用者卡住或主動要求時,再給更完整的程式碼。
- 每次出現使用者沒看過的新指令(例如 cout、for、rand),附上一個很短的範例和它的執行結果。
- 使用者貼出錯誤訊息或程式時,先說明那段訊息是什麼意思、錯在第幾行,再說下一步怎麼改,一次只改一個地方。
- 提醒使用者:上機考是電腦自動比對輸出,多一個或少一個空白都算錯,輸出格式要跟題目一模一樣。
- 語氣溫和、冷靜,像有耐心的學長姐。不要過度稱讚,也不要講空泛的鼓勵;使用者的理解有錯時,直接但友善地指出來。
- 使用者看起來很累或說看不懂時,把步驟拆得更小、講得更短。 複製
內容用「使用者」而不是「我、你」,是因為 Gemini 的匯入頁面要求用第三人稱。如果考試用的不是 Dev-C++,把那一句改成自己實際用的編輯器。
讓 AI 讀懂 codenv :想問 AI 關於 codenv 的問題時,把這個網址給它:https://raw.githubusercontent.com/olilllioli287/codenv_old/main/docs/guide.md。這是整個網站的純文字版,AI 比較讀得懂。AI 連不上網的話,打開這個網址按 ⌘S 存成檔案,再上傳給它。
ChatGPT、Claude 也能用 :貼到 ChatGPT 的「自訂指令」或 Claude 專案的「指示」欄位,效果一樣。
不要放個人資料 匯入的內容會存在服務商的紀錄裡,可能被拿去改進他們的服務。這段只寫了「新生、學 C++、希望怎麼被教」;自己加內容時,不要放名字、學號這類資料。
還有一點:上機考不能用 AI,最後還是要自己會打。讓 AI 給提示、自己動手寫,比直接拿答案有用得多。
14 換回舊版設定
每次安裝或更新,有變動的設定檔都會先備份成「檔名.bak-日期時間」。先列出備份檔:
ls ~/.vimrc.bak-* ~/.tmux.conf.bak-* 複製
再把想要的那份複製回來(把 日期時間 換成上面列出來的那串數字),然後重開 vim:
cp ~/.vimrc.bak-日期時間 ~/.vimrc 複製
15 解除安裝
在 iTerm(或內建的「終端機」)執行下面這一行:
zsh -c "$(curl -fsSL https://raw.githubusercontent.com/olilllioli287/codenv_old/main/uninstall.sh)" 複製
codenv 的檔案(~/.codenv.zsh、~/.codenv-ime、~/.codenv-compat、~/.codenv-kit,以及 codenv 裝的 ~/.vimrc、~/.tmux.conf)會移到家目錄的 codenv-removed-日期時間 資料夾,不會直接刪掉。
~/.zshrc 裡載入 codenv 的那行會拿掉(原本的檔案也備份在同一個資料夾)。
裝 codenv 之前原本就有 ~/.vimrc、~/.tmux.conf 的話,會放回當初的那份備份。
不會動 :你寫的程式(整個程式資料夾留著)、Homebrew、編譯器、tmux、iTerm2(別的程式可能也在用)。
裝了 tmux-kit 的話不會一起拿掉,要另外執行 zsh ~/.tmux-kit/uninstall.sh。
做完關掉 iTerm 再打開,codenv 指令就不見了。想恢復,再執行一次安裝的那一行就好;確定不要了,可以自己刪掉 codenv-removed-日期時間 資料夾。