Open24

Emacs設定記 2021

zenwerkzenwerk

リファレンス

https://www.emacsdocs.org/


https://ayatakesi.github.io/lispref/27.1/html/index.html
http://doc.endlessparentheses.com/

Emacsのビルドオプションの確認

emacs -nw -q --batch --eval '(message system-configuration-options)'
from: https://emacs.stackexchange.com/a/35512

macOS に Emacs を入れる場合

https://zenn.dev/armcore/articles/mac-program-emacs

init.el のリセット

以下の記事を参考に leaf.el ベースで一から設定を書き直す

  • 以下の記事は Emacs そのものの入門も含まれる

https://emacs-jp.github.io/tips/emacs-in-2020

leaf.el を使った設定方法」は以下の記事の方が詳しい

  • leaf-* な関連コマンドの使い方が載っている

https://qiita.com/conao3/items/347d7e472afd0c58fbd7

差分

https://github.com/zenwerk/.emacs.d/commit/789e00e8c1b72e6b25c666471ca6cc36fc0696e4

zenwerkzenwerk

今後参考になりそうな設定集

  • 見た目がとても綺麗

https://github.com/rougier/nano-emacs

  • 見た目が現代的なエディタに近く、機能的にはこれを目指したい

https://github.com/ianpan870102/yay-evil-emacs

  • Emacs のデフォルト動作を現代的なものに変える小設定

https://git.sr.ht/~technomancy/better-defaults

  • leaf.el の設定例

https://asataken.hatenablog.com/entry/2020/08/28/180000
https://uwabami.github.io/cc-env/Emacs.html

  • org-file と leaf の混在

https://github.com/uwabami/emacs

  • 同じく org-babel / leaf で evil な設定

https://github.com/derui/dot.emacs.d/blob/master/init.org

  • 膨大な Emacs 設定 tips 集
    • git clone https://depp.brause.cc/dotemacs.git

https://depp.brause.cc/dotemacs

zenwerkzenwerk

init.el 設定全般

https://emacs-jp.github.io/tips/debug-emacs-lisp

