Emacsは非常に優れた拡張性を特徴とするテキストエディタ。 エディタに内蔵された言語Emacs Lispで柔軟に設定を変更できる。
できること。
- 情報集積(org-mode, Org-roam)
- タスク管理(org-mode)
- Git(magit) + GitHub(magit-forge)
- コマンド実行と結果出力(org-mode)
- ウィンドウマネージャ(EXWM)
- 静的サイトジェネレータ(org-mode)
- ブラウザ(eww)
- インターネットラジオプレーヤ(eradio)
- フィードリーダー(elfeed.el)
- ファイラ
- 表計算
- テスト実行(rspec-mode)
- ターミナル実行(vterm)
- Docker管理(docker-mode)
- リマインダー(org-alert)
- PDF閲覧(pdf-tools)
の機能を、共通の効率的なキーボード操作、プレーンテキストベースで行える。
自分の文芸的設定はkijimad Emacs Configにまとめてある。
ビルドしてからパッケージを登録する。
guix build [email protected]
guix package -i [email protected]
guix package --roll-back # ロールバックしたいとき
(all-the-icons-install-fonts)
しても直らないので困っていた。nerd-fontsでフォントを追加すると表示されるようになった。良い。
インストール方法のメモ。
$ git clone --depth 1 [email protected]:ryanoasis/nerd-fonts.git
$ ./install.sh
Ubuntu 18.04.5 で Gcc Emacs をビルドする | Braindumpを参考にコンパイルする。
ソースコードをクローンしてくる。
$ git clone --single-branch --depth=1 https://github.com/emacs-mirror/emacs.git
.configureを生成する。
$ ./autogen.sh
configureを実行する。
$ ./configure --with-native-compilation=aot --with-modules --with-x && \
make && \
sudo make install
--with-native-compilation
でelispをネイティブコンパイルして高速化する--with-x
でX Windowで動かすようにする
ediff-regions-wordwise
を使う。
M-x toggle-debug-on-error
で、エラー時にトレースバッファが表示されるようになる。デバッグがしやすい。
使用頻度の高いマクロが多数定義されている。
- thread-first
- defsubst
- named-let
- mermaidインストールが面倒なのでDockerでやりたい
- mermaid-modeは対応してるのだが、org-babelでのコマンドが間違っているので関数を修正
- 画像は保存して、orgファイルにインライン表示したい
- 名前がかぶって消されるとやっかいなので、ランダム文字列を自動生成する関数を作成
System Crafters Live! - August 20, 2021 - System Craftersを参考に、ローカルマシン(Ubuntu)でビルドする。
sudo apt install ncurses-dev gnutls-bin
あとはINSTALL.repoに乗っているコマンドを実行する。
./autogen.sh
./configure
make
./src/emacs
本体のテストが使い方の参考になる。
C-x z (repeat)
で直前のコマンドを再実行できる。
C-x M-: (repeat-complex-command)
で直前のコマンドをS式表示しつつ実行できる。
- [X] M– マイナスの前置引数
- 例えばC-M– C-f は1文字戻る
- M– M-d 前の単語を削除
- M– C-k kill-lineの逆、行の左側を削除
- [ ] C-M-d, C-M-u S式の中、外に移動する
- [ ] C-M-n, C-M-p 次のリスト、前のリストに移動する
- [ ] C-M-k S式を削除する
- [ ] M-}, M-{ パラグラフの最後、最初に移動する
- [X] M-a, M-e センテンスの先頭、最後に移動する
- [X] C-M-a, C-M-e defunの先頭、最後に移動する
- [ ] C-M-v 別ウィンドウを下方にスクロール
- [ ] M-r ポイントを左上、左、左下に移動
削除。
- [ ] M-k センテンスを削除
- [ ] C-M-k S式を削除
- [ ] C-S-<backspace> 現在の行を削除
ブックマーク。
- [ ] C-x r m ブックマークをセット
レジスター。
- [ ] C-x r s レジスターにリージョンを保存
- [ ] C-x r SPC レジスターにポイントを保存
- [ ] C-x r j レジスターにジャンプ
- [ ] C-x r i レジスターの内容を挿入
マーク。
- [ ] M-h 次のパラグラフをマーク
- [ ] C-M-h 次のdefunをマーク
- [ ] C-x h バッファー全体をマーク
- [ ] C-x C-p 次のページをマーク
- [X] M-@ 次の単語をマーク
- [ ] C-M-@ 次のS式をマーク
検索。
- [ ] C-M-s regexpインクリメンタル検索を開始する
キルリング。
- [ ] C-M-w 次のコマンドがkillコマンドなら、killリングに追加する
入れ替え。
- [ ] C-x C-t 行の入れ替え
コメント。
- [ ] C-x C-; 行をコメント化あるいは非コメント化
- [X] M-x comment-box リージョンを囲み枠でコメント化する
大文字化。
- [ ] M-c 次の単語をcapitalize(Word)
- [ ] M-u 次の単語を大文字に(WORD)
- [ ] M-l 次の単語を小文字に(word)
this-command
firefox側で設定する。about:config をURLバーに打ち込み、設定項目 browser.tabs.loadDivertedInBackground を true にする。 https://stackoverflow.com/questions/10506496/run-browse-url-in-emacs-without-giving-focus-to-the-browser
rails開発で処理が多くのファイルに分散していて、同じような名前のファイルが多い場合、集中のスイッチングコストが大きくなる。今まではあまりファイル分散してなかったので counsel-switch-buffer
ひとつで問題なかったが、タスクやコードの構造によって問題になりうる。ファイル移動しようとするたびに思考が中断される。
- 方法1: projectile-railsのキーバインドを覚える https://qiita.com/yoshinarl/items/8e3c4b075a181f224591
- projectile-rails-find-current-spec(C-c r P) 対応するテストファイルを開く
- MVC系の移動 C-c r M、C-c r C、C-c r V
- 方法2: バッファをリセットする
- 無関係な似たような名前のバッファが溜まるのが問題であって、そもそもこまめにリセットすれば見やすくなる説
- 方法3: ブックマーク
- 必要なものはブックマークしておく。メンドイ。
- 方法4: タブ表示
- ブラウザのように、タブに表示する。結局ファイル名が長かったり、ファイル名が多くなるとやりにくくなるのだが、直近3つくらいのファイルが見られるだけでも改善する
良いページを発見した。Buffer management - WikEmacs
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/lisp/subr.el#L731-L751
リストの長さによって処理が分岐していることがわかる。まず100行以下での処理を見る。
(let ((tail list))
(while tail
(setcdr tail (delete (car tail) (cdr tail)))
(setq tail (cdr tail))))
これで重複削除になるのか、と不思議な感じがする。不明な関数を調べる。
Setcdr (GNU Emacs Lisp Reference Manual)
setcdrが非常に重要な処理をしているように見えるので調べる。
(setq x '(1 2 3))
(setcdr x '(4))
x
コンスセルのcdrを変更することで、他のリストに置き換える働きをする。
(setq x '(1 2 3 4))
(delete x '(3))
x
本筋に戻る。
(delete (car tail) (cdr tail))
は、値を決めて(car tail)、それをリストから取り除く。 例) ‘(1 1 2 3) -> ‘(2 3) になる。carの1を取り上げて、cdrに含まれる1を削除する。
(setcdr tail (delete (car tail) (cdr tail)))
そしてsetcdrによって、1つになった値と残りの値を連結する。 ‘(1) + ‘(2 3) -> ‘(1 2 3)
(setq tail (cdr tail))
次の値を計算するために、単独になった値を除いたリストにする。 ‘(1 2 3) -> ‘(2 3)
ここでは、tailだけが次の計算に向けて再代入されたのであって、値の元になったlistは再代入されずに’(1 2 3)が入ったままになっている。すべての計算が終わったあとlistを評価すれば、望みの値が得られる。tailはループ用で、最終的にnilになる。
リストの要素が100より大きいとき、ハッシュテーブルを使う実装になっている。100は何基準だろうか。
(let ((hash (make-hash-table :test #'equal :size l))
(tail list) retail)
(puthash (car list) t hash)
(while (setq retail (cdr tail))
(let ((elt (car retail)))
(if (gethash elt hash)
(setcdr tail (cdr retail))
(puthash elt t hash)
(setq tail retail)))))
- ハッシュにすでに入っている値であれば、その要素を取り除いて次の探索へ
- ハッシュに入っていなければ登録して次の探索
この方法だとループは多いけど、メモリ消費がとても少ないということか。一度のループで比較するのは最初の要素とハッシュの要素だけだ。
Emacs Lisp defsubstで定義した関数はbyte compileのときにインライン展開される。つまり、コンパイルして関数実行時の関数呼び出しのコストがなくなり高速になる。頻繁に用いられる小さな関数で有効。
(defun plus2 (x)
(+ x 2))
(byte-compile 'plus2)
(defun foo (lst)
(plus2 lst))
(byte-compile 'foo)
(defsubst plus2 (x)
(+ x 2))
(byte-compile 'plus2)
(defun foo (lst)
(plus2 lst))
(byte-compile 'foo)
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/lisp/emacs-lisp/byte-run.el#L480-L495
/lisp/simple.elには基本的な編集関数がある。
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/lisp/simple.el#L1
入れ替えとかしたい。
counsel-git-grep したあとに counsel-git-grep-query-replace(M-q)することで、git grepした結果に対して置換をかけられる。
message関数はメッセージをmessageバッファ、モードラインに表示する関数である。フォーマットを指定できる機能もある。これはどうやって動いているのだろうか。Lispの形をしたC言語で定義されている。
https://github.com/kd-collective/emacs/blob/d983e080e027bd7b680b1e40ccfa0c71d6a3cd94/src/editfns.c#L2849-L2884
文字列のときはそのまま表示し、フォーマットが必要なときはフォーマットする、ということか。message3とmessage1の違いは何。この関数名の意味。
https://github.com/kd-collective/emacs/blob/d983e080e027bd7b680b1e40ccfa0c71d6a3cd94/src/xdisp.c#L11588-L11608
本筋はmessage_dologを呼ぶこと。ほかはそのための準備とか、オプションに対応してる部分。
https://github.com/kd-collective/emacs/blob/d983e080e027bd7b680b1e40ccfa0c71d6a3cd94/src/xdisp.c#L11693-L11697
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/src/xdisp.c#L11430-L11435
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/src/lisp.h#L5292-L5294
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/src/lisp.h#L5319-L5325
https://github.com/kd-collective/emacs/blob/30cf1f34c583d6ed16bdc5b9578370f30c95fe1b/src/xdisp.c#L11438-L11633
https://systemcrafters.net/live-streams/august-20-2021/ まずビルドする。
guix environment --pure emacs-next --ad-hoc git
ほとんどはEmacs Lispで書かれている。コアな部分はC言語。
src/*
にはCのコードがある。
src/lisp.h
はEmacs Lispそのもののコードで重要。
How to read (and understand) GNU Emacs source code? : emacs
コードの読み方の参考。 ソースコードの読み方 - Solist Work Blog
最初から入っている proced
が便利。一覧に加えてkillもできる。
dabbrevはEmacsデフォルトの補完機能。大雑把で高速。 dabbrev-expand (M-/)
- xref-find-definitions (M-.)
- 定義ジャンプ
- xref-find-references (M-?)
- 参照箇所(使われてるところ)にジャンプ
lspと接続しているとそっちを使って辿るようだ。
LSPを設定する。- lsp-modeはLSP全般を扱うパッケージである。lsp-install-serverで各プログラミング言語のLSP serverをダウンロード・起動することで有効化できる。
- lsp-ui-modeはlsp-modeのグラフィック面を強化するパッケージである(optional)。ドキュメント表示、エラー表示などができるようになる
ScalaのLSPサーバーであるmetalsはGPGエラーでインストールできない状態だった。
(setq lsp-verify-signature nil)
するとインストールできる。
- ミニマルなパッケージを組み合わせる方法が主流である。
- 各パッケージの概要: https://tam5917.hatenablog.com/entry/2022/02/05/141115
emacsmirror/git-timemachine: Walk through git revisions of a file
git-timemachine
を使うと、ファイルごとで軽々とコミットを辿れて楽しい。すごいのにあまり有名ではないよう。
- n で次のコミット、p で前のコミットに移る。
- c でコミット内容を見る。ファイルビューではコミット時点のファイルだけなので、差分をみたいときにはこっちを使う。
M-x list-faces-display
dired-modeで Z … dired-do-compress
で展開か圧縮できる。
rectangle-mark-mode
– C-x SPC
で矩形選択できる。
back-button-modeのキーバインドが衝突してたのでback-button-modeの方を無効化。
(define-key back-button-mode-map (kbd "C-x SPC") nil)
pdf-toolsはEmacs内でPDFを閲覧できるパッケージ。 インストールしても、しばらくすると利用不可になってることがあるのでinstallしなおす。 インストールするとdiredから選択するとpdf-toolsが使われる。
(pdf-tools-install)
occurの特徴はeでedit-modeに入れる点。一覧にして複数ファイルをそのまま置換できる。
プロジェクトのファイルにすべてに対してoccurしたいとき。
counsel-git-grep
して絞り込んだものに対して (ivy-occur)
= C-c C-o
でoccurできる。
edit-modeに入るには。
(ivy-wgrep-change-to-wgrep-mode)
= C-x C-q
occurでの変更をコミットするには。
C-x C-s
。覚えにくい。
C-x 8 return
Wilfred/elisp-refs: semantic code search for emacs lisp 関数や変数の参照を見つけるパッケージ。 じっさいに使われている例を探し出すことができる。
File: /gnu/store/lnwgc4ww47vkq2wv2ay3rdm0ppnmgyfy-emacs-27.2/share/emacs/27.2/lisp/format.el.gz
(setq prop (pop props))
File: /gnu/store/lnwgc4ww47vkq2wv2ay3rdm0ppnmgyfy-emacs-27.2/share/emacs/27.2/lisp/window.el.gz
(let ((window (pop window-state-put-stale-windows)))
キーバインドの一覧を出力するコマンド。
make-command-summary
。
複数行一気に空白を挿入してインデントを整えるとき。
C-x C-i
で挿入モードにあるのであとは方向キーで微調整できる。
改行コードなどで問題が生じたとき。^Mが表示されるとか。
C-x RET f utf-8-unix
で文字コードを変更して保存する。
カップ麺の3分を測りたい、みたいなとき。
(org-timer-set-timer)
Company is input complement package.
Read document on complementation list.
Ctrl + Shift + h
if [[ "$INSIDE_EMACS" = 'vterm' ]] \
&& [[ -n ${EMACS_VTERM_PATH} ]] \
&& [[ -f ${EMACS_VTERM_PATH}/etc/emacs-vterm-bash.sh ]]; then
source ${EMACS_VTERM_PATH}/etc/emacs-vterm-bash.sh
fi
- org-lint
- interactive
- defun
テストとプロダクトコードを切り替える。
一覧でPRとIssueにアクセスできると行き来がしやすそう。 Forgeのトピック間移動がhelmでできたらいいのにな。
M-x customize-variable RET sql-connection-alist RET ... M-x sql-connect open buffer... M-x sql-mode M-x sql-set-sqli-buffer RET sql-send-buffer (C-c C-b) sqlup-capitalize-keywords-in-region (C-c u)
- Macでは
query-replace
(M-%
)が奪われて押せないので、query-replace-regexp
(C-M-%
)する。
Railsでspringを走らせておくとRSpecが高速に動作する。
いつのまにかEmacsでspringが動かなくなっていた。コマンドでは spring rspec
などで動かせるが、Emacsではふつうの bundle exec ...
になっていた。前は早くできていたはず。ネットの記事を参考に修正した。
emacsのrspec-modeで、上記のようにしてspringを使うと、自動ではspringがONにならない。 これはtmpにpidファイルが作られないため。 強制的にspringを使うには、次のように設定する。
(require 'rspec-mode)
(defun rspec-spring-p ()
(and rspec-use-spring-when-possible
(stringp (executable-find "spring"))))
springを自動で検出してくれるらしい(何より今までできてた)。
spring status
でspringが動いてるかチェックする。動いてなかったら spring rspec
する。
$ emacs -q
# init読み込まない
$ emacs --debug-init
# デバッグモードで起動する
erc-tls irc.libera.chat 6697 /join #systemcrafters
mermaidはプレーンテキストで図を作れるツール。JavaScriptで書かれている。 これをEmacsで扱えるようにするのがmermaid-mode。
npm install -g @mermaid-js/mermaid-cli
して、C-cで画像にコンパイルできる。
# gnome
gsettings set org.gnome.desktop.interface gtk-key-theme Emacs
# MATE
gsettings set org.mate.interface gtk-key-theme Emacs
# Cinnamon
gsettings set org.cinnamon.desktop.interface gtk-key-theme Emacs
補完選択になってしまって新しくファイルが作れないときは、C-M-jで新規作成できる。
counselのリポジトリのREADMEの最後に書かれてた。
(setq ivy-use-selectable-prompt t)
をすると上下選択できるようになる。 選択一覧にはでないのでわかりにくい。
vc-annotate
magit-blame
blamer
(make-command-summary)
や (describe-bindings)
で生成できる。
firefox側で設定する。about:config をURLバーに打ち込み、設定項目 browser.tabs.loadDivertedInBackground を true にする。 https://stackoverflow.com/questions/10506496/run-browse-url-in-emacs-without-giving-focus-to-the-browser
Emacs Lispの進歩。
Package-Versionは不要になった。
今のところ、ない。
- 仕事用とプライベート用の違い
- デスクトップとラップトップの違い
- モニター解像度の違い
があるので、判定できるようにする。
シンプルなノートパッケージ。
rfcドキュメントを読むモード。あまり変化しない特定のドキュメントに特化したモードは便利そう。
アルファベットで指定して初期化するだけでメニュー表示に追加し、キーバインドを作成する。これはどうやっているか。hydra起動中はキーバインドが一切衝突しないのも気になる。(defhydra hydra-zoom (global-map "<f2>")
"zoom"
("g" text-scale-increase "in")
("l" text-scale-decrease "out"))
https://github.com/kd-collective/hydra/blob/2d553787aca1aceb3e6927e426200e9bb9f056f1/hydra.el#L160-L161
rails開発で処理が多くのファイルに分散していて、同じような名前のファイルが多い場合、集中のスイッチングコストが大きくなる。今まではあまりファイル分散してなかったので counsel-switch-buffer
ひとつで問題なかったが、タスクやコードの構造によって問題になりうる。ファイル移動しようとするたびに思考が中断される。
- 方法1: projectile-railsのキーバインドを覚える https://qiita.com/yoshinarl/items/8e3c4b075a181f224591
- projectile-rails-find-current-spec(C-c r P) 対応するテストファイルを開く
- MVC系の移動 C-c r M、C-c r C、C-c r V
- 方法2: バッファをリセットする
- 無関係な似たような名前のバッファが溜まるのが問題であって、そもそもこまめにリセットすれば見やすくなる説
- 方法3: ブックマーク
- 必要なものはブックマークしておく。メンドイ。
- 方法4: タブ表示
- ブラウザのように、タブに表示する。結局ファイル名が長かったり、ファイル名が多くなるとやりにくくなるのだが、直近3つくらいのファイルが見られるだけでも改善する
良いページを発見した。Buffer management - WikEmacs
すごい便利らしいのでやってみる。
パッケージごとの設定がわかりづらい状態なので、書き直す。とくにhook、keybindあたりはあちこちに散らかっている。
時計より視覚的にわかりやすそうなので、polybarで出すようにしよう。
recompileは直前のcompilationの再実行関数。 実行して別ウィンドウのバッファが残るはずなのだが、何かウィンドウに関するパッケージを入れたせいで挙動が変わっている。 消えてしまう。
プログラム関係のmodeで起こることを確認(orgでは起こらない)。
vr–perform-query-replace: Match data clobbered by buffer modification hooks
Emacs, Magitで解説している。
package管理もちゃんと使って設定したい。
ウィンドウの出る方法を設定できるパッケージ。
ローカルではできるが、SSHを使う方法がわかっていない。 SQLを打つときに不便なので。
消したときに近くの矩形が消されてしまう謎の挙動。
projectile-switch-to-buffer (C-c p b)
<F1> b
projectile-ag (C-c p s s
)
vtermは互換性が高いShellのターミナルパッケージ。
カッコを自動入力するモードにしていると入力できなる。 なのでカッコ関係はコピペする羽目になる。
highlight-indent-guides-mode
でコピペしたときに表示がおかしい。
faceまでコピーするから仕方ないのかな。
読むときにたどれないと不便。
最初にコマンド一覧をどこからか出力する。それから、何かコマンドを打つごとに数を保存する。そうしてしばらく使っていくと、使ったことのないコマンドが明らかになる。カバレッジ率的にやって面白そうだろう。
Emacs Lisp Manual。いくつか面白そうな章がある。
キーバインドの記事。
Emacsのpaddingをいい感じにするパッケージ。
新しいチュートリアル。
Org Exportテーマのコレクション。
文芸的プログラミング。
面白話。
リチャード・ストールマンのTED Talk。
独自のサイトジェネレータで作成されたサイト。
Emacsでdeeplを使う方法。
ユーザディレクトリ以外に配置した.emacs.dを使う方法。
役立つtipsが紹介されているサイト。
Conventional Commitsを絵文字表示にする。Matzのスライド。 Emacsを単に道具として使うだけでなく、Rubyを書くうえでの参考にもなったという。
新しく追加されたthemeとその設定方法。
avyの解説。
Emacsの簡単な概要。
Emacsの本。買うか迷ってる。
こんな流れなんだ。
EmacsでのTextlint設定方法。
マウス活用の方法。
timerのキャンセル方法。
パッケージを作ってみる記事。
Emacsパッケージのハンドブック。
設定解説。
基本的な関数をまとめたリスト。
Emacsのブログ。
Irreal | The minds had long ago come up with a proper name for it; they called it the Irreal, but they thought of it as Infinite Fun. That was what they really knew it as. The Land of Infinite Fun. –Iain M. Banks, Excession
Emacsのブログ。
Emacsのブログ。
Emacsの情報集約サイト。
読み物。 デフォルトだと現在のブランチから名前を取るため、remoteに存在しないブランチのとき無効なリンクになる。 ブランチ名を固定もできるが、汎用性がなくなる。 コミットハッシュから取ればいい。(setq git-link-use-commit t)
(use-package esh-autosuggest
:hook (eshell-mode . esh-autosuggest-mode)
:config
(setq esh-autosuggest-delay 0.5)
(set-face-foreground 'company-preview-common "#4b5668")
(set-face-background 'company-preview nil))
C-c C-c
で実行する。
(org-cycle-level)
何も書いてない見出しでtab。
C-enter
前の項目がリストでも見出しが挿入できる。
roam のプレフィクスキー。
便利な置換。
プロジェクト全体のファイル名検索。
プロジェクトを切り替える。
Rubyメソッドを調べられる。gemがあるプロジェクトのGemfileでpry
, pry-doc
をインストールして実行するとpryが起動して、以後使えるようになる。これは補完の company.el
と連携させているため、pryを起動しないことにはgemの補完は表示されない。
vterm上で、eshellなどのように自由に動き回るモード。
https://orgmode.org/manual/Refile-and-Copy.html#Refile-and-Copy
見出しの移動。
たとえばhelmを使ってるときはこれ、ivyのときはこれとかでrequireするものは変わるものだが。既存パッケージはどうしているのだろう。
↓とかやった。外部のコマンドは最初に定義しておいた。
(defvar w3m-current-url)
(declare-function w3m-current-title "ext:w3m-util")
この通りにやって簡単にできた。
src/emacs にビルド結果が生成される。
どうにかして静的ページとして公開できるはず。 かっこいいのがなければ作る。いい感じにやっているサイトはいくつもある。
- http://juanjose.garciaripoll.com/blog/org-mode-html-templates/index.html
- https://diego.codes/post/blogging-with-org/
- https://hugocisneros.com/org-config/#configuration
- https://hugocisneros.com/blog/my-org-roam-notes-workflow/
- https://doubleloop.net/2020/08/21/how-publish-org-roam-wiki-org-publish/
- https://notes.alexkehayias.com/org-roam/
- https://www.mtsolitary.com/20210318221148-emacs-configuration/#hugo-support
contentのhtmlをいじることができなかったが、とりあえずcssで指定してOK。
Guixでは編集すると毎回プロンプトが出てくる。(defun ask-user-about-supersession-threat (fn)
"blatantly ignore files that changed on disk"
)
(defun ask-user-about-lock (file opponent)
"always grab lock"
t)
;; or
(setq revert-without-query '(".*"))
を実行したが、変わらなかった。
↓できた。
(setq auto-save-timeout 2)
(setq auto-save-visited-interval 2)
(setq auto-save-no-message t)
(auto-save-visited-mode)
ほかのcompletionは幅いっぱいにハイライトされるが、projectileは文字のあるところしかハイライトされないので短い検索のときに見えにくい。たとえば counsel-find-file
とか counsel-find-file
と比べるとわかる。
counsel-projectileを使えば問題ない。でもデフォルトの動作がおかしいので修正したいところ。 いや、ivyの問題ぽい。ivy yasnippetをすると同じような状態になる。テーマを変えてもそうなる。
org-refileでも同じような感じ。要調査。 共通点は、右側にアノテーションが出ないときか。そのときはfaceが設定されないので右側まで伸びない。
見出し移動とか。- install language-server
https://deno.land/#installation
curl -fsSL https://deno.land/x/install/install.sh | sh
- Install lsp-mode package
- Add lsp settings to init.el
- reference
- emacsにlsp-mode入れた - takeokunn’s blog
- prompt settings
(require 'lispxmp)
(define-key emacs-lisp-mode-map (kbd "C-c C-d") 'lispxmp)
;;;括弧の対応を保持して編集する設定
(require 'paredit)
(add-hook 'emacs-lisp-mode-hook 'enable-paredit-mode)
(add-hook 'lisp-interaction-mode-hook 'enable-paredit-mode)
(add-hook 'lisp-mode-hook 'enable-paredit-mode)
(add-hook 'ielm-mode-hook 'enable-paredit-mode)
alias sshp='ssh $(grep Host ~/.ssh/config | grep -v HostName | cut -d" " -f2 | peco)'
すぐ自分で設定したキーバインドを忘れる対策で、hydraを設定した。
基本の動きは把握した。
キーワードを指定することで、インストール、フック、キーボードバインドまで、パッケージ周りの設定をうまくやってくれる。これはどうやっているのだろうか。
- キーワードをマクロで変換して、処理を実行してるぽい。たとえばpackageキーワードの場合、最終的にpackage.elのpackage-installが呼ばれてインストールする、というように。leaf自体が処理を持っているわけではない
- leaf関数がメイン。各キーワードをapplyして、対応する関数を実行している
- leaf keywordで定義されているキーワードの処理の中身はhandler系
- defmacroが大量に使われている。マクロを理解していないと読めない
- とほほのLISP入門 - とほほのWWW入門でdefmacroをおさらいする
(defmacro double (x) (list '* 2 x))
(double 3)
(defmacro double (x) (list '+ x x))
(defvar a1 2)
(double (incf a1))
;; (+ (incf a1) (incf a1))
;; (+ 3 4)
(defmacro double (x) (list '+ x x))
(defvar a1 2)
(macroexpand '(double (incf a1)))
バッククォートでマクロを表現。コンマで部分評価する。
(defmacro add(x y) (list '+ x y)) ; `を使わないと、若干面倒
(defmacro add(x y) `(+ ,x ,y)) ;; x, yを評価
(add 1 2)
リスト展開。
(defmacro if-do (test &body do-list)
`(if ,test (progn ,@do-list)))
(if-do (> 5 3) (print "AAA") (print "BBB"))
メモ。
- paragraph-start 巨大な正規表現…
- リージョンの選択領域が出るのはtransient markモードを使用しているから。これがデフォルトになる前は記憶していた…
- [0:54/2:00] の時間を表示
- 目標時間は org-clock-effort
- effortが設定されてないときは設定してない表示をする
- 開始してないときは何も表示しない
- 使ってないパッケージの整理
- サジェストまわりの設定