Emacs設定記 2021
リファレンス
Emacsのビルドオプションの確認
emacs -nw -q --batch --eval '(message system-configuration-options)'
from: https://emacs.stackexchange.com/a/35512
macOS に Emacs を入れる場合
init.el のリセット
以下の記事を参考に leaf.el
ベースで一から設定を書き直す
- 以下の記事は Emacs そのものの入門も含まれる
「leaf.el
を使った設定方法」は以下の記事の方が詳しい
-
leaf-*
な関連コマンドの使い方が載っている
差分
init.el 設定全般
設定ファイル読み込み関連
-
メジャーモードの選択
- 拡張子から判定 →
auto-mode-alist
-
shebang
から判定 →interpreter-mode-alist
- 優先順位 →
interpreter-mode-alist
>auto-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変更したので再起動、を楽に
タブ
tab-bar-mode
Emacs27.1 からデフォルトで設定可能な
tab-bar-modeをいじるとglobal-mode-lineになる (from emacs 28)
centaur-tabs
awesome-tab
バッファの並び順をよしなに変えてくれる
leaf.el 関連
README
入門記事
とりあえずパッケージを試す
**scratch**
バッファでおもむろに以下を Eval
(leaf magit :ensure t :require t)
あとは M-x
でコマンドを試すなりする。
use-package の設定流用
ネット上の大抵のEmacsのパッケージ管理&設定は use-package
で書かれているので
以下の手順で流用する
-
(leaf use-package :ensure t :require t)
でuse-package
をインストール -
*scratch*
バッファに試したいuse-package
の設定をコピペする - 範囲選択して
M-x leaf-convert-region-replace
を実行して leaf の形式に変換 - 変換された設定を
C-j
なりC-x C-e
で実行しインストール - あとは試すだけ。
leaf
以外の設定を leaf
化
以下のように prog1
にパッケージ名を指定して leaf-convert-region-replace
(prog1 'package-foo
(...)
(...))
leaf の設定確認(とデバッグ)
Evil の設定
Evil の概要を掴むうえで現在も有効な記事
あとで読む
- Evil の設定記録
キーバインドの設定
キーマップ
- すべてのバッファで有効 → global-map
- 特定のバッファで有効 → current-local-map
- 特定の{メジャー, マイナー}モードで有効 → 〇〇-mode-map
キーバインドの検索順
マイナーモード(〇〇-mode-map
)
↓
バッファローカルマップ(current-local-map
)
↓
メジャーモードマップ(〇〇-mode-map
)
↓
グローバルマップ(global-map
)
↓
未割り当て(エラー)
より詳細なキーマップ検索
overriding-terminal-local-map
↓
overriding-local-map
↓
以下のいずれかのキーマップにキー定義が存在していれば、それを使う
- カーソル位置の文字の
keymap
プロパティ -
emulation-mode-map-alists
中のアクティブなmode-map
(Evilの設定はここ) -
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-map
に define-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
とのインテグレーションが組み込まれている
-
-
設定例
-
evil-leader
のようなvim
の Leaderキーの操作の定義方法がより洗練されているようだ。- 操作感をより
vim
っぽく近づけたければ使ってみるのもよさそう
- 操作感をより
evil のキーバインド関連
-
公式のキーバインドコレクション
-
markdown編集向け
-
vim の text-object の範囲選択をカスタマイズ
Yet another lightweight 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/osener/emacs-afternoon-theme
- https://github.com/bbatsov/zenburn-emacs
-
https://github.com/ogdenwebb/emacs-kaolin-themes
- `kaolin-blossom'
モノクロ
SVGを使った図形描画
インデントレベルの図示
Hydra 関連
Emacsの「発見性」パッケージの一つ
そもそも evil と相性が良いか検討が必要。 / 適切な state
のmode-map
に hydra-foo/body
を指定すれば問題なし。
入門
設定
公式リポジトリのWikiに設定例が多くあるので、流用すれば楽になる
Hydra 拡張
-
hint-doc
を簡単にきれいに -
which-key
とHydra
の統合
hydra
が現れる前は smartrep
という拡張が良く使われていたらしい。
開発関連機能
Xref
プログラミング言語の識別子を検索したりするための「インターフェイス」
具体的にどのように動作するかは、各言語のメジャーモードの実装による。
LSPとの連携操作もxref
の関数呼び出しから使える。
imenu
TODO
-
https://github.com/rnkn/side-hustle
-
imenu-list
代替
-
ido
TODO
LSP
複数のLSPクライアントパッケージがある
LSP関連のパッケージの動作速度を上げるらしい
ミニバッファ補完
Selectrum(Ivyよりシンプルだが拡張性ありとのこと)
Selectrum と連携するパッケージ
候補の並べ替え、絞り込み(同じ作者)
Consult(検索、補完系の拡張(Swiper相当)
orderless
consult-line
を探したいとき line consl
や con lin
のような曖昧な入力でも候補に上がるようにする completion-style
Vertico
Selectrum よりさらにシンプル・ミニマルな実装とのこと
装飾系
mode-line をエコーエリアに収める
プロジェクト管理
- https://projectile.mx/
-
Projectile
から無視するファイルの指定方法
他の選択肢
-
https://emacs.stackexchange.com/questions/53452/how-to-open-a-folder-as-project-in-emacs
company-gtags
counsel-git-grep
-
https://www.reddit.com/r/emacs/comments/689hok/what_do_you_use_for_project_management_in_emacs/
-
https://www.reddit.com/r/emacs/comments/54fkqr/how_do_people_manage_projects_in_emacs/
ファイラ
Dired を強化する
- Dired を開いたときに Hydra を hook する
Dired 強化パッケージ
-
「アプリ選んでファイルを開く」diredでも
https://github.com/FrostyX/dired-open-with
treemacs
-
https://github.com/Alexander-Miller/treemacs
-
README
に記載のuse-package
をleaf-convert
すればまず動く
-
- Treemacs で all-the-icons
org-mode
まだよくわかってない。
使い方
-
入門記事
-
org-fileをパース
-
org-capture を使ってコードリーディング
-
orgファイルからプレゼンテーション生成
-
org-mode とコードブロックで文芸的ドキュメンテーション
-
org-modeでSVG作図
-
Wiki
-
org-mode互換性(?)あるスマートフォンアプリ
-
org-mode の見た目をモダンな感じにする
-
org-mode でブログ
ナビゲーション
intelliJのCtrl-Tab的な動作を期待したい
Window / バッファ内表示系
peeking ライブラリ
*foo*
や自分で指定したバッファをテンポラリなWindowに統一して表示できるようにする
- popwin
- https://www.emacswiki.org/emacs/PopWin
- 昔からあるやつで広く使われているらしい
- shackle
- https://depp.brause.cc/shackle/
-
popwin
の後発でいろいろ整備されているとのこと
- popper
- https://github.com/karthink/popper
- 指定したバッファのウィンドウの出したり消したりを楽に行えて便利
Window操作関連
-
現在どの Window にフォーカルしているかを視認しやすく
各種開発環境
全般
- ヒント表示
- Lisp等の括弧対応(軽量版paredit)
C言語
-
ctags
-
CMakeベースのC/C++開発環境
Scheme
Standard ML
Elisp で HTMLテンプレート
Emacs -nw (ターミナル表示)
ASCIIコードテーブルman ascii
端末エミュレータ上のEmacsで24-bit colorを表示する(Emacs 27以降でも) - つーさにブログ
tmux で True Color
- まず以下の設定を試みる
- ダメだったら以下の issue を読んで調べてみる
その他ツール
Docker上にEmacsをホストしてブラウザからアクセス
VSCode Live Share 的な機能
ウェブブラウジング
xwidget内にwebkitでレンダリング
company-mode
company-mode
は補完機能を提供するためのフレームワークで、それ自体にコード解析や補完リスト提供のような機能はない。
その部分は、 backend
が提供する。
capf
は completion-at-point-function
の意味
自作補完バックエンドを作る方法
Emacsディストリビューション
spacemacs
doom emacs
Centaur Emacs
Prelude
jcs-emacs
scimax
科学技術向け Emacs設定ディストリ