設定ファイル読み込み関連

  • メジャーモードの選択

    • 拡張子から判定 → auto-mode-alist
    • shebangから判定 → interpreter-mode-alist
      • 優先順位 → interpreter-mode-alistauto-mode-alist
  • 設定ファイルの読み込み先 → load-path変数

    • (add-to-list 'load-path "/foo/bar")
  • 設定ファイルの読み込み → (load "ファイル名") / .elは不要

カスタムファイルの切り出し

Emacs が自動で init.el に編集する内容を別ファイルに書き出すよう指示する

;; カスタムファイルを別ファイルにする
(setq custom-file (locate-user-emacs-file "custom.el"))
;; (カスタムファイルが存在しない場合は作成する
(unless (file-exists-p custom-file)
 (write-region "" nil custom-file))
;; カスタムファイルを読み込む
(load custom-file)

キーマップ関連

  • キー入力指定 → (kbd "C-m")
  • キーバインドの置換 → (define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))
  • キーバインドの指定 → (define-key global-map (kbd "C-x ?") 'help-command)
    • global-set-key → (define-key global-map ...) の糖衣関数

環境変数

  • 確認 → (getenv "HOME")
  • 全変数の確認 → process-environment 変数に格納されている

init.el変更したので再起動、を楽に
https://github.com/iqbalansari/restart-emacs

zenwerkzenwerk

leaf.el 関連

README
https://github.com/conao3/leaf.el/blob/master/README.md

入門記事

とりあえずパッケージを試す

**scratch**バッファでおもむろに以下を Eval

(leaf magit :ensure t :require t)

あとは M-x でコマンドを試すなりする。

use-package の設定流用

ネット上の大抵のEmacsのパッケージ管理&設定は use-package で書かれているので
以下の手順で流用する

  1. (leaf use-package :ensure t :require t)use-package をインストール
  2. *scratch*バッファに試したい use-package の設定をコピペする
  3. 範囲選択して M-x leaf-convert-region-replace を実行して leaf の形式に変換
  4. 変換された設定を C-j なり C-x C-e で実行しインストール
  5. あとは試すだけ。

leaf 以外の設定を leaf

以下のように prog1 にパッケージ名を指定して leaf-convert-region-replace

(prog1 'package-foo
  (...)
  (...))

leaf の設定確認(とデバッグ)

https://www.grugrut.net/posts/201910141028/

zenwerkzenwerk

Evil の設定

Evil の概要を掴むうえで現在も有効な記事
https://tarao.hatenablog.com/entry/20130304/evil_config


あとで読む
https://wikemacs.org/wiki/Evil
https://github.com/noctuid/evil-guide


キーバインドの設定

キーマップ

  1. すべてのバッファで有効 → global-map
  2. 特定のバッファで有効 → current-local-map
  3. 特定の{メジャー, マイナー}モードで有効 → 〇〇-mode-map

キーバインドの検索順

マイナーモード(〇〇-mode-map
  ↓
バッファローカルマップ(current-local-map)
  ↓
メジャーモードマップ(〇〇-mode-map
  ↓
グローバルマップ(global-map
  ↓
未割り当て(エラー)

より詳細なキーマップ検索

overriding-terminal-local-map
   ↓
overriding-local-map
   ↓
以下のいずれかのキーマップにキー定義が存在していれば、それを使う

  • カーソル位置の文字のkeymapプロパティ
  • emulation-mode-map-alists中のアクティブなmode-mapEvilの設定はここ
  • minor-mode-overriding-map-alist中のアクティブなmode-map
  • minor-mode-map-alist中のアクティブなmode-map通常のモードマップ設定はたぶんここ
  • カーソル位置の文字のlocal-mapプロパティ
       ↓
    current-global-map

特定ステートでのキーバインドの設定

; 特定ステートのキーバインドを設定
(define-key evil-motion-state-map (kbd ";") #'evil-ex)
; キーバインドを削除
(define-key evil-insert-state-map (kbd "C-y") nil)
; 特定ステートのキーバインドを全削除
(setq evil-insert-state-map nil)

特定モードマップと特定ステートで有効なキーバインドの設定

; 'state(motion)をnilに設定すると全ステートで有効になる
(evil-define-key 'motion foo-mode-map
  (kbd "v") #'(lambda () (interactive) (view-mode 0)))

ステートの種類

  • ノーマルステート    → normal (motionも使える)
  • 挿入ステート      → insert
  • 範囲選択ステート    → visual (motionも使える)
  • オペレータステート   → operator
  • 置換ステート      → replace
  • 編集を伴わないステート → motion

↑のどれかを選んで evil-state-state-mapdefine-key する。

引用元: https://tarao.hatenablog.com/entry/20130304/evil_config

キーバインドの割り当て関連

  • キー入力指定 → (kbd "C-m")
  • キーバインドの置換 → (define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))
  • キーバインドの指定 → (define-key global-map (kbd "C-x ?") 'help-command)
    • global-set-key → (define-key global-map ...) の糖衣関数

evil使用者にも便利なキーバインドパッケージ

  • define-key のようなキーバインド関連を統一的に行うパッケージ
    • evilとのインテグレーションが組み込まれている

https://github.com/noctuid/general.el

evil のキーバインド関連

zenwerkzenwerk

Emacsに一生入門できねえ2020の原因考察

  • Lisp の基本について知っている前提の説明だから
    • リスト、コンスセルの構造、クオート、マクロをすでに知っている前提
      • いわゆる手続き型言語しか経験のない人には完全に門外漢な知識
    • alist, plist などのデータ構造の説明がない
      • 何に対して設定しているのかよくわからなくなる
  • バッファ、モードの概念
    • それに関連するキーマップの概念
      • これらがどう影響しあうのかをふんわり知っている前提の説明
  • Emacsが本質的にLisp処理系(インタプリタ)であることの説明
    • load とか package.el とか、require とか、単なるエディタの設定としてみると大袈裟すぎる
    • やっていることは python/ruby 書いてるのと変わらないので、プログラミング言語を一つ覚えるくらいの学習コストが発生する。
    • プログラミング入門するためにエディタを選んだら、エディタのためにプログラミング言語を一つ追加で覚える羽目になったの巻
      • ミニマルPerl のような、必要最低限なサブセット言語環境を用意しないと、学習コストがでかすぎる。
zenwerkzenwerk

装飾

カラーテーマを試す

*scratch*バッファで以下のように試す

(leaf テーマ名 :ensure t :require t)
(load-theme 'テーマ名)

気に入らなかったときなどにデフォルトテーマに戻す

(disable-theme 'テーマ名)

VSCode デフォルトに似せたテーマ
https://github.com/ianpan870102/vscode-dark-plus-emacs-theme

ターミナルでも視認性の良いテーマ

モノクロ

SVGを使った図形描画

https://github.com/rougier/svg-tag-mode

インデントレベルの図示

https://github.com/DarthFennec/highlight-indent-guides

zenwerkzenwerk

Hydra 関連

Emacsの「発見性」パッケージの一つ

そもそも evil と相性が良いか検討が必要。 / 適切な statemode-maphydra-foo/body を指定すれば問題なし。

入門

https://snap.wegh.net/tags/hydra/

https://medium.com/@mopemope/hydra-のススメ-88a4168f945c

設定
公式リポジトリのWikiに設定例が多くあるので、流用すれば楽になる

Hydra 拡張


hydra が現れる前は smartrep という拡張が良く使われていたらしい。

zenwerkzenwerk

開発関連機能

Xref

プログラミング言語の識別子を検索したりするための「インターフェイス」
具体的にどのように動作するかは、各言語のメジャーモードの実装による。
LSPとの連携操作もxrefの関数呼び出しから使える。

imenu

TODO

ido

TODO

LSP

複数のLSPクライアントパッケージがある

zenwerkzenwerk

ミニバッファ補完

Selectrum(Ivyよりシンプルだが拡張性ありとのこと)

https://github.com/raxod502/selectrum

Selectrum と連携するパッケージ

候補の並べ替え、絞り込み(同じ作者)

https://github.com/raxod502/prescient.el

Consult(検索、補完系の拡張(Swiper相当)

https://github.com/minad/consult/blob/main/README.org

orderless

consult-line を探したいとき line conslcon lin のような曖昧な入力でも候補に上がるようにする completion-style
https://github.com/oantolin/orderless


Vertico

Selectrum よりさらにシンプル・ミニマルな実装とのこと

https://github.com/minad/vertico

zenwerkzenwerk

ファイラ

Dired を強化する

https://taipapamotohus.com/post/dired/

Dired 強化パッケージ

https://github.com/alexluigit/dirvish

treemacs

zenwerkzenwerk

org-mode

まだよくわかってない。

使い方

zenwerkzenwerk

Window / バッファ内表示系

https://www.reddit.com/r/emacs/comments/ka1r24/quickpeek_vs_posframe/

http://blog.jenkster.com/2013/12/popup-help-in-emacs-lisp.html

peeking ライブラリ

*foo*や自分で指定したバッファをテンポラリなWindowに統一して表示できるようにする

  1. popwin
  2. shackle
  3. popper

Window操作関連

zenwerkzenwerk

Emacs -nw (ターミナル表示)

ASCIIコードテーブル
https://bestasciitable.com/
もしくは man ascii

端末エミュレータ上のEmacsで24-bit colorを表示する(Emacs 27以降でも) - つーさにブログ

https://mako-note.com/ja/emacs-in-terminal/

tmux で True Color

  1. まず以下の設定を試みる
  2. ダメだったら以下の issue を読んで調べてみる
zenwerkzenwerk

company-mode

company-mode は補完機能を提供するためのフレームワークで、それ自体にコード解析や補完リスト提供のような機能はない。
その部分は、 backend が提供する。

capfcompletion-at-point-function の意味


https://braveam.com/archives/721

自作補完バックエンドを作る方法
https://ifritjp.github.io/documents/emacs/company-mode/

https://zenn.dev/sumisonic/articles/4eebb9ec083bf4