Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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-lockgo-mode.el

  • Emacs font-lock: Emacsのfont-lockモードは、テキストエディタにおけるシンタックスハイライト(構文強調表示)機能を提供するための主要なメカニズムです。このモードは、編集中のテキストの内容を解析し、キーワード、文字列、コメント、関数名などの異なる構文要素に対して、それぞれ異なる色やスタイル(フォントフェイス)を適用します。これにより、コードの構造が視覚的に明確になり、可読性が向上します。font-lockは、各プログラミング言語のメジャーモード(例: go-modepython-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コードを記述する開発者にとっては、コードの可読性と視認性を向上させる重要な改善となります。

関連リンク

参考にした情報源リンク