Spacemacsを使う際に知っておきたかったこと
avashe.icon本節ではspacemacsを使う際に知っておくとよい概念やtipsを列挙する
emacsもvimもやったことがない場合、vim tutorialはやることをおすすめ
結構vimキーバインドはできがいい
というか基本の移動系はlessやmanコマンドなど、何かと使うので
Spacemacsはemacsのフレームワークである 本質的にはemacsなので、困ったらemacsのカテゴリで調べればその通りに動く
elispのみで書かれた分厚い層であり、余計な依存はない
インストール方法はgit clone https://github.com/syl20bnr/spacemacs ~/.emacs.dだけ
設定やファイルが散らばることなくサクッと試して捨てられる
インストールするときはdevelopにcheckoutしてから使いましょう
なんか知らんけど作者がmasterをどこぞのLinux OSのLTS並みに機能追加しない
masterとdevelopが全然機能的に違う
お試しならmasterが安定するのでまずはそっちで
最低3年くらい使っている気がするがdevelopで困ったのは一回くらい
それもmelpaだったかが落ちてた時にアップデート実行しちゃったときなので基本大丈夫
変な挙動になったらとりあえず.spacemacsだけ残して.emacs.dをhard resetなりcloneでOKです
developで更新するときは*spacemacs* bufferでパッケージを更新してからgit pull --rebase
パッケージインストールがどうやっても治らない場合、動作検証済みパッケージだけが降ってくるspacelpaを利用しましょう
.spacemacsファイルの dotspacemacs-use-spacelpaをtにして再起動するだけ
各レイヤがヘルプ系のツールをここに設定する
SPC h SPCはspacemacs公式の全ドキュメントやelispから検索できる
上述のドキュメントもここから探せるし、org layerとデフォルトの検索機能で快適に読める
layerを探してみたければ言語やツール名で検索すればよい
慣れてくると望みのパッケージをspacemacsがどう設定してるかここで調べたりする
でも本気でリポジトリ内を検索するときは.emacs.dに移ってSPC /した方がいい
spacemacs自体には関係ないが、SPC h mでmanをインクリメンタルサーチできるのも便利
ハイライトやhelm-swoopが効いた環境でmanが読めるので非常に快適
hに限らず便利機能は二連打したところにおいてあるので、初見のバインド群はそこから使ってみよう
Spacemacsの諸概念について
今までvimもemacsも使ったことが無い人が真正面から挑むと、多分キーバインドエディタが発明してきた概念ラッシュで苦戦するので、思いついたらここにまとめておく
trie構造のキーバインド
spacemacsはspaceを起点に複数の文字を押すことで沢山の機能を綺麗に扱うことができる
まずemacsではエディタの機能を関数として提供しているという前知識が必要
spaceがルート、続けて打ち込む各文字がノード、リーフがemacsの関数と捉えれば、このコマンド形式がtrieを成すことがわかる
trie構造に加え、連打が必要な時はステートマシン的なコマンド機能を提供している
FileとBuffer
ストレージ上のファイルとそこから読みだされたメモリ上のデータをそれぞれfile, bufferと呼んで区別する
bufferはあくまでemacsが管理するデータのことなので、modeの吐くログといったfileのないbufferもある
emacsもvimも多分この呼び方は共通
spacemacs上だとbufferとfileの操作は違うし、「検索する」機能が見る場所も異なってくる
それぞれSPC bとSPC fであり、特にb bとf fは最初に覚えるべきコマンド
ざっというとエディタが持つ状態のことで、この状態にキーバインドが紐づいている
普通に文字を打てるのがInsert state、trie構造のキーバインドが使えるのがNormal stateと分離されている
stateの遷移が必要な代わりに各キーバインドにCtrlやAltの組み合わせが不要になる
VimmerにはModeで伝わると思う
上のリンクの通り拡張されて10種類もあるが、基本的に数種類しか出会わない
vimmerは最初はiedit(文字置換時のstate)くらいしか新規に出会わないと思う
非vimmerの方は厳密に知りたければvim modeとかで検索してほしい
EmacerにはEvilのStateであってる?
modeだとmajor/minor modeと名前が衝突するのでこちらが採用されている
trie的なキーバインドは分かりやすく押しやすいが、局所的にステートマシンに抽象化すると便利な場合がある
連打したい場合やインタラクティブに複数のキーを打ちつつ様子を見たい場合
trie的なキーバインドは一関数に到達するために押す数が深くなってしまうため連打に向かない
zoomingやlayout操作など
trie的なキーバインドの葉で一時的な専用stateに突入するのがtransient state
上の例だとSPC z xやSPC l l
専用UIが出てきて続く操作を何度でも打てる
他のstateと違って、Normal stateの拡張と思うと良さそう
今エディタ上で有効になっている機能のこと
主にMajorとMinorという二つに大別される
Major modeはBufferに一つだけ定まるModeのこと
VimmerにはFileTypeに紐づいて起動する機能群と言えばいいか
ただしFileを開いてBufferとなったときに拡張子にフックされたMajor modeが呼ばれるだけなので、基本的に手動でモードを切り替えられる
主に特定の言語を開発するのがMajor modeとしてフックされる
Major modeの機能を使うときはSPC mでアクセスする
つまり言語の支援機能はまずSPC mにまとまっており、bufferごとに切り替わる
Minor modeはBuffer共通で使われる機能のこと
syntax checkerを統合するflycheck modeとか
text completion framework(frontend?)であるcompany modeとか
画面構成
Frame, Layout, Windowの三段構成
それぞれSPC F, l, w,に操作キーバインドがまとめられている
vimはしらん
spacemacsはSPC Fで統合的な操作を提供しており、複数のディスプレイをまたいだ操作が可能
Layoutはspacemacsのframe上にのってるwindow群の表示領域
tmuxでいうところのwindow
gvimやitermのtab
spacemacsだとlayoutが少し独特
defaultのlayoutは基本的に全てのbufferが見える
新しく追加したlayoutは自分に紐づけられたbufferしか見えない
Windowはlayout上にのってるbufferの表示領域
tmuxでいうところのpane
gvimでいうところのwindow
spacemacsはvimキーバインドが大体使えるので:spや:vsでwindowを割れる
SPC wやSPC NUM(数字)などのspacemacsキーバインドになれると使わなくなってくる
avashe.iconemacsの概念で、正直よくしらない
sudo要求時やhelmで開いたときに下から出てくるあれみたいな、一行の入力を受け付けるbufferのこと
vimにはない機能なのでvimキーバインドが大体対応してない、ペーストしたいときにつらい
emacsキーバインドに対応している(ペーストはC-y)のでそれで乗り切るか、emacs向けのleader key M-m からr(register)系でペーストできる
M-mはhybrid-style選択してないとでないかも...
helm bufferは多少特殊で拡張されている、ここはhelmの文化なのでそっちのドキュメントを読んだ方がいいかも
候補から選ぶときはC-jとC-kで移動する
C-@で候補を複数選択できる
SPC b bなどでは複数選択しM-Dでまとめて閉じたりできる
SPC f fなど、パスを扱っているときにディレクトリ単位で移動したいときはC-hとC-l
EmacsはServer-Client方式で使うもの
vimではないので、無理にそう使わない
daemonやsystemd serviceとして立てておいて、emacsclientというクライアントツールで画面だけ確保する
spacemacsはttyもframeも似たようなUIを提供してくれる
個人的にはframeがおすすめ、emacsのエコシステムが徐々にpostframe的な仕組みに移行しているため
systemd serviceを使うならdotspacemacs-persistent-server tとだけしてSPC q fとかで抜けよう
avashe.iconよくalias em=emacsclient -cnしてる
すでにframeが作られていたら作らずbufferだけ追加するみたいなスクリプトを用意できるはずだがやってない
だれか下さい
SPC s(search), SPC j(jump), SPC p (projectile), SPC / (smart search)を使いこなそう
使い慣れてきたらこれらコマンドを積極的に使っていこう
特にs sとj jはよく使う
j iはインターフェース(関数名やクラス名)に絞ってジャンプできるので便利だが、pythonなどの動的型付き言語だとうまく飛べなかったりする
j lは行ジャンプ、:絶対行数と組み合わせて使うと便利
avashe.iconでかいリポジトリを探すとき、SPC p f(プロジェクト全体ファイルパスインクリメンタル検索)は特によく使う
SPC /は実質projectileの機能だったはず
その他jump-to-definition機能とか実装に対応するテスト検索機能とか
まぁSPC mと被り勝ちだが、覚えて損はないはず
SPC /はリポジトリ内インクリメンタル全文検索
とりあえずプログラム読むときに大活躍する
.spacemacs内のdotspacemacs-search-toolsにripgrepを指定しておき、リポジトリがメモリに乗ると優勝です
Shellで消耗するのをやめろ
間違いなくemacsで完結したくなり誰もが手を出すmulti-termなどのエミュレータ
今どきのリッチな描画はまず再現しきれないと思った方が良い
あきらめてお好みのターミナルエミュレータを使おう
最近はdotspacemacs-mode-line-themeとかで色んなmode-lineの設定を選べるようになりました
doomみたいな絵文字全開のテーマはSPC SPC all-the-icons-install-fontsしないと使えないから注意
themeのインストールに含まれてないのが不思議、仕様が固まりきってないのかな?