ろぐれこーど

限界組み込みエンジニアの学習記録とちょっぴりポエム

VSCodeに慣れ切った人間が限界までサクラエディタを使ってみた話

サクラエディタ、使っていますか?

自分は新卒入社時、先輩に謎マウント1取られて以来忌み嫌っていたのですが、何事も経験せず批判するのも良くないなと思い、とりあえず限界までカスタムしたらどれくらい使い物になるのかを試してみました。ちなみに普段はVSCode使いです。

結論から言うと

みたいな使い分けに落ち着いています。

コードリーディングにはそこそこ不自由なく使えるようになりますが、やはりがっつりコーディングするのはきついです。また筆者がよく使うのはC、アセンブリpythonVBA(VBScript)くらいですが、せいぜいCかアセンブリくらいにしか使いません。というかVSCodeが便利すぎるので、特別な理由がない限りVSCodeに落ち着きますね。。

静的解析ソフトとかクソデカ神エクセル仕様書とかを立ち上げながらコード読みたい時がちょくちょくありますが、そう言うときはサクラエディタの方が軽いのでよく使います(PCのスペックにもよる)。

VSCodeとの比較と、実際に行ったサクラエディタの設定などを書いていきます。記事執筆時点で以下verを使用しています。

  • SakuraEditor == 2.4.1
  • python == 3.8.10

設定ファイル、マクロ等はここに置いてます↓

github.com

比較

しばらくサクラエディタを使ってみて感じた、VSCodeと比較していいところ・イマイチなところを挙げてみました。

いいところ

軽い

最大の長所。サクラエディタに限らず、軽量エディタを使う理由の9割以上はこれだと思う。試しに60000行越えヘッダファイルをサクラエディタVSCodeで開いてみると、圧倒的にサクラエディタの方がメモリ消費、CPU負荷が少ないことがわかります(開くファイルとかVSCodeに入れてる拡張機能にもよるけど)。編集時もVSCodeは若干もっさりしますがサクラエディタはサクサクです。

f:id:gco46:20220324233451p:plain
CPU・メモリ消費比較

まあここまで巨大なファイルを編集することは稀なので、サクラエディタに有利な問題設定なのは否めないけど…普通に使う分には、「動作の軽快さ」でいえばVSCodeの方が上です。VSCodeは起動時にファイルやフォルダの内容を読み込むことで、軽快な動作を実現しています。サクラエディタgrepやタブ切り替え時に逐次処理を行うため、動作としては若干ラグがあります。

外部マクロ実行

外部ファイルを読み込んで操作の自動化等ができます。形式は

  • WSHマクロ(.vbs or .js)
  • キーマクロ(.mac)
  • PPAマクロ(.ppa)

が利用できるとのこと。

主に使うのはWSHになるでしょうか。WSHからはマクロ専用関数が利用でき、これを使うとサクラエディタに実装されていない機能でも擬似的に機能拡張することができます(実際欲しい機能がないので作りました、後述)。これなかったらわざわざサクラエディタ使わんと言っても過言ではない。

キーマクロは一連のキー操作をマクロとして記録し、自動実行できる機能です。キー操作とは言っていますが、サクラエディタは全てのコマンドをショートカットキーに割り当て可能らしいので、事実上あらゆる操作をキーマクロで実行できます。ただExcelならまだしも、プレーンテキストに対して特定の操作を繰り返し実行したいと思ったことがないのであまり使いませんが…

PPAはPoor-Pascal for Applicationというものらしく、Pascalで記述したマクロ機能を実装するためのフリーウェアだそうです。わざわざPascal使うことない(しかもPoor-Pascalってことで言語機能も限られる)し、DLLのダウンロードが必要なのであえて使う意味はないでしょう。結局のところWSH頼みですね。

謎の信頼を得ている

会社/組織によっては使うソフトなどが厳密に定められているところもありますが、サクラエディタが禁止されているというところは聞いたことがありません。おそらく「外部との通信をする機能がない」とかそういうところに起因するものと思われます。普段使いのエディタを禁止されると著しく生産性が下がりますが、サクラエディタを使えるようにしておけばとりあえず安心はできるでしょう2

イマイチなところ

シンタックスハイライトが弱い

コードエディタとして利用する上での最初の壁です。デフォルトでは予約語リテラル、コメント しか色分けしてくれません(辞書を編集することはできるけど結局予約語と同じ扱い)。これはプレーンなエディタの限界でもありますが、VSCodeだと自動でフォルダ内すべてのファイルに対して構文解析が走るのに対し、サクラエディタ現在開いている1ファイルしか見ることができず、特に構文解析もしないためシンタックスハイライトが難しいものと思われます。

