Spacemacsは推奨パッケージをLayerにまとめたemacsディストリビューションです。
キーバインドなどの各機能は、各レイヤーが追加しているものに加えて、emacsそのものの機能やvimライクなevil-modeが提供するものが同時に有効になっています。
各レイヤーの利用シナリオに沿って、一貫性のある操作体系を整理することが有効です。
Window操作
Window操作は追加レイヤーを必要とせず、Spacemacsにビルトインです。
SPC w v|SPC w s- ウインドウ操作はvimと一貫性があり、
Ctrl-w vなどviと同じキーバインドを利用できる。Ctrl-wと同等のプレフィクスとしてSPC wも有効 :spや:vsなどのexコマンドも使えるSPC w 2など数値指定でn分割するバインドもある
- ウインドウ操作はvimと一貫性があり、
SPC w w- ウインドウ間移動もvimと一貫性があり、
Ctrl-w Ctrl-wで次バッファに移動し、同等のSPC wプレフィクスがある Ctrl-w h|j|k|lの方向指定移動も有効
- ウインドウ間移動もvimと一貫性があり、
SPC w d- 削除もviに準拠。
:qや:clコマンドも利用できる
- 削除もviに準拠。
SPC t g- Golden-ratioのON/OFFトグル。Golden-ratioはアクティブウインドウのサイズを広くとる
emacs標準のCtrl-x 2といったウインドウ操作も有効ですが、viと一貫性のある操作がSpacemacsの特長です。
Shell layer
Shell layerは、Spacemacs上でターミナル操作するバッファを提供します。
- SPC '
- Shell layerのターミナル開閉。ターミナルは通常、編集モードになっているため事実上オープン操作専用に近い
- Ctrl-d
- ターミナル切断操作によりクローズする。シェルセッションの変数などはリセットされる。emacsの機能ではないが、ターミナル操作と一貫性がある
- Ctrl-x 0
- ターミナルを閉じる(Emacs標準のウインドウを閉じる操作)。リーダーのSPCがターミナルに奪われるため、閉じる際は
C-x 0の方が確実 - Shell layerの閉じる操作は
Alt-m 'を使うか一度ノーマルモードに切り替えてからSPC 'だが、一貫性が弱い
- ターミナルを閉じる(Emacs標準のウインドウを閉じる操作)。リーダーのSPCがターミナルに奪われるため、閉じる際は
- M-!
- emacs標準機能により、ミニバッファでワンライナー実行。sudoなどパスワードを要求するようなコマンドは実行できない
- Shift + PageUP
- ターミナル上で過去の表示内容を上方向にスクロール表示します。逆にPageDownも機能します
なお、このターミナル上ではプロセスkillのCtrl-Cがemacsに奪われますが、Ctrl-X Ctrl-Cでkillできます。
また、Linuxデフォルトのansi-termでは内部でvimも動作しますが、ESCがSpacemacsにとられます。Alt-]は動作しますが、Spacemacsのモードの影響も受けるため難があります。
Spacemacsのコマンドはターミナルからも実行可能です。SPCは単なる空白文字になるため、リーダーキーはAlt-mなどを使います。
vterm
shell-layerの動作モードはemacsがサポートするターミナルから選択できます。Cで実装されたvtermが高速に動作するといった点で定評があります。セットアップにはコンパイルが必要で、あらかじめlibvtermとcmakeをインストールしておき、M-x vtermを呼ぶと初回にコンパイルします。
Androidの場合も、SourceForgeで配布されているTermuxとのセット版を利用すると動作します。termuxでlibvtermとcmakeをインストールしておくことで、emacs上のコンパイルを実行できます。ただし、Android Emacsは初回ディレクトリアクセス時にパーミッション取得に失敗することがあるため、M-x vtermを繰り返し実行しないと進まないことがあります。
vtermインストール後には、cmakeと依存パッケージ群は削除できます。
LSP layer
多くは各プログラミングごとのレイヤーのバックエンドにlspを指定する構成になりますが、
LSP layerが提供するキーバインドを通じて言語サービスを利用できます。
- SPC m h h
- カーソル位置のワードに関するリファレンス(xDocほか)を表示。Ctrl-Gなどでクローズする
- SPC m g d
- カーソル位置のワードの定義へ移動
- SPC m g r
- カーソル位置のワードの参照リストを表示・選択移動
- SPC m g b
- ジャンプから戻る
Markdown layer
Markdown layerはmarkdown編集を支援するレイヤーです。主要な機能はmarkdown-modeが提供しています。
ただし、markdownは入力支援の意義が薄いため、アウトライナーの方が有意義でしょう。キーバインドはorg-modeとある程度の一貫性があります。
- g j|k|h|l
- 見出し間ジャンプ。方向はvimのカーソル移動と同じ
- Shift-Tab
- アウトライン(見出しをエントリーとする)の折り畳みトグル。
Tabは選択項目をトグル、カーソルが見出し上にある場合のみ安定動作。Shift-Tabは全リストのトグル
- M-Left|Right
- インデント階層操作。アイテムリストのネスト変更のほか、見出しのレベル変更も可能。
- M-Up|Down
- カーソルが指している階層以下のブロックを丸ごと上下に移動する
- Ctrl-c Ctrl-o
- カーソルがファイルリンクの上にある際、リンク先を開く。
- org-modeと一貫性のあるキーバインド。
SPC m fもあり、SPC mプレフィクスに補完させる手もある
- SPC m i T
- 行列指定のうえテーブルを挿入。テーブルは記述が面倒なため、入力支援が有用
- SPC m t
- テーブル編集のプレフィクス。行や列の挿入、削除
SPC SPC gfm-modeを実行すると、ややファンシーなPreviewモードに切り替わります。名前のとおり、GitHub flavored Markdownとして解釈します。
SPC SPC markdown-modeで編集モードに戻ります。
Javascript Layer
Javascript系には、js2-modeを核とする Javascript layerとtypescript-modeの Typescript layerがあります。
素朴に両方追加すると拡張子によって使い分けられます。
ただし、バックエンドにlspを利用したりフォーマットにprettierを設定すると、両者に意味のある違いが薄れ細部の違いによる使いにくさが目立ちます。
たとえばJavascript layerに統一したい場合、tsのメジャーモードにjs2-modeを指定します。
(add-to-list 'auto-mode-alist '("\\.ts$" . js2-mode))
なお、いずれのメジャーモードも開発は不活発です。
typescript-modeの近況から、Emacs29で新たなtypescript-ts-modeがコアにバンドルされる見通しです。
主な機能としてlspとprettierを利用する場合、
Vue layerを流用するのも一手です。
Vue layerはメジャーモードにweb-modeを採用しており、web-modeが比較的幅広いテンプレートに対応しています。
たとえば、Litのテンプレートは文字列リテラルですが、web-modeは内部のHTMLをある程度解釈できます。
prettierの方が適切に動作するものの、prettierはリージョンをフォーマットしないためweb-modeの機能補完は有用です。
またlspのバックエンドも選択でき、Vue以外の構成に流用可能です。
CSV Layer
SpacemacsでCSV編集で解説しています。