EmacsでOpenAI Codex CLIを使う

しむどん 2025-04-20

OpenAIは、ターミナルで動作する軽量なコーディングエージェント「OpenAI Codex CLI」(以降、codexとする)をOSSで公開している。今回はこれを使えるように環境を整備していく。

基本的なインストール、設定、使い方

codexの基本的なインストール、設定、使い方についてはcodex自身のREADMEに書いてあるので、そっちを読むと良いだろう。ここでは触りだけをかいつまんで書く事にする。

codexはTypeScriptで実装されている。そのため実行にはJavaScriptの処理系が必要となる。ここではNode.jsの22.x系とnpmを既にインストールしている事を前提とする。

codexをインストールする。

npm install -g @openai/codex
npmを使ってcodexをインストールする

https://platform.openai.com/api-keysにアクセスし、APIキーを生成する。生成したAPIキーは環境変数 OPENAI_API_KEY に設定する。

export OPENAI_API_KEY=DUMMY
環境変数OPENAI_API_KEYにOpenAIのAPIキーを設定する。

codexは ~/.codex/ 配下の設定ファイルを読み込むため、設定ファイルを作成する。

mkdir -p ~/.codex
touch ~/.codex/config.yaml

設定ファイルを編集する。

model: o3-mini
approvalMode: suggest
fullAutoErrorMode: ask-user
notify: true
safeCommands:
  - npm test
  - yarn lint
~/.codex/config.yaml

APIキーの設定と設定ファイルの設置ができたら、codexを実行する準備は整った。早速 codex を起動する。

codex

codexが起動するとターミナル上に、入力及び出力用のインターフェースが表示される。あとはプロンプトを入力する場所に、プロンプトを入力しエンターを押すと処理が実行される。

本当に簡単だ。

Emacsの場合

codexはターミナル上で実行される事を想定しており、UIのベースにinkを使用している。これはReactのコンポーネントをターミナル上で使用可能なUIにするもので、当然だが制御コードがたくさん使われる事になる。通常のターミナルエミュレータであれば問題なく動作するが、Emacsの M-x shellM-x async-shell-command で実行した場合、制御コードが上手く処理できない事もあるだろう。そういった場合には vterm を使えば、正しく処理ができるため、 vterm から codex を起動するためのコマンドを書く事にした。

(defvar openai-codex-openai-api-key nil)

(defun openai-codex ()
  (interactive)
  (let* ((vterm-shell "/opt/homebrew/opt/node@22/bin/codex")
	 (exec-path (append 
		     '("/opt/homebrew/opt/node@22/libexec/bin"
		       "/opt/homebrew/opt/node@22/bin")
		     exec-path))
	 (process-environment (append
			       `(,(format "OPENAI_API_KEY=%s" openai-codex-openai-api-key)
				 ,(format "PATH=%s" (string-join exec-path ":"))
				 process-environment)))
	 (vterm-kill-buffer-on-exit nil))
    (vterm)))

(provide 'openai-codex)
;;; openai-codex.el ends here

Emacsの素敵な所は、このような拡張が即座に作れる所だろう。