自分的には最低でも、関数・定数までは視覚的に色分けされてて欲しかったので、少しでもマシになるように設定を作りました。カラー設定参照。

入力補完が微妙

これも致し方ないですが、デフォルトだと辞書 or 編集中のファイル くらいしか補完候補の単語を拾ってくれません。一応ctagsの出力ファイルを利用するプラグイン拡張でそれっぽく動かすこともできますが、tagsファイルが大きいと補完候補の表示処理が激重でサクラエディタの長所が消滅します。コーディングするときは大人しくVSCode使った方が良さそう。

ファイルに関する操作

エディタ上でファイルツリーを表示する機能はありますが、視認性・操作性は現代的エディタと比べると劣ります。それだけならまだ良いですが、サクラエディタには「ファイル名で指定して開く」といった機能がありません(goto Anythingとか言われる機能、VSCodeならCtrl + E or Cmd + P)。開いているファイルの場所をエクスプローラで開く、みたいな代替っぽい機能はありますが「違う、そうじゃない」と言わざるを得ない。

コードを読む上では必須級の機能だと個人的には思っているので、外部マクロで簡易的なものを作りました。後述。

Windows専用

どれだけ設定を作り込んでも他OSでは使えません。しゃーない。

どちらともいえないところ

プラグイン拡張

ないよりはあった方がいいけど、まだ微妙に使いこなせていません。プラグイン拡張では、

  • アウトライン解析の外部実装
  • スマートインデントの外部実装
  • 入力補完の外部実装
  • メニューコマンドの追加

を実現できます。一番欲しかったのがプロジェクト内シンボルの入力補完ですが、先に述べたように動作がイマイチなのであまり使っていません。なんかいい方法あるのかな。

設定したこと

ここからは、実際にサクラエディタを使う上での設定や作成したマクロなどを紹介します。

フォント

デフォルトのMSゴシックは視認性が悪いので変更します。個人的おすすめはHackGen

サクラエディタは英文・和文で別々のフォントを設定することができないため、必然的に両対応の等幅フォントが候補になります。「等幅フォント プログラミング」とかでググれば色々出てくるのでこだわると楽しいかも。

ショートカット

デフォルトのショートカットをVSCodeっぽくします。よく使うのは↓

操作 コマンド
grep検索 Ctrl + Shift + F
置換 Ctrl + H
grep置換 Ctrl + Shift + H
行指定でジャンプ Ctrl + G
タグジャンプ F12, Alt + ダブルクリック
ダイレクトタグジャンプ(シンボル指定ジャンプ) Ctrl + T
カーソル位置の単語を選択 Ctrl + D
行末まで削除 Ctrl + Shift + K
アウトライン表示(トグル) Ctrl + B
対括弧の検索 Ctrl + Shift + \

また、サクラエディタ特有の機能を以下に割り付けています。

操作 コマンド
右タブをすべて閉じる Ctrl + Shift + W
tagsファイル作成 Ctrl + Shift + A
検索マークの切替え Ctrl + Q

タブ表示設定で使用すると、grep結果が毎回新規タブで開かれるためどんどんタブが煩雑になります。それらを一括で閉じるためのコマンドをショートカットに割り当てました。またコードリーディングに必須のtagsファイル作成もコマンド登録しています(マクロも作成しましたが後述)。Ctagsがデフォで入ってるのはありがたいですね。

VSCodeだと選択した単語に自動でハイライトっぽい表示をしてくれてすごく助かるのですが、サクラエディタは明示的にしてやる必要があります。そのためのコマンドが検査マークの切替え(Ctrl + Q)です。部分一致でもハイライトされて少し使い勝手が悪いですが、そのときは正規表現で検索するしかないですね。。

ファイル内検索時、次/前のヒット箇所に移動する際のコマンドがF3 / Shift + F3という微妙に押しにくい設定なので、これは変えてもいいかもしれません(自分は慣れてしまったので特に変えていません)。

個人的に欲しいと思った以下の操作が用意されていない or 使い勝手が悪いので、これらはマクロで作ります。

  • カーソル行の下に行を挿入
  • Tab/逆Tabインデント
  • ファイルを指定して開く

カラー設定

基本

デフォルトのクリーム色も悪くないのですが、ダーク系に慣れているので調整します。また、シンタックスハイライトが弱い部分を追加の正規表現設定で補います。

ダークテーマについてはMonokai風設定を公開してくださっている方がいるので、そのまま使わせてもらいました。

github.com

選択範囲の背景色や文字色など、微妙に見づらく感じた個所は適宜変更しました。

正規表現

関数・定数のハイライトを正規表現で登録します。特定の正規表現にマッチするパターンを任意の色で表示できるのですが、完璧に色付けできるわけではないため多少は妥協し、「シンボル名から種別が判断できるもの」はハイライトすることにします。以下、C/C++用設定で作成した例です。

  1. 制御文の予約語/(if|for|while|switch|return|sizeof|case)[ \t]*(?=\()/k
  2. 定数(すべて大文字の単語を定数と扱う):/\b[A-Z_]+[0-9A-Z_]*\b[ \t]*/k
  3. 関数名:/[a-zA-Z_]+[0-9a-zA-Z_]*[ \t]*(?=\()/k

それぞれのパターンにマッチする箇所に対して任意の色でハイライト設定ができます。重複する場合は番号が若いものが優先されるようになっています。

まず関数名にマッチさせるパターン(3)を書きますが、関数呼び出し演算子()は制御文にも多用されるため、制御文のパターン(1)を定義しています。また今回の場合、「大文字+アンダースコアからなるシンボルは定数である」と決め打ちして、定数パターン(2)を関数より優先させています。

欲を言えば型名もハイライトさせたいのですが、シンボル名のみから型名かどうかを判断することができないため諦めます(コード規約とかで縛ればできんこともないけど)。まあ読めなくはないのでこれでよいかな。

マクロ

サクラエディタに外部マクロを登録することで、ショートカットから実行できるようになります。マクロはそれぞれリポジトリの以下ファイルと対応しています。

  • カーソル下に行挿入: InsertLine.mac
  • Tab/逆Tabインデント: IndentTab.vbs, UnindentTab.vbs
  • ファイルを指定して開く: open_file.vbs
  • プロジェクトを開く: open_project.vbs
  • tagsファイル作成: make_tags.vbs

後述しますが、下三つはpythonスクリプトjson設定ファイルを組み合わせて実現しています。ざっくりと書くと以下のような構造です。

f:id:gco46:20220324233947p:plain:w350

といった感じです。登録用マクロひとつに1ショートカット割り当てるようなイメージなので、基本的には用途ごとにマクロファイルを作る必要がありますが、各々に設定情報を持たせると煩雑になるので設定ファイルにまとめました。設定ファイルは読み書きしやすいようjsonにしています。あと、pythonスクリプト実行時のコマンドライン入力を共通化したかったのでcommand.vbsを挟んでます。

それぞれのマクロ処理の詳細は以下参照。

カーソル下に行挿入

VSCodeでいうところのCtrl + Enterのやつ。地味に便利なのでキーマクロでつくります。

  1. 行末にカーソル移動
  2. 改行

をマクロ化し、Ctrl + Enterに割り当てるとそれっぽく動きます。

Tab/逆Tabインデント

Tab/逆Tabインデントは機能としては存在しますが、デフォルトだと

  • 行選択しないとTabインデントが効かない
  • 非選択時はTab/逆Tabインデントを受け付けない

という動作になります(仕様らしい)。微妙に使い勝手が悪いのでこれらのコマンドをWrapするマクロを作ります。

Tab/逆Tabインデントと選択範囲行の取得がWSHマクロから行えるので、これを利用します。TabインデントをCtrl + ], 逆TabインデントをCtrl + [に割り付ければVSCodeと同じ感じで使えますね。

ファイルを指定して開く

「ファイル名を入力し、プロジェクトフォルダ内のヒットしたファイルを開く」という動作を実現します。ここはある程度割り切って、以下のような動作をさせることとします。

  1. マクロ実行時、ユーザから開きたいファイル名の入力を受け付ける

  2. プロジェクトフォルダ内(あらかじめ登録しておく)のファイルを再帰探索する

  3. 最初にヒットしたファイルを開く(複数ヒットした場合を考慮しない)

探索対象であるプロジェクトフォルダのパスは何らかの方法で与えてやる必要があります。ファイル名入力と同時にユーザ指定しても良いですが、「ファイル名を指定して開く」という本来の目的を果たすために余計な操作が入るのが嫌だったので、あらかじめ設定ファイル等の形でプロジェクトフォルダのパスを指定しておくことにしました。現在開いているファイルがどのプロジェクトのものかを判断し、プロジェクトフォルダを探索対象として所望のファイルを開きます。

複数ヒットの場合のケアは迷いましたが、これを解決しようとすると対話的なインターフェースが必要になり、複雑さがかなり増すため諦めました。同名ファイルがプロジェクト内にある場合は大人しくエクスプローラから開くことにします。

マクロ登録部分のスクリプトはVBSで実装し、設定ファイル読み込み&ファイル探索などの処理はpythonで書きます。最初はVBSで書いてたんですが

  • 再利用しにくすぎる
  • 設定ファイル読み込みが面倒
  • スコープ管理がむずい

という理由からpythonに頼ることにしました。VBSからはWSHシェルでpythonスクリプトを実行するひと手間が発生しますが、VBSで全記述するよりはやりやすいと思ったので許容します。設定ファイルはライブラリが使えそうなjson形式にします。

試しにサクラエディタのリポジトリをクローンし、ファイル名を指定して開いてみました。Ctrl + Eに割り付けるとそれっぽく動きます↓

f:id:gco46:20220324234809g:plain

WshShell.Exec()を使用しているので一瞬コマンドプロンプトが表示されて少し気になりますが、特段困ることもなくやりたいことは実現できているのでよしとします。(頑張れば表示を無くすこともできるらしいですがめんどくさかった)

プロジェクトを開く

「ファイル名を指定して開く」のためにプロジェクトパスの情報を持たせているので、そこに「デフォルトのファイル」の情報もセットにしておけば「プロジェクトを指定して開く」ことも可能になります。ということでついでに作りました。

  1. マクロ実行時、登録済みプロジェクトの一覧を表示し、ユーザからプロジェクト名の入力を受け付ける

  2. 指定されたプロジェクトフォルダに対し、「デフォルトのファイル」を再帰探索する

という手順を踏みます。先に登録済みプロジェクトを表示して入力を促すので、ちょっと対話的っぽい感じになりました。やってることは実質「あらかじめ登録しておいたファイルを開く」というだけなのですが、設定ファイルをコンパクトにしつつ使い勝手も悪くないのでまあまあ満足。

先ほどと同様、試しにサクラエディタのリポジトリをプロジェクト登録して適当なファイルを開いてみた↓

f:id:gco46:20220324234947g:plain

サクラエディタ起動→プロジェクトを開く とすればわざわざエクスプローラから指定して開く必要がなくなります。

tagsファイル作成

ctagsは指定した言語のソースファイルを解析してくれますが、当然指定した言語で想定しない文字列が含まれているとうまく解析できません。インラインアセンブリ(#pragma asmとかそういうやつ)を含んだCソースとかだと、そのファイルだけ解析されずシンボルジャンプできない、という事象が発生したためやっつけで作りました。tagsファイル作成機能をwrapするようなマクロなので、tagsファイルが普通に作成できるなら不要です。

以下の手順で処理を行います。

  1. 対象プロジェクト内のファイルを再帰探索し、「無効化したいコード」をコメントアウトする
  2. tagsファイル作成する
  3. 1.でコメントアウトしたファイルを元に戻す

tagsファイルにはシンボル名と行数が記録されるため、tagsファイル作成時のみ無効な文字列(今回の場合でいうとアセンブリ記述)をコメントアウトすることで、期待通りのシンボルジャンプが実現できるようになります。

プラグイン

ctags入力補完だけ試してみました。結果、動作もっさりだったのでほぼ使っていません。

サクラエディタのwiki3にCtags入力補完プラグインが上がってたので使用しました↓

Plugin/投稿/10 - SakuraEditorWiki

一部文字コード比較のロジックがバグってたので、修正したものをリポジトリにあげています。

規模の大きいtagsファイルで使用してみるとわかりますが、入力補完トリガ後、1文字入力するたびにラグが発生します。おそらく文字入力毎にtagsファイル全体を走査し、候補リストを更新しているためだと思われます。これを解決するためには

  • 入力補完トリガ時に一度tagsファイルを読み込み、候補リストを保持
  • 文字入力毎に候補リスト内のみをチェックし、候補リストを更新

のような手順が必要な気がしますが、プラグインのみでは実現できないっぽいです。サクラエディタ開発の今後に期待(自分ではやらない)。

終わりに

ここまでやっておいて「結局VSCodeでよくね…?」となったのは言うまでもない。まだ改善の余地がありそうですが、やってる途中で我に帰ったのでキリのいいところでやめました。

誰得記事ですが一応そこそこ時間をかけたのでここで供養しておきます。

参考

http://cloiwan.com/?p=272

https://www.bugbugnow.net/2018/06/wshrunexec.html


  1. よくわからんエディタ使うな的なやつ(なお別に禁止されているわけでもない)

  2. そもそも高機能エディタを使えるように組織に働きかける方が圧倒的に生産性に寄与するということは肝に銘じておきたい

  3. あまりメンテされてなさそうですが…