[インデックス 18167] ファイルの概要
このコミットは、Go言語のEmacsメジャーモードであるgo-mode.el
に対する軽微なクリーンアップと改善を目的としています。具体的には、コードのコメントの修正、変数初期化の簡略化、フック関数の登録方法の推奨変更、そして関連するGo開発ツールの紹介文の更新が含まれています。
コミット
commit 81cab4c3d39278a2bc09e482e8aee9d458d6dfae
Author: Dominik Honnef <dominik.honnef@gmail.com>
Date: Mon Jan 6 10:48:06 2014 -0500
misc/emacs: minor cleanups
R=adonovan
CC=golang-codereviews
https://golang.org/cl/23290044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/81cab4c3d39278a2bc09e482e8aee9d458d6dfae
元コミット内容
misc/emacs: minor cleanups
R=adonovan
CC=golang-codereviews
https://golang.org/cl/23290044
変更の背景
このコミットは、Go言語のEmacsメジャーモードであるgo-mode.el
のコード品質とユーザビリティを向上させるための定期的なメンテナンスの一環として行われました。具体的な背景としては、以下の点が挙げられます。
- コメントの正確性向上:
regexp-opt
関数の挙動に関するコメントが、より正確なEmacsのバージョン情報を含むように修正されました。これは、Emacsのバージョン間の互換性の問題に対する注意喚起を明確にするものです。 - コードの簡潔化:
go-beginning-of-defun
関数における変数count
の初期化方法が、より簡潔なLispのイディオムに沿って変更されました。これは、コードの可読性と保守性を高めるための一般的なリファクタリングです。 - Emacsフックの推奨プラクティス:
before-save-hook
にgofmt-before-save
関数を追加する例において、推奨されるフック登録方法(#'
リーダーマクロの使用)に修正されました。これにより、Emacs Lispのベストプラクティスに準拠し、将来的な互換性やデバッグの容易さを確保します。 - 関連ツールの情報更新:
go-mode.el
のドキュメント文字列内で紹介されているGo開発関連ツールのリストが更新されました。これは、Goエコシステムの進化に合わせて、ユーザーに最新かつ有用な情報を提供するためのものです。特に、go-eldoc
という新しいツールが追加されています。
これらの変更は、go-mode.el
がEmacsユーザーにとってより堅牢で、使いやすく、最新のGo開発環境に対応できるようにするための継続的な取り組みを示しています。
前提知識の解説
このコミットを理解するためには、以下の前提知識があると役立ちます。
- Emacs (イーマックス): 高度にカスタマイズ可能なテキストエディタであり、統合開発環境 (IDE) としても機能します。EmacsはEmacs Lispというプログラミング言語で拡張されており、ユーザーはLispコードを記述することでエディタの挙動を細かく制御できます。
- Emacs Lisp (Elisp): Emacsの拡張機能や設定を記述するために使用されるLisp方言です。Emacsのほぼ全ての機能はEmacs Lispで実装されており、ユーザーはこれを直接操作することでエディタをカスタマイズします。
go-mode.el
: EmacsでGo言語のコードを編集するためのメジャーモードです。シンタックスハイライト、インデント、コード補完、定義へのジャンプなど、Go開発に特化した機能を提供します。regexp-opt
: Emacs Lispの関数で、複数の文字列から効率的な正規表現を生成するために使用されます。この関数は、与えられた文字列のリストから最適な正規表現パターンを構築し、シンタックスハイライトなどの処理を高速化します。defun
: Emacs Lispで関数を定義するためのマクロです。go-beginning-of-defun
のように、Go言語の関数定義の開始位置を見つけるための関数がgo-mode.el
内で定義されています。- Emacs Hooks (フック): 特定のイベント(ファイルの保存前、モードの有効化時など)が発生したときに自動的に実行される関数のリストです。ユーザーはこれらのフックに独自の関数を追加することで、Emacsの挙動をカスタマイズできます。例えば、
before-save-hook
はファイルを保存する直前に実行されます。 #'
リーダーマクロ (function quoting): Emacs Lispで関数を引用(クォート)するための構文です。'(function-name)
と同じ意味ですが、より簡潔で、関数が実際に存在するかどうかをコンパイル時にチェックできるという利点があります。フックに登録する関数を指定する際に推奨される形式です。gofmt
: Go言語の公式フォーマッタツールです。Goのコードを標準的なスタイルに自動的に整形します。gocode
: Go言語の自動補完デーモンです。Emacsなどのエディタと連携して、コード補完機能を提供します。goflymake
: EmacsのFlymakeモードと連携し、Go言語のコードに対してオンザフライでシンタックスチェックやエラー表示を行うツールです。go-eldoc
: EmacsのEldocモードと連携し、カーソル下のGoシンボルに関するドキュメントや型情報をミニバッファに表示するツールです。yasnippet-go
: EmacsのYasnippetスニペット拡張と連携し、Go言語のコードスニペットを提供します。
これらのツールは、EmacsをGo言語の強力な開発環境として利用するために不可欠なものです。
技術的詳細
このコミットは、misc/emacs/go-mode.el
ファイルに対して以下の技術的な変更を加えています。
-
コメントの修正 (
regexp-opt
関連): 変更前:;; we cannot use 'symbols in regexp-opt because emacs <24 doesn't ;; understand that
変更後:
;; we cannot use 'symbols in regexp-opt because GNU Emacs <24 ;; doesn't understand that
この変更は、
regexp-opt
関数が'symbols
引数を理解しないEmacsのバージョンに関するコメントを修正しています。具体的には、「emacs <24」という記述を「GNU Emacs <24」に修正し、より正確な情報を提供しています。これは、Emacsの異なるディストリビューション(例えばXEmacsなど)との区別を明確にするためと考えられます。 -
変数初期化の簡略化 (
go-beginning-of-defun
): 変更前:(defun go-beginning-of-defun (&optional count) (unless count (setq count 1)) (let ((first t) failure)
変更後:
(defun go-beginning-of-defun (&optional count) (setq count (or count 1)) (let ((first t) failure)
go-beginning-of-defun
関数内で、オプション引数count
の初期化方法が変更されました。- 変更前は
unless count (setq count 1))
という形式で、count
がnil
(引数が渡されなかった場合)であれば1
に設定していました。 - 変更後は
(setq count (or count 1))
という形式になりました。これはEmacs Lispのイディオムで、or
の評価は最初の非nil
値を返すため、count
がnil
であれば1
がcount
に設定され、nil
でなければcount
自身の値が設定されます。これにより、より簡潔に同じロジックを表現しています。 また、let
フォーム内の変数宣言も、より一般的なLispのインデントスタイルに合わせて整形されています。
- 変更前は
-
フック登録の推奨構文への変更: 変更前:
-\(add-hook 'before-save-hook 'gofmt-before-save)\
変更後:
+\(add-hook 'before-save-hook #'gofmt-before-save)\
before-save-hook
にgofmt-before-save
関数を追加する例において、関数を引用する際に'
(クォート)から#'
(リーダーマクロ)に変更されました。#'
は関数を引用する際に推奨される形式であり、コンパイル時にその関数が存在するかどうかをチェックできるため、より安全で堅牢なコードになります。 -
関連ツールの紹介文の更新: 変更前:
-\(https://github.com/nsf/gocode) and yasnippet-go\
変更後:
+\(https://github.com/nsf/gocode), go-eldoc\ +\(github.com/syohex/emacs-go-eldoc) and yasnippet-go\
go-mode.el
のドキュメント文字列内で、Go開発に役立つ関連ツールのリストが更新されました。既存のgocode
とyasnippet-go
に加えて、新たにgo-eldoc
(github.com/syohex/emacs-go-eldoc
)が追加されました。これは、Goエコシステムの進化と、EmacsでのGo開発体験をさらに向上させる新しいツールの登場を反映しています。 -
条件式の簡略化: 変更前:
- (when (and (string= (file-name-nondirectory file) file-name))\
変更後:
+ (when (string= (file-name-nondirectory file) file-name)\
when
フォーム内の条件式から冗長なand
が削除されました。when
は単一の条件式を受け入れるため、and
が不要な場合は省略することでコードが簡潔になります。この場合、string=
関数が単一の条件を評価しているため、and
は不要でした。
これらの変更は全体として、go-mode.el
のコードベースをより現代的で、保守しやすく、正確なものにするための「軽微なクリーンアップ」というコミットメッセージの意図を反映しています。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、misc/emacs/go-mode.el
ファイル内の以下の部分です。
-
go--build-font-lock-keywords
関数内のコメント修正:--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -61,6 +61,7 @@ ;; macro. (if nil (declare-function go--position-bytes "go-mode" (point))) + ;; XEmacs unfortunately does not offer position-bytes. We can fall ;; back to just using (point), but it will be incorrect as soon as ;; multibyte characters are being used. @@ -249,8 +250,8 @@ For mode=set, all covered lines will have this weight." "Syntax table for Go mode.") (defun go--build-font-lock-keywords () - ;; we cannot use 'symbols in regexp-opt because emacs <24 doesn't - ;; understand that + ;; we cannot use 'symbols in regexp-opt because GNU Emacs <24 + ;; doesn't understand that (append `((,(go--regexp-enclose-in-symbol (regexp-opt go-mode-keywords t)) . font-lock-keyword-face) (,(go--regexp-enclose-in-symbol (regexp-opt go-builtins t)) . font-lock-builtin-face)
-
go-beginning-of-defun
関数内の変数初期化:--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -450,8 +451,9 @@ current line will be returned." (start-line start-column end-line end-column num count) (mapcar #'string-to-number rest) (defun go-beginning-of-defun (&optional count) - (unless count (setq count 1)) - (let ((first t) failure)\ + (setq count (or count 1)) + (let ((first t) + failure) (dotimes (i (abs count)) (while (and (not failure) (or first (go-in-string-or-comment-p)))
-
ドキュメント文字列内のフック登録例の修正:
--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -513,7 +515,7 @@ The following extra functions are defined: If you want to automatically run `gofmt' before saving a file, add the following hook to your emacs configuration: -\(add-hook 'before-save-hook 'gofmt-before-save)\ +\(add-hook 'before-save-hook #'gofmt-before-save)\ If you want to use `godef-jump' instead of etags (or similar), consider binding godef-jump to `M-.', which is the default key
-
ドキュメント文字列内の関連ツール紹介の更新:
--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -532,7 +534,8 @@ If you're looking for even more integration with Go, namely on-the-fly syntax checking, auto-completion and snippets, it is recommended that you look at goflymake \(https://github.com/dougm/goflymake), gocode -\(https://github.com/nsf/gocode) and yasnippet-go\ +\(https://github.com/nsf/gocode), go-eldoc\ +\(github.com/syohex/emacs-go-eldoc) and yasnippet-go\ \(https://github.com/dominikh/yasnippet-go)" ;; Font lock
-
条件式の簡略化:
--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -1108,7 +1111,7 @@ divisor for FILE-NAME." (start-line start-column end-line end-column num count) (mapcar #'string-to-number rest) - (when (and (string= (file-name-nondirectory file) file-name))\ + (when (string= (file-name-nondirectory file) file-name)\ (if (> count max-count) (setq max-count count)) (push (make-go--covered :start-line start-line\
コアとなるコードの解説
上記の変更箇所は、それぞれ以下の目的で修正されています。
-
go--build-font-lock-keywords
関数内のコメント修正: このコメントは、Emacsのバージョン24未満ではregexp-opt
関数が'symbols
引数を正しく扱えないという既知の問題について言及しています。元のコメントは単に「emacs <24」としていましたが、より正確に「GNU Emacs <24」とすることで、Emacsの特定のディストリビューション(例えばXEmacs)との区別を明確にし、情報の精度を高めています。これは、ユーザーがこのモードを使用する際の互換性に関する誤解を防ぐための小さな改善です。 -
go-beginning-of-defun
関数内の変数初期化:go-beginning-of-defun
は、Go言語の関数定義の開始位置に移動するための関数です。count
引数は、何回移動するかを指定します。この変更は、count
が省略された場合にデフォルト値1
を設定するロジックを、Emacs Lispのより慣用的な表現である(setq count (or count 1))
に置き換えています。これは、or
が最初の非nil
値を返すという特性を利用したもので、コードをより簡潔にし、Lispのイディオムに沿った記述にすることで可読性を向上させています。 -
ドキュメント文字列内のフック登録例の修正:
go-mode.el
のドキュメント文字列には、gofmt
をファイルの保存前に自動実行するためのEmacs設定例が示されています。この例で、add-hook
関数に渡す関数名gofmt-before-save
の前に'
(クォート)ではなく#'
(リーダーマクロ)を使用するように修正されました。#'
は関数を引用する際に推奨される形式であり、コンパイル時にその関数が存在するかどうかをチェックできるため、タイプミスなどによる実行時エラーを防ぎ、より堅牢な設定を促します。これはEmacs Lispのベストプラクティスに従うものです。 -
ドキュメント文字列内の関連ツール紹介の更新:
go-mode.el
は、Go開発をさらに効率化するための外部ツール(goflymake
,gocode
,yasnippet-go
など)をドキュメント内で紹介しています。このコミットでは、新たにgo-eldoc
というツールが追加されました。go-eldoc
は、EmacsのEldocモードと連携して、カーソル下のGoシンボルに関するドキュメントや型情報をリアルタイムで表示する機能を提供します。この追加により、go-mode.el
のユーザーは、Go開発のためのより包括的なツールセットを知ることができ、開発体験を向上させることができます。 -
条件式の簡略化: この変更は、
when
フォーム内の条件式から冗長なand
を削除しています。元のコードでは(and (string= (file-name-nondirectory file) file-name))
となっていましたが、string=
関数自体が単一の真偽値を返すため、and
は不要でした。when
は単一の条件式を受け入れるため、and
を削除することでコードがより簡潔になり、無駄なネストが解消されます。これは、コードの可読性と効率性をわずかに向上させるためのリファクタリングです。
これらの変更は、個々には小さいものですが、全体としてgo-mode.el
の品質、保守性、そしてユーザーへの情報提供の正確性を向上させることに貢献しています。
関連リンク
- Go言語のEmacsメジャーモード (
go-mode.el
) のソースコード: https://github.com/golang/go/blob/master/misc/emacs/go-mode.el - このコミットのGo Gerrit Code Reviewリンク: https://golang.org/cl/23290044
goflymake
GitHubリポジトリ: https://github.com/dougm/goflymakegocode
GitHubリポジトリ: https://github.com/nsf/gocodego-eldoc
GitHubリポジトリ: https://github.com/syohex/emacs-go-eldocyasnippet-go
GitHubリポジトリ: https://github.com/dominikh/yasnippet-go
参考にした情報源リンク
- Emacs Lisp Reference Manual: https://www.gnu.org/software/emacs/manual/elisp.html
- GNU Emacs
regexp-opt
documentation: (Emacs Lisp ManualまたはEmacs内でC-h f regexp-opt
で確認可能) - Emacs Lisp
add-hook
documentation: (Emacs Lisp ManualまたはEmacs内でC-h f add-hook
で確認可能) - Emacs Lisp
#'
(function quoting) documentation: (Emacs Lisp ManualまたはEmacs内でC-h r i function quoting
で確認可能) - Go言語公式サイト: https://go.dev/
gofmt
documentation: https://go.dev/blog/gofmt- Emacs Wiki - Go Mode: https://www.emacswiki.org/emacs/GoMode (一般的な情報源として)
[インデックス 18167] ファイルの概要
このコミットは、Go言語のEmacsメジャーモードであるgo-mode.el
に対する軽微なクリーンアップと改善を目的としています。具体的には、コードのコメントの修正、変数初期化の簡略化、フック関数の登録方法の推奨変更、そして関連するGo開発ツールの紹介文の更新が含まれています。
コミット
commit 81cab4c3d39278a2bc09e482e8aee9d458d6dfae
Author: Dominik Honnef <dominik.honnef@gmail.com>
Date: Mon Jan 6 10:48:06 2014 -0500
misc/emacs: minor cleanups
R=adonovan
CC=golang-codereviews
https://golang.org/cl/23290044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/81cab4c3d39278a2bc09e482e8aee9d458d6dfae
元コミット内容
misc/emacs: minor cleanups
R=adonovan
CC=golang-codereviews
https://golang.org/cl/23290044
変更の背景
このコミットは、Go言語のEmacsメジャーモードであるgo-mode.el
のコード品質とユーザビリティを向上させるための定期的なメンテナンスの一環として行われました。具体的な背景としては、以下の点が挙げられます。
- コメントの正確性向上:
regexp-opt
関数の挙動に関するコメントが、より正確なEmacsのバージョン情報を含むように修正されました。これは、Emacsのバージョン間の互換性の問題に対する注意喚起を明確にするものです。 - コードの簡潔化:
go-beginning-of-defun
関数における変数count
の初期化方法が、より簡潔なLispのイディオムに沿って変更されました。これは、コードの可読性と保守性を高めるための一般的なリファクタリングです。 - Emacsフックの推奨プラクティス:
before-save-hook
にgofmt-before-save
関数を追加する例において、推奨されるフック登録方法(#'
リーダーマクロの使用)に修正されました。これにより、Emacs Lispのベストプラクティスに準拠し、将来的な互換性やデバッグの容易さを確保します。 - 関連ツールの情報更新:
go-mode.el
のドキュメント文字列内で紹介されているGo開発関連ツールのリストが更新されました。これは、Goエコシステムの進化に合わせて、ユーザーに最新かつ有用な情報を提供するためのものです。特に、go-eldoc
という新しいツールが追加されています。
これらの変更は、go-mode.el
がEmacsユーザーにとってより堅牢で、使いやすく、最新のGo開発環境に対応できるようにするための継続的な取り組みを示しています。
前提知識の解説
このコミットを理解するためには、以下の前提知識があると役立ちます。
- Emacs (イーマックス): 高度にカスタマイズ可能なテキストエディタであり、統合開発環境 (IDE) としても機能します。EmacsはEmacs Lispというプログラミング言語で拡張されており、ユーザーはLispコードを記述することでエディタの挙動を細かく制御できます。
- Emacs Lisp (Elisp): Emacsの拡張機能や設定を記述するために使用されるLisp方言です。Emacsのほぼ全ての機能はEmacs Lispで実装されており、ユーザーはこれを直接操作することでエディタをカスタマイズします。
go-mode.el
: EmacsでGo言語のコードを編集するためのメジャーモードです。シンタックスハイライト、インデント、コード補完、定義へのジャンプなど、Go開発に特化した機能を提供します。regexp-opt
: Emacs Lispの関数で、複数の文字列から効率的な正規表現を生成するために使用されます。この関数は、与えられた文字列のリストから最適な正規表現パターンを構築し、シンタックスハイライトなどの処理を高速化します。defun
: Emacs Lispで関数を定義するためのマクロです。go-beginning-of-defun
のように、Go言語の関数定義の開始位置を見つけるための関数がgo-mode.el
内で定義されています。- Emacs Hooks (フック): 特定のイベント(ファイルの保存前、モードの有効化時など)が発生したときに自動的に実行される関数のリストです。ユーザーはこれらのフックに独自の関数を追加することで、Emacsの挙動をカスタマイズできます。例えば、
before-save-hook
はファイルを保存する直前に実行されます。 #'
リーダーマクロ (function quoting): Emacs Lispで関数を引用(クォート)するための構文です。'(function-name)
と同じ意味ですが、より簡潔で、関数が実際に存在するかどうかをコンパイル時にチェックできるという利点があります。フックに登録する関数を指定する際に推奨される形式です。gofmt
: Go言語の公式フォーマッタツールです。Goのコードを標準的なスタイルに自動的に整形します。gocode
: Go言語の自動補完デーモンです。Emacsなどのエディタと連携して、コード補完機能を提供します。goflymake
: EmacsのFlymakeモードと連携し、Go言語のコードに対してオンザフライでシンタックスチェックやエラー表示を行うツールです。go-eldoc
: EmacsのEldocモードと連携し、カーソル下のGoシンボルに関するドキュメントや型情報をミニバッファに表示するツールです。yasnippet-go
: EmacsのYasnippetスニペット拡張と連携し、Go言語のコードスニペットを提供します。
これらのツールは、EmacsをGo言語の強力な開発環境として利用するために不可欠なものです。
技術的詳細
このコミットは、misc/emacs/go-mode.el
ファイルに対して以下の技術的な変更を加えています。
-
コメントの修正 (
regexp-opt
関連): 変更前:;; we cannot use 'symbols in regexp-opt because emacs <24 doesn't ;; understand that
変更後:
;; we cannot use 'symbols in regexp-opt because GNU Emacs <24 ;; doesn't understand that
この変更は、
regexp-opt
関数が'symbols
引数を理解しないEmacsのバージョンに関するコメントを修正しています。具体的には、「emacs <24」という記述を「GNU Emacs <24」に修正し、より正確な情報を提供しています。これは、Emacsの異なるディストリビューション(例えばXEmacsなど)との区別を明確にするためと考えられます。 -
変数初期化の簡略化 (
go-beginning-of-defun
): 変更前:(defun go-beginning-of-defun (&optional count) (unless count (setq count 1)) (let ((first t) failure)
変更後:
(defun go-beginning-of-defun (&optional count) (setq count (or count 1)) (let ((first t) failure)
go-beginning-of-defun
関数内で、オプション引数count
の初期化方法が変更されました。- 変更前は
unless count (setq count 1))
という形式で、count
がnil
(引数が渡されなかった場合)であれば1
に設定していました。 - 変更後は
(setq count (or count 1))
という形式になりました。これはEmacs Lispのイディオムで、or
の評価は最初の非nil
値を返すため、count
がnil
であれば1
がcount
に設定され、nil
でなければcount
自身の値が設定されます。これにより、より簡潔に同じロジックを表現しています。 また、let
フォーム内の変数宣言も、より一般的なLispのインデントスタイルに合わせて整形されています。
- 変更前は
-
フック登録の推奨構文への変更: 変更前:
-\(add-hook 'before-save-hook 'gofmt-before-save)\
変更後:
+\(add-hook 'before-save-hook #'gofmt-before-save)\
before-save-hook
にgofmt-before-save
関数を追加する例において、関数を引用する際に'
(クォート)から#'
(リーダーマクロ)に変更されました。#'
は関数を引用する際に推奨される形式であり、コンパイル時にその関数が存在するかどうかをチェックできるため、より安全で堅牢なコードになります。 -
関連ツールの紹介文の更新: 変更前:
-\(https://github.com/nsf/gocode) and yasnippet-go\
変更後:
+\(https://github.com/nsf/gocode), go-eldoc\ +\(github.com/syohex/emacs-go-eldoc) and yasnippet-go\
go-mode.el
のドキュメント文字列内で、Go開発に役立つ関連ツールのリストが更新されました。既存のgocode
とyasnippet-go
に加えて、新たにgo-eldoc
(github.com/syohex/emacs-go-eldoc
)が追加されました。これは、Goエコシステムの進化と、EmacsでのGo開発体験をさらに向上させる新しいツールの登場を反映しています。 -
条件式の簡略化: 変更前:
- (when (and (string= (file-name-nondirectory file) file-name))\
変更後:
+ (when (string= (file-name-nondirectory file) file-name)\
when
フォーム内の条件式から冗長なand
が削除されました。when
は単一の条件式を受け入れるため、and
が不要な場合は省略することでコードが簡潔になります。この場合、string=
関数が単一の条件を評価しているため、and
は不要でした。
これらの変更は全体として、go-mode.el
のコードベースをより現代的で、保守しやすく、正確なものにするための「軽微なクリーンアップ」というコミットメッセージの意図を反映しています。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、misc/emacs/go-mode.el
ファイル内の以下の部分です。
-
go--build-font-lock-keywords
関数内のコメント修正:--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -61,6 +61,7 @@ ;; macro. (if nil (declare-function go--position-bytes "go-mode" (point))) + ;; XEmacs unfortunately does not offer position-bytes. We can fall ;; back to just using (point), but it will be incorrect as soon as ;; multibyte characters are being used. @@ -249,8 +250,8 @@ For mode=set, all covered lines will have this weight." "Syntax table for Go mode.") (defun go--build-font-lock-keywords () - ;; we cannot use 'symbols in regexp-opt because emacs <24 doesn't - ;; understand that + ;; we cannot use 'symbols in regexp-opt because GNU Emacs <24 + ;; doesn't understand that (append `((,(go--regexp-enclose-in-symbol (regexp-opt go-mode-keywords t)) . font-lock-keyword-face) (,(go--regexp-enclose-in-symbol (regexp-opt go-builtins t)) . font-lock-builtin-face)
-
go-beginning-of-defun
関数内の変数初期化:--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -450,8 +451,9 @@ current line will be returned." (start-line start-column end-line end-column num count) (mapcar #'string-to-number rest) (defun go-beginning-of-defun (&optional count) - (unless count (setq count 1)) - (let ((first t) failure)\ + (setq count (or count 1)) + (let ((first t) + failure) (dotimes (i (abs count)) (while (and (not failure) (or first (go-in-string-or-comment-p)))
-
ドキュメント文字列内のフック登録例の修正:
--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -513,7 +515,7 @@ The following extra functions are defined: If you want to automatically run `gofmt' before saving a file, add the following hook to your emacs configuration: -\(add-hook 'before-save-hook 'gofmt-before-save)\ +\(add-hook 'before-save-hook #'gofmt-before-save)\ If you want to use `godef-jump' instead of etags (or similar), consider binding godef-jump to `M-.', which is the default key
-
ドキュメント文字列内の関連ツール紹介の更新:
--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -532,7 +534,8 @@ If you're looking for even more integration with Go, namely on-the-fly syntax checking, auto-completion and snippets, it is recommended that you look at goflymake \(https://github.com/dougm/goflymake), gocode -\(https://github.com/nsf/gocode) and yasnippet-go\ +\(https://github.com/nsf/gocode), go-eldoc\ +\(github.com/syohex/emacs-go-eldoc) and yasnippet-go\ \(https://github.com/dominikh/yasnippet-go)" ;; Font lock
-
条件式の簡略化:
--- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -1108,7 +1111,7 @@ divisor for FILE-NAME." (start-line start-column end-line end-column num count) (mapcar #'string-to-number rest) - (when (and (string= (file-name-nondirectory file) file-name))\ + (when (string= (file-name-nondirectory file) file-name)\ (if (> count max-count) (setq max-count count)) (push (make-go--covered :start-line start-line\
コアとなるコードの解説
上記の変更箇所は、それぞれ以下の目的で修正されています。
-
go--build-font-lock-keywords
関数内のコメント修正: このコメントは、Emacsのバージョン24未満ではregexp-opt
関数が'symbols
引数を正しく扱えないという既知の問題について言及しています。元のコメントは単に「emacs <24」としていましたが、より正確に「GNU Emacs <24」とすることで、Emacsの特定のディストリビューション(例えばXEmacs)との区別を明確にし、情報の精度を高めています。これは、ユーザーがこのモードを使用する際の互換性に関する誤解を防ぐための小さな改善です。 -
go-beginning-of-defun
関数内の変数初期化:go-beginning-of-defun
は、Go言語の関数定義の開始位置に移動するための関数です。count
引数は、何回移動するかを指定します。この変更は、count
が省略された場合にデフォルト値1
を設定するロジックを、Emacs Lispのより慣用的な表現である(setq count (or count 1))
に置き換えています。これは、or
が最初の非nil
値を返すという特性を利用したもので、コードをより簡潔にし、Lispのイディオムに沿った記述にすることで可読性を向上させています。 -
ドキュメント文字列内のフック登録例の修正:
go-mode.el
のドキュメント文字列には、gofmt
をファイルの保存前に自動実行するためのEmacs設定例が示されています。この例で、add-hook
関数に渡す関数名gofmt-before-save
の前に'
(クォート)ではなく#'
(リーダーマクロ)を使用するように修正されました。#'
は関数を引用する際に推奨される形式であり、コンパイル時にその関数が存在するかどうかをチェックできるため、タイプミスなどによる実行時エラーを防ぎ、より堅牢な設定を促します。これはEmacs Lispのベストプラクティスに従うものです。 -
ドキュメント文字列内の関連ツール紹介の更新:
go-mode.el
は、Go開発をさらに効率化するための外部ツール(goflymake
,gocode
,yasnippet-go
など)をドキュメント内で紹介しています。このコミットでは、新たにgo-eldoc
というツールが追加されました。go-eldoc
は、EmacsのEldocモードと連携して、カーソル下のGoシンボルに関するドキュメントや型情報をリアルタイムで表示する機能を提供します。この追加により、go-mode.el
のユーザーは、Go開発のためのより包括的なツールセットを知ることができ、開発体験を向上させることができます。 -
条件式の簡略化: この変更は、
when
フォーム内の条件式から冗長なand
を削除しています。元のコードでは(and (string= (file-name-nondirectory file) file-name))
となっていましたが、string=
関数自体が単一の真偽値を返すため、and
は不要でした。when
は単一の条件式を受け入れるため、and
を削除することでコードがより簡潔になり、無駄なネストが解消されます。これは、コードの可読性と効率性をわずかに向上させるためのリファクタリングです。
これらの変更は、個々には小さいものですが、全体としてgo-mode.el
の品質、保守性、そしてユーザーへの情報提供の正確性を向上させることに貢献しています。
関連リンク
- Go言語のEmacsメジャーモード (
go-mode.el
) のソースコード: https://github.com/golang/go/blob/master/misc/emacs/go-mode.el - このコミットのGo Gerrit Code Reviewリンク: https://golang.org/cl/23290044
goflymake
GitHubリポジトリ: https://github.com/dougm/goflymakegocode
GitHubリポジトリ: https://github.com/nsf/gocodego-eldoc
GitHubリポジトリ: https://github.com/syohex/emacs-go-eldocyasnippet-go
GitHubリポジトリ: https://github.com/dominikh/yasnippet-go
参考にした情報源リンク
- Emacs Lisp Reference Manual: https://www.gnu.org/software/emacs/manual/elisp.html
- GNU Emacs
regexp-opt
documentation: (Emacs Lisp ManualまたはEmacs内でC-h f regexp-opt
で確認可能) - Emacs Lisp
add-hook
documentation: (Emacs Lisp ManualまたはEmacs内でC-h f add-hook
で確認可能) - Emacs Lisp
#'
(function quoting) documentation: (Emacs Lisp ManualまたはEmacs内でC-h r i function quoting
で確認可能) - Go言語公式サイト: https://go.dev/
gofmt
documentation: https://go.dev/blog/gofmt- Emacs Wiki - Go Mode: https://www.emacswiki.org/emacs/GoMode (一般的な情報源として)