Open23

Emacs設定記 2021

リファレンス

https://www.emacsdocs.org/

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

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

https://emacs.stackexchange.com/a/35512

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

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

  • 見た目がとても綺麗

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

選択肢を選んで init.el を自動生成するサイト。使い始めもしくはinit.el を作り直すときの取っ掛かりに良さそう。

https://emacs.amodernist.com/

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

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/

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 のキーバインド関連

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

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

装飾

カラーテーマを試す

*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

Hydra 関連

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

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

入門

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

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

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

Hydra 拡張


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

ミニバッファ補完

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

ファイラ

Dired を強化する

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

Dired 強化パッケージ

https://github.com/alexluigit/dirvish

treemacs

org-mode

まだよくわかってない。

使い方

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操作関連

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
ログインするとコメントできます