emacsの設定など
doom-modeline-def-modeline
についての解説
doom-modeline-def-modeline
は、doom-modeline
パッケージにおいてモードライン(Emacsのウィンドウ下部に表示される情報バー)のレイアウトを定義するための関数です。この関数を使うことで、特定のモードや状況に応じたカスタムモードラインを設定できます。
この関数は以下の形式で使用されます:
(doom-modeline-def-modeline モードライン名 左側の要素 右側の要素)
- モードライン名: このモードラインの設定に名前をつけます。これを使用して、後で特定のモードや状況にこのモードラインを適用できます。
- 左側の要素: モードラインの左側に表示される情報のリストです。これには、ファイル名、ウィンドウ番号、現在のバッファの情報などが含まれます。
- 右側の要素: モードラインの右側に表示される情報のリストです。これには、メジャーモード、マイナーモード、バージョン管理システム(Gitなど)の情報などが含まれます。
設定例
(doom-modeline-def-modeline 'phyten-dired
'(bar window-number buffer-default-directory) ; 左側のセクション
'(vcs github bar)) ; 右側のセクション
defun
を使って設定する例
;; Diredモード用のカスタムモードライン設定を適用する関数
(defun doom-modeline-set-phyten-dired-modeline ()
"Diredモード用のカスタムモードラインを設定します。"
(doom-modeline-set-modeline 'phyten-dired))
;; Diredモード時にカスタムモードラインを設定するためのフック
(add-hook 'dired-mode-hook 'doom-modeline-set-phyten-dired-modeline)
lambda
を使った例
(add-hook 'dired-mode-hook (lambda ()
"Diredモード用のカスタムモードラインを設定します。"
(doom-modeline-set-modeline 'phyten-dired)))
doom-modeline
と diminish
との関係性
doom-modeline
と diminish
は、Emacsのモードライン(ウィンドウの下部に表示される情報バー)をカスタマイズするための異なるツールです。以下でそれぞれの役割と関係を説明します。
diminish
は doom-modeline
でも有効。
(with-eval-after-load 'flycheck
(diminish 'flycheck-mode))
doom-modeline
-
目的:
doom-modeline
は、Emacsのモードラインを美しく、情報豊富にするためのパッケージです。doom-modeline
を使用すると、モードラインに表示される情報を細かくカスタマイズでき、見た目も洗練されたものになります。 -
機能:
doom-modeline
は、ファイルの種類、編集状態、Git ブランチ情報、警告やエラーの数など、多くの有用な情報をモードラインに表示します。アイコンや色の使用で、情報を視覚的にわかりやすく表現します。
diminish
-
目的:
diminish
は、モードラインに表示されるマイナーモードの名前を隠す(または短縮する)ために使われます。多くのマイナーモードが有効になっていると、モードラインが非常に乱雑に見えることがあります。diminish
を使用すると、必要のない情報を隠して、モードラインをすっきりと保つことができます。 - 機能: 特定のマイナーモードがモードラインに表示されないようにするか、あるいはより短い説明(あるいはアイコンやシンボル)に置き換えることができます。
関係性
-
doom-modeline
とdiminish
は、モードラインのカスタマイズにおいて異なるアプローチを取ります。doom-modeline
はモードラインの外観と機能を拡張することに重点を置いていますが、diminish
はモードラインをすっきりと見せるために不要な情報を隠すことに注力しています。 -
doom-modeline
を使用する場合でも、diminish
は依然として有用です。なぜなら、doom-modeline
には、すべてのマイナーモードを管理する機能が組み込まれていないからです。したがって、diminish
を併用することで、ユーザーはより細かいモードラインのカスタマイズを行うことができます。
#'
(シャープクォート)の意味
Emacs Lispでは、#'
(シャープクォート)は関数への参照を意味します。通常のシングルクォート '
と比較すると、#'
は特に関数が引数として渡される場合に使用されます。これは、渡されたオブジェクトが関数であることを明示し、Emacs Lispインタープリタにより最適化される可能性があります。
例えば、以下のコード:
(add-hook 'dired-mode-hook #'doom-modeline-set-phyten-dired-modeline)
ここで、#'doom-modeline-set-phyten-dired-modeline
はdoom-modeline-set-phyten-dired-modeline
という関数への参照を表します。add-hook
関数は、指定したモード(この場合はdired-mode
)が起動したときに実行する関数を追加するために使用されます。
#
はほぼ見た目の問題だけなので、つけなくても問題は無い。
Smartparensの具体的な使い方
Smartparensのsp-with-modes
は、特定のモードにおける括弧のペア、挿入ルール、キーバインドなどをカスタマイズするために使用されます。以下に7つの具体的な使用例を示します。各例は、特定の状況で特定のモードにおける括弧の動作をカスタマイズします。
1. Emacs Lispモードでのクォートの動作をカスタマイズ
(sp-with-modes 'emacs-lisp-mode
(sp-local-pair "'" nil :actions nil)
(sp-local-pair "`" nil :actions nil))
2. Orgモードでの強調記号のペア設定
(sp-with-modes 'org-mode
(sp-local-pair "*" "*")
(sp-local-pair "/" "/")
(sp-local-pair "_" "_")
(sp-local-pair "+" "+"))
3. WebモードでのHTMLタグの挿入ルール
(sp-with-modes 'web-mode
(sp-local-pair "<" ">" :wrap "C-<")
(sp-local-pair "{" "}" :wrap "C-{"))
4. Pythonモードでの文字列リテラルのペア
(sp-with-modes 'python-mode
(sp-local-pair "'" "'" :wrap "C-'")
(sp-local-pair "\"" "\"" :wrap "C-\""))
5. Markdownモードでの特殊なペアの設定
(sp-with-modes 'markdown-mode
(sp-local-pair "```" "```")
(sp-local-pair "**" "**" :wrap "C-*")
(sp-local-pair "_" "_" :wrap "C-_"))
6. C++モードでのブレースの自動挿入
(sp-with-modes '(c++-mode)
(sp-local-pair "{" nil :post-handlers '(("||\n[i]" "RET")))
(sp-local-pair "(" ")" :wrap "C-("))
7. Rubyモードでのブロック構文のカスタマイズ
(sp-with-modes '(ruby-mode)
(sp-local-pair "do" "end"
:when '(("SPC" "RET"))
:post-handlers '(("||\n[i]" "RET") ("| " "SPC"))))
これらの例では、括弧のペア、ラッピングショートカット、特定のアクション後のハンドラ(例えば、改行後に自動でインデントするなど)を設定しています。これにより、Smartparensはこれらのモードにおいてより直感的かつ効率的に操作できるようになります。
sp-local-pair
関数は、Smartparensパッケージにおいて、特定のモード(または複数のモード)で使用する括弧のペアの挙動をカスタマイズするために使われます。この関数を使用することで、特定のモードでのみ有効になる括弧のペアや、そのペアが挿入されたときの特定の動作を定義できます。
sp-local-pair
の基本的な構造
(sp-local-pair モード "開始文字" "終了文字" オプション...)
- モード: 括弧のペアが適用されるモードを指定します。単一のモードやモードのリストを指定できます。
- "開始文字": ペアの開始部分を表す文字列です。
- "終了文字": ペアの終了部分を表す文字列です。
- オプション: ペアの動作をカスタマイズするための追加オプションです。
オプションの例
- :wrap: 特定のキーによってこのペアを挿入するためのショートカットを設定します。
- :trigger: 特定の文字列をタイプしたときにこのペアを自動的に挿入するトリガーを設定します。
- :pre-handlers と :post-handlers: ペアが挿入される前後に実行される関数を指定します。
- :when と :unless: ペアが挿入される条件を指定します。これにより、特定の文脈でのみペアが挿入されるように制限できます。
- :actions: このペアに対して有効なアクション(挿入、ラップ、ナビゲートなど)を指定します。
使用例
(sp-with-modes '(c-mode c++-mode)
(sp-local-pair "/*" "*/" :post-handlers '((" | " "SPC") ("* ||\n[i]" "RET"))))
この例では、CおよびC++モードで、/*
と */
のペアを定義しています。さらに、/*
の後にスペースキーを押すと /* | */
のようにカーソルが中央に配置され、/*
の後にエンターキーを押すと次の行に自動的に *
が挿入されてインデントされるように設定しています。
sp-local-pair
を使うことで、プログラミング言語やマークアップ言語の特有の構文に合わせた括弧の挙動をカスタマイズできるため、コーディングの効率が大幅に向上します。
文字列のケースを変換
(leaf *pascal-camel-snake-kebab-converter
:doc "パスカルケース、キャメルケース、スネークケース、ケバブケース間での文字列変換機能"
:config
;; 関数定義
(defun phyten/decamelize (string)
"Convert from CamelCaseString to camel_case_string."
(let ((case-fold-search nil))
(downcase
(replace-regexp-in-string
"\\([A-Z]+\\)\\([A-Z][a-z]\\)" "\\1_\\2"
(replace-regexp-in-string
"\\([a-z\\d]\\)\\([A-Z]\\)" "\\1_\\2"
string)))))
(defun phyten/camerize<->decamelize (str)
(let ((case-fold-search nil))
(cond
((string-match "_" str)
(replace-regexp-in-string "_" "-" str))
((string-match "-" str)
(let ((los
(mapcar 'capitalize (split-string str "-" t))))
(mapconcat 'identity los "")))
((string-match "^[A-Z]" str)
(let ((words (split-string (phyten/decamelize str) "_" t)))
(let ((los
(append (list (car words))
(mapcar 'capitalize (rest words)))))
(mapconcat 'identity los "")
)))
(t
(phyten/decamelize str)))))
(defun phyten/camerize<->decamelize-thing-ad-point-or-region (s e)
(interactive "r")
(unless (use-region-p)
(let ((bounds (bounds-of-thing-at-point 'symbol)))
(setq s (car bounds))
(setq e (cdr bounds))))
(let* ((buf-str (buffer-substring-no-properties s e))
(str (phyten/camerize<->decamelize buf-str)))
(delete-region s e)
(insert str)))
;; 以下の順番で変換される
;; (ik:camerize<->decamelize "CamelOrSnake")
;; (ik:camerize<->decamelize "camelOrSnake")
;; (ik:camerize<->decamelize "camel_or_snake")
;; (ik:camerize<->decamelize "camel-or-snake")
;; キーバインドの設定
(bind-key "H-_" 'phyten/camerize<->decamelize-thing-ad-point-or-region))
ファイルローカル変数
ファイルローカル変数とは、特定のEmacsのテキストファイルに対してのみ適用される変数のことを指します。これらの変数は、特定のファイル内でのみ有効であり、そのファイルが閉じられるとその設定は無効になります。
ファイルローカル変数は、ファイルの先頭または末尾に特別な構文を用いて設定されます。これにより、そのファイルを編集する際には特定のEmacsの設定(例えば、インデントのスタイルやタブの幅など)が適用されますが、他のファイルには影響を与えません。
ファイルローカル変数の設定方法の一例を以下に示します。この例では、ファイルの末尾に設定を記述しています:
;; Local Variables:
;; mode: emacs-lisp
;; indent-tabs-mode: nil
;; End:
この例では、mode
が emacs-lisp
に設定されているため、このファイルはEmacs Lispモードで開かれます。また、indent-tabs-mode
が nil
に設定されているため、タブではなくスペースを使ったインデントが適用されます。
ファイルローカル変数は、プロジェクト固有の設定をファイルに直接組み込むのに便利です。これにより、異なる環境やエディタ設定を持つチームメンバー間でのコーディングスタイルの統一が容易になります。
(put 'var 'safe-local-variable #'stringp)
というコードは、Emacs Lispで使用される構文です。このコードは、特定の変数(この場合は var
)が安全なローカル変数としてマークされることを指示しています。これにより、var
という変数は、ファイルごとに異なる値を持つことができるようになります(いわゆる「ファイルローカル変数」)。
具体的には、以下の各要素は次のような意味を持ちます:
-
put
:指定されたシンボルにプロパティを設定する関数です。 -
'var
:プロパティを設定するシンボル(この例では、変数var
)。 -
'safe-local-variable
:設定するプロパティの種類で、これが「安全なローカル変数」であることを意味します。 -
#'stringp
:このプロパティの値で、stringp
は引数が文字列であるかどうかをチェックする関数です。この場合、var
が文字列である場合のみ、安全なローカル変数として扱われます。
これにより、var
がファイルローカル変数として使われる際に、その値が文字列であることが保証されます。Emacsでは、ファイルの先頭や末尾に特定のコメントを記述することで、そのファイルにのみ適用されるローカル変数を設定することができます。このコードは、そのようなローカル変数の使用をより安全にするために使われます。
put
関数による safe-local-variable
プロパティの設定は、特定の変数がファイルローカル変数として安全であることをEmacsに伝えるために使われます。例として var
という変数に対してこの設定を行う場合、以下のようになります:
(put 'var 'safe-local-variable #'stringp)
このコードは var
という変数がファイルローカル変数として使われる際に、その値が文字列 (stringp
関数で検証) であることを保証します。これにより、var
がファイルローカル変数として設定される時、その値が文字列であることが保証され、そうでない場合は警告が発されるか、またはその値が無視されます。
例えば、あるEmacs Lispファイルの末尾に以下のようなファイルローカル変数が設定されているとします:
;; Local Variables:
;; var: "何らかの文字列"
;; End:
上記の put
関数による設定があれば、Emacsは var
が "何らかの文字列"
という値で安全に設定されていると判断します。もし var
が数値やリストなどの非文字列値に設定されている場合、Emacsは警告を出すかその設定を無視します。
このような機能は、ファイルローカル変数を使ってカスタムの設定を行う際に、安全性と整合性を保つために重要です。特にチームでのプロジェクト開発において、不適切な設定がプロジェクトに混入するのを防ぐために役立ちます。
"\\.rake\\'"
の中の \\'
は、Emacs Lispにおける正規表現の一部です。ここでの \\'
は文字列の終わりを意味します。つまり、"\\.rake\\'"
は、ファイル名が .rake
で終わるファイルを意味します。
詳しく説明すると:
-
\\.
:ピリオド.
は正規表現において「任意の1文字」を意味しますが、ここではリテラルのピリオドを表現するために\\
でエスケープされています。 -
rake
:リテラルの文字列rake
を表します。 -
\\'
:文字列の終わりを意味します。これにより、文字列が.rake
で終わる場合にのみマッチするようになります。
したがって、このパターンは ".rake" で終わるファイル名に一致するように設計されています。例えば、"my_script.rake" はマッチしますが、"my_script.rake_backup" はマッチしません。
(push 'ruby-mode page-break-lines-modes)
は、page-break-lines-modes
というリストに ruby-mode
を追加するためのEmacs Lispのコードです。この操作は add-hook
と似ていますが、目的としては異なります。
具体的には:
-
push
:この関数は第一引数の要素を第二引数のリストの先頭に追加します。 -
'ruby-mode
:追加する要素です。ここではruby-mode
というシンボル(Emacsのモードを表す)が使われています。 -
page-break-lines-modes
:リストの名前です。このリストは、通常page-break-lines
パッケージによって使用され、ASCIIのページ区切り文字(通常は連続した^L
文字)を視覚的に表示するモードを指定します。
結果として、このコード行は ruby-mode
を page-break-lines
パッケージが処理するモードのリストに追加します。これにより、ruby-mode
で編集している時にページ区切り文字が適切に表示されるようになります。
ruby-mode
は通常、Emacs のバージョンによって異なりますが、多くの現代の Emacs バージョンでは prog-mode
から派生しています。つまり、ruby-mode
は prog-mode
の特性やフックを継承します。
特定のモードが prog-mode
から派生しているかどうかを確認する方法:
-
Emacs のヘルプ機能を使用する: Emacs のヘルプ機能を使って、特定のモードについての情報を調べることができます。
C-h f
(describe-function
)コマンドを使用してruby-mode
を調べると、そのモードに関する詳細情報が表示され、通常はそのモードがどのモードから派生しているかが記載されています。 -
Emacs Lisp のコードを使う: Emacs Lisp の
derived-mode-p
関数を使用して、特定のモードがprog-mode
から派生しているかどうかをプログラム的に確認することもできます。例えば、ruby-mode
がprog-mode
から派生しているかどうかを確認するには、以下のような Emacs Lisp の式を評価します。(derived-mode-p 'ruby-mode 'prog-mode)
この式が
t
を返せば、ruby-mode
はprog-mode
から派生していることを意味します。
これらの方法を使って、任意のモードが prog-mode
から派生しているかどうかを確認できます。また、Emacs の新しいバージョンでは、ほとんどのプログラミング言語用のモードが prog-mode
から派生しているのが一般的です。
add-hook 'ruby-mode-hook 'subword-mode
という式は、Emacsの ruby-mode
でファイルを編集する際に subword-mode
を自動的に有効にするための設定です。これは、Emacsのフック機能を使用して特定のモード(この場合は ruby-mode
)が有効になるたびに特定の関数(subword-mode
)を自動的に実行するようにします。
subword-mode について
- subword-mode: このモードは、キャメルケースやスネークケースなどの複合語の単語境界でカーソルの移動や単語操作を行うことを可能にします。たとえば、"CamelCase" のような文字列で "C" と "C" の間を単語の境界として扱います。
- ruby-mode: Rubyプログラミング言語用のメジャーモードです。Rubyのソースコードを編集する際にシンタックスハイライトや適切なインデント設定などを提供します。
この設定を行うことで、Rubyのソースコードを編集する際にも subword-mode
の機能が自動的に利用できるようになります。これは特に、Rubyのメソッド名や変数名がキャメルケースで書かれている場合に便利です。
ruby-deep-indent-paren-style
とは何か
ruby-deep-indent-paren-style
は Emacs の Ruby モードにおけるインデントのスタイルを設定するための変数です。この変数を true
(または t
)に設定すると、Ruby のソースコード内で括弧やブロックを深くインデントするスタイルになります。
具体的な動作
この変数が t
に設定されている場合、Ruby のメソッド呼び出しやブロック内の引数リストなどで、括弧やブロックの開始後に改行が入ると、次の行が深くインデントされます。例えば:
# ruby-deep-indent-paren-style が t の場合
some_method(arg1,
arg2,
arg3)
# ruby-deep-indent-paren-style が nil の場合
some_method(arg1,
arg2,
arg3)
設定方法
この変数を設定するには、次のように Emacs の設定ファイル(例えば init.el
)に記述します:
(setq ruby-deep-indent-paren-style t)
これにより、Ruby モードでのインデントスタイルが変更されます。Ruby のコードを書く際の好みに応じて、この設定をカスタマイズすることができます。
auto-insert-mode
とは何か
auto-insert-mode
は Emacs におけるファイル作成の補助機能です。このモードが有効になっていると、新しいファイルを作成する際にテンプレートや既定の内容を自動的に挿入することができます。
具体的な動作
例えば、特定の種類のファイルを新規作成する際に、ライセンス情報やヘッダーのコメント、初期のコード構造など、あらかじめ定義されたテンプレートをファイルに挿入したい場合に便利です。auto-insert-mode
は auto-insert-alist
という変数を用いて、ファイルの種類ごとにどのテンプレートを使用するかを指定します。
設定方法
auto-insert-mode
を有効にするには、Emacs の設定ファイル(例えば init.el
)に以下のように記述します:
(auto-insert-mode t) ; auto-insert-mode を有効化
この設定により、auto-insert-mode
が全体的に有効になります。テンプレートのカスタマイズや特定のファイルタイプとの関連付けは auto-insert-alist
を編集して行います。
projectile-rails
パッケージについて
projectile-rails
は Emacs 用の拡張機能で、Rails プロジェクトのための便利な機能を提供します。このパッケージは projectile
パッケージに依存しており、projectile
のプロジェクト管理機能と組み合わせて、Rails アプリケーションのファイルへのナビゲーション、RSpec や他のテストツールの実行、データベーススキーマやルーティングの確認などを簡単に行うことができます。
設定の解説
(leaf projectile-rails
:ensure t
:config
(add-hook 'projectile-mode-hook
(lambda () (projectile-rails-global-mode projectile-mode)))
)
-
(leaf projectile-rails :ensure t ...)
:
leaf
は設定を管理するためのマクロで、ここではprojectile-rails
パッケージを利用することを宣言しています。:ensure t
はパッケージがインストールされていない場合に自動的にインストールするように指示します。 -
:config
セクション:
ここでprojectile-rails
の設定を行います。 -
(add-hook 'projectile-mode-hook ...)
:
projectile-mode-hook
は、projectile-mode
が有効になったときに実行されるフックです。ここでは無名関数(ラムダ式)をフックに追加しています。 -
(lambda () (projectile-rails-global-mode projectile-mode))
:
この無名関数は、projectile-mode
が有効になったときにprojectile-rails-global-mode
を同じ状態(有効または無効)に設定します。これにより、projectile-mode
が有効な場合のみprojectile-rails
の機能が利用可能になります。
遅延ロード(Lazy Loading)は、特定のライブラリやモジュールが必要になったときにのみ読み込まれるようにする技術です。Emacsでは、これは特に重要なテクニックで、起動時間を短縮し、全体のパフォーマンスを向上させるのに役立ちます。
遅延ロードされるライブラリ
遅延ロードされるライブラリは、特定の条件が満たされたとき(例えば、特定のファイルタイプを開いた時や特定のコマンドを実行した時)にのみ読み込まれます。Emacsでは、with-eval-after-load
、autoload
、モードフック、特定のキーバインド設定などを使って遅延ロードを実現できます。
例えば、ruby-mode
の設定は以下のようにして遅延ロードされる可能性があります:
(autoload 'ruby-mode "ruby-mode" "Major mode for editing Ruby files" t)
(add-to-list 'auto-mode-alist '("\\.rb\\'" . ruby-mode))
この設定では、.rb
拡張子を持つファイルが開かれたときにruby-mode
が自動的にロードされます。
常にロードされるライブラリ
一方、常にロードされるライブラリは、Emacsの起動時に読み込まれます。これは、require
やleaf
ブロック内の:require t
指定によって行われることが多いです。
例えば、次のweb-mode
の設定は、Emacsが起動するとすぐに読み込まれます:
(require 'web-mode)
この場合、web-mode
はEmacsの起動時にメモリにロードされ、その機能が直ちに利用可能になります。
遅延ロードと常時ロードの違い
遅延ロードは、必要な時までライブラリの読み込みを遅らせることで、Emacsの起動時間を短縮し、リソースの使用を最適化します。対照的に、常時ロードされるライブラリは、Emacsの起動時にすぐに利用可能ですが、起動時間が長くなる可能性があります。
Emacsの設定では、どのライブラリを遅延ロードにするか、どのライブラリを常時ロードにするかを選択することが大切です。遅延ロードの方が一般的には推奨されるアプローチですが、常に使用する基本的な機能については、常時ロードすることも理にかなっています。
はい、leaf
パッケージを使っている場合、:require t
を指定することで、遅延ロードをせずにパッケージを直ちにロードできます。:require t
を設定すると、指定されたパッケージがEmacsの起動時にロードされます。
例えば、以下のようなleaf
ブロックでは、web-mode
はEmacsの起動時にロードされます:
(leaf web-mode
:ensure t
:require t
:config
;; web-modeの設定
)
ここで、:ensure t
はパッケージがインストールされていない場合に自動的にインストールするように指示します。:require t
はパッケージを直ちにロードすることを指示します。
一方で、遅延ロードするためには、:commands
、:mode
、:hook
、:bind
などのキーワードを使用して、特定の条件下でのみパッケージをロードするように設定します。例えば、特定のファイルタイプが開かれたときや特定のコマンドが呼び出されたときにのみロードされるように設定できます。
globalをonにしたいのであればafter-init-hookでフックする。
:hook (after-init-hook . all-the-icons-ivy-rich-mode)
emacsでlsp-eslintを使う方法
git clone https://github.com/microsoft/vscode-eslint.git
cd vscode-eslint
npm install
npm run compile
init.elに下記のように書く
パス指定はフルパスで書かないと、プロジェクトからのルートになる。 ~
は使用不可。
(setq lsp-eslint-server-command '("node"
"/fullpath/vscode-eslint/server/out/eslintServer.js"
"--stdio"))
指定した関数 open-in-vertical-split
と display-buffer-alist
の設定について、詳しく説明します。
open-in-vertical-split
関数
この関数は、指定されたバッファを垂直分割で開くように設計されています。
(defun open-in-vertical-split (buffer alist)
"Open BUFFER in a vertical split."
(select-window (display-buffer-in-side-window buffer '((side . right))))
(window-resize (get-buffer-window buffer) (/ (frame-width) 2) t))
-
display-buffer-in-side-window
: この関数は新しいサイドウィンドウを作成し、指定されたバッファをそこに表示します。'((side . right))
という引数は、新しいウィンドウを画面の右側に作成することを指示しています。 -
window-resize
: この関数は新しく開いたウィンドウのサイズを変更します。(/ (frame-width) 2)
はフレームの幅の半分にウィンドウの幅を設定することを意味し、ウィンドウをフレームの右半分に表示します。
display-buffer-alist
の設定
この設定は、特定のパターンにマッチするバッファが開かれる際の振る舞いを制御します。
(add-to-list 'display-buffer-alist
(cons "\\*lsp-find-definition\\*"
(cons 'open-in-vertical-split
'((inhibit-same-window . t)
(reusable-frames . t)))))
-
add-to-list
: これはdisplay-buffer-alist
に新しいルールを追加します。 -
"\\*lsp-find-definition\\*"
: この正規表現は*lsp-find-definition*
という名前のバッファにマッチします。これはlsp-find-definition
コマンドが結果を表示する際に使われるバッファ名です。 -
open-in-vertical-split
: これは上で定義した関数で、このバッファが開かれるときに呼び出されます。 -
((inhibit-same-window . t) (reusable-frames . t))
: これらのオプションは、新しいバッファが現在のウィンドウではなく新しいウィンドウで開かれるようにし(inhibit-same-window
)、既存のフレームを再利用することを許可します(reusable-frames
)。
使い方
これらの設定をあなたの Emacs の設定ファイル(通常は ~/.emacs
または ~/.emacs.d/init.el
)に追加します。これにより、lsp-find-definition
を実行すると、定義が新しい垂直分割ウィンドウで開かれるようになります。
これらの設定は Emacs Lisp に関するある程度の理解が必要です。もし Emacs Lisp に不慣れであれば、設定を行う前に基本的な概念や構文について学習することをお勧めします。また、これらのカスタマイズがあなたの Emacs のバージョンや設定と相性が良いかどうかを確認するために、設定を追加した後に Emacs を再起動してください。
新しいタブで開く
Emacs において lsp-find-definition
の結果を新しいタブ(tab-bar-mode
でのタブ)で開くようにするには、カスタム関数を定義し、それを lsp-find-definition
の動作に結び付ける必要があります。tab-bar-mode
は Emacs 27 以降で利用可能な機能で、タブを使って複数のウィンドウ構成を簡単に切り替えることができます。
以下に、lsp-find-definition
を実行した際に新しいタブで結果を開くための基本的な例を示します。
カスタム関数の定義
まず、新しいタブでバッファを開くためのカスタム関数を定義します。この関数は、新しいタブを作成し、その中で lsp-find-definition
を実行します。
(defun lsp-find-definition-in-new-tab ()
"Find the definition of the thing at point in a new tab."
(interactive)
(tab-new) ; 新しいタブを作成
(lsp-find-definition)) ; 現在のポイントでの定義を探す
キーバインドの設定
次に、このカスタム関数にキーバインドを割り当てます。例えば、M-.
(通常 lsp-find-definition
に割り当てられているキー)をこのカスタム関数に割り当てることができます。
(global-set-key (kbd "M-.") #'lsp-find-definition-in-new-tab)
設定の適用
これらの設定を Emacs の設定ファイル(例:init.el
)に追加します。設定を追加した後、Emacs を再起動するか、設定ファイルを再読込みすることで、変更が有効になります。
注意点
-
tab-bar-mode
は Emacs 27 以降で利用可能です。使用している Emacs のバージョンを確認してください。 - このカスタマイズは
lsp-mode
が正常に動作していることを前提としています。 - タブの挙動は Emacs のバージョンや他の設定によって異なる場合があるので、動作しない場合は設定を見直す必要があります。
2024-01-15_1--A
問題ありません、Magitで複数のコミットを選択し、それらのコミットに含まれる変更をまとめて表示する方法を再度説明いたします。
-
Magitのステータスバッファを開く: Emacsで
M-x magit-status
を実行し、リポジトリのステータスバッファを開きます。 -
ログビューに移動する:
l
を押してログビューに移動します。 -
ログの範囲を指定する: ログビューで、比較したい最初のコミットまでカーソルを移動し、
<SPC>
を押してそのコミットを選択します。次に、比較したい最後のコミットまでカーソルを移動し、再度<SPC>
を押します。 -
選択したコミット間の差分を表示する: 選択したコミット間の差分を表示するには、
d r
を押します。ここでd
は差分を意味し、r
は範囲を意味します。
これで、選択したコミット間の変更点が一覧で表示されます。変更の詳細を見るには、各変更点にカーソルを移動し、<RET>
を押すことで、その変更の詳細を確認できます。
もし他の質問がありましたら、遠慮なくお尋ねください。また、特定の日付の質問を参照したい場合は、IDシステム(例:'2024-01-15_1--Q')を使用してください。
2024-01-15_4--Q: Emacsに表示されるCopilotの警告メッセージ「copilot--infer-indentation-offset found no mode-specific indentation offset, using 'tab-width' instead.」を非表示にしたいという要望があります。
2024-01-15_4--A: Emacsで特定の警告メッセージを非表示にする方法について説明します。この場合、Copilotの警告メッセージを無視する設定を追加する必要があります。
Emacsではwarn
関数をカスタマイズすることで、特定の警告を非表示にすることができます。以下の手順を試してください:
-
警告メッセージのフィルタリング関数を作成: まず、警告メッセージをフィルタリングするための関数を作成します。この関数は、特定の警告メッセージを無視するように設計します。
-
init.el
ファイルにコードを追加: 以下のコードをinit.el
ファイルに追加してください。このコードは、Copilotからの特定の警告メッセージを無視します。(defadvice warn (around copilot-ignore-warn activate) (unless (string-match "copilot--infer-indentation-offset found no mode-specific indentation offset, using 'tab-width' instead" (ad-get-arg 0)) ad-do-it))
このコードは
warn
関数をアドバイス(カスタマイズ)し、特定の文字列を含む警告メッセージを無視するようにします。この場合、Copilotからの「copilot--infer-indentation-offset found no mode-specific indentation offset, using 'tab-width' instead」というメッセージをフィルタリングして無視します。
実装手順
- 上記のコードを
init.el
ファイルに追加します。 - Emacsを再起動するか、
init.el
ファイルを再読み込みします。
これで、指定した警告メッセージが非表示になるはずです。ただし、この方法は特定の警告メッセージを無視するため、他の重要な警告がある場合に見逃すリスクがあることに注意してください。また、将来的にEmacsやCopilotの更新により、このカスタマイ
イズが機能しなくなる可能性もあります。常に最新の情報を確認し、必要に応じて設定を更新することが重要です。
万が一、この方法で期待した効果が得られない場合、あるいは他の問題が発生した場合は、Emacsのコミュニティやフォーラムでサポートを求めることも検討してください。Emacsコミュニティは非常に活発で、多くの経験豊富なユーザーが助けてくれる可能性が高いです。
submodulesの変更を親リポジトリから追わなくする方法
git rm --cached el-get/copilot