[インデックス 10407] ファイルの概要
このコミットは、EmacsのGoモード(go-mode.el
)において、Go言語の組み込み関数であるdelete
をシンタックスハイライトの対象に追加するものです。これにより、EmacsエディタでGoのソースコードを編集する際に、delete
関数が正しく強調表示されるようになります。
コミット
- Author: Bobby Powers bobbypowers@gmail.com
- Date: Tue Nov 15 10:22:34 2011 -0800
- Commit Message:
misc/emacs: add delete builtin R=golang-dev, mpimenov, gri CC=golang-dev https://golang.org/cl/5370101
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/cb85e8ac274e69ba8e8142f92002768cae28c233
元コミット内容
misc/emacs: add delete builtin
R=golang-dev, mpimenov, gri
CC=golang-dev
https://golang.org/cl/5370101
変更の背景
Go言語には、マップから要素を削除するための組み込み関数delete
が存在します。Emacsのgo-mode.el
は、Go言語のソースコードを編集する際に、キーワードや組み込み関数などを適切にシンタックスハイライトするための設定を含んでいます。このコミットが作成された時点では、delete
関数がgo-mode.el
の組み込み関数リストに含まれていなかったため、Emacs上でdelete
が他の組み込み関数と同様にハイライトされず、視認性が低いという問題がありました。この変更は、delete
関数をハイライト対象に追加することで、開発者のコードリーディングと記述体験を向上させることを目的としています。
前提知識の解説
Go言語の組み込み関数
Go言語には、言語仕様の一部として提供されるいくつかの「組み込み関数(built-in functions)」があります。これらは特別な関数であり、インポートすることなく直接使用できます。例えば、len
(長さの取得)、cap
(容量の取得)、make
(スライス、マップ、チャネルの作成)、new
(ゼロ値の割り当て)、append
(スライスへの要素追加)、copy
(スライスのコピー)、panic
(ランタイムパニックの発生)、recover
(パニックからの回復)、print
/println
(出力)などがあります。delete
関数もその一つで、マップからキーとそれに対応する値を削除するために使用されます。これらの組み込み関数は、Go言語の基本的な操作を効率的に行うために不可欠です。
Emacsのfont-lock
とgo-mode.el
- Emacs
font-lock
: Emacsのfont-lock
モードは、テキストエディタにおけるシンタックスハイライト(構文強調表示)機能を提供するための主要なメカニズムです。このモードは、編集中のテキストの内容を解析し、キーワード、文字列、コメント、関数名などの異なる構文要素に対して、それぞれ異なる色やスタイル(フォントフェイス)を適用します。これにより、コードの構造が視覚的に明確になり、可読性が向上します。font-lock
は、各プログラミング言語のメジャーモード(例:go-mode
、python-mode
)が定義するルールに基づいて動作します。 go-mode.el
:go-mode.el
は、EmacsでGo言語のソースコードを編集するためのメジャーモードです。このファイルには、Go言語の構文に特化した設定、例えばインデントルール、コメントの扱い、そして最も重要なfont-lock
のためのシンタックスハイライトルールが定義されています。go-mode.el
は、Go言語のキーワード、組み込み関数、型名などを認識し、font-lock
を通じて適切なハイライトを適用するための正規表現やキーワードリストを保持しています。
技術的詳細
このコミットの技術的な核心は、go-mode.el
ファイル内のgo-mode-font-lock-keywords
というEmacs Lisp変数にあります。この変数は、font-lock
モードがGoコードをハイライトする際に参照するキーワードと正規表現のリストを定義しています。
具体的には、builtins
というリストが定義されており、ここにはGo言語の組み込み関数名が文字列として列挙されています。font-lock
は、このbuiltins
リストに含まれる文字列がGoコード内に出現した場合、それを組み込み関数として認識し、特定のフォントフェイス(通常は異なる色)でハイライトします。
このコミット以前は、Go言語のdelete
関数がこのbuiltins
リストに含まれていませんでした。そのため、Emacsのgo-mode
を使用しているユーザーは、delete
関数が他の組み込み関数(例: len
, make
)のように特別にハイライトされず、単なる通常の識別子として表示されていました。これは、コードの視認性を損ない、特にGo言語に慣れていない開発者にとっては、どの関数が組み込み関数であるかを一目で判断しにくくしていました。
このコミットでは、単にdelete
という文字列をbuiltins
リストに追加することで、この問題を解決しています。Emacs Lispのリスト操作により、既存のリストに新しい要素が追加され、go-mode
がロードされる際にfont-lock
が更新され、delete
関数も適切にハイライトされるようになります。
コアとなるコードの変更箇所
変更はmisc/emacs/go-mode.el
ファイルの一箇所のみです。
--- a/misc/emacs/go-mode.el
+++ b/misc/emacs/go-mode.el
@@ -69,7 +69,7 @@
some syntax analysis.\")
(defvar go-mode-font-lock-keywords
- (let ((builtins '("append" "cap" "close" "complex" "copy" "imag" "len"\
+ (let ((builtins '("append" "cap" "close" "complex" "copy" "delete" "imag" "len"\
"make" "new" "panic" "print" "println" "real" "recover"))\
(constants '("nil" "true" "false" "iota"))\
(type-name "\\s *\\(?:[*(]\\s *\\)*\\(?:\\w+\\s *\\.\\s *\\)?\\(\\w+\\)")\
コアとなるコードの解説
上記の差分は、go-mode.el
ファイル内のgo-mode-font-lock-keywords
というEmacs Lisp変数の定義部分を示しています。
(defvar go-mode-font-lock-keywords ...)
: これはEmacs Lispで変数を定義する構文です。go-mode-font-lock-keywords
は、go-mode
のシンタックスハイライトルールを保持する変数です。(let ((builtins '("append" "cap" "close" "complex" "copy" "imag" "len" ...)))
: ここでbuiltins
というローカル変数が定義され、Go言語の組み込み関数名のリストがクォートされたリスト('(
...)
)として割り当てられています。- (let ((builtins '("append" "cap" "close" "complex" "copy" "imag" "len"
: 変更前の行です。copy
の次にimag
が来ており、delete
が含まれていません。+ (let ((builtins '("append" "cap" "close" "complex" "copy" "delete" "imag" "len"
: 変更後の行です。copy
の直後に"delete"
が追加されています。これにより、builtins
リストにdelete
関数が組み込まれ、Emacsのfont-lock
機能がdelete
をGoの組み込み関数として認識し、適切にハイライトするようになります。
この変更は非常にシンプルですが、EmacsでGoコードを記述する開発者にとっては、コードの可読性と視認性を向上させる重要な改善となります。
関連リンク
- Go CL 5370101: https://golang.org/cl/5370101
参考にした情報源リンク
- Built-in functions in Go: https://pkg.go.dev/builtin
- Emacs Font Lock mode: https://www.gnu.org/software/emacs/manual/html_node/elisp/Font-Lock-mode.html
- Emacs
go-mode.el
source code (example offont-lock
usage): https://go.googlesource.com/go/+/refs/heads/master/misc/emacs/go-mode.el - Stack Overflow - How to add custom keyword highlighting in Emacs Lisp: https://stackoverflow.com/questions/1000000/how-to-add-custom-keyword-highlighting-in-emacs-lisp