Unity の外部エディタとして Emacs を使う
Unity の外部エディタとして Emacs を使う場合、emacsclientw を指定して引数に -n +$(Line):$(Column) $(File) を指定すれば使えるのですが Language Server を使うにはプロジェクトファイルの生成が必要です。
外部エディタを VisualStudio に切り替えて Regenerate project files を押せば良いのですが面倒だなぁと思っていたら rider2emacs というツールを見つけました。
Using Unity Editor With Emacs (Part 2) が詳しいのですが、(少なくともWindows版では) rider を外部エディタに指定すると一瞬ウィンドウが開いて消えるのが不愉快なので調べてみると Unity 側で何かしているようで外部エディタ側では対処できないようです。
仕方がないので vscode のフリをする code2emacs を Rust 言語の勉強を兼ねてスクラッチで作ってみました。(Windowsでしかテストしていません)
main.rs
use regex::Regex; use std::env; use std::process::Command; fn main() { let args: Vec<String> = env::args().collect(); //println!("{:?}", args); // ["path/to/code2emacs.exe", "path/to/My project", "-g", "path/to/Test.cs:1:2"] if args.len() != 4 { return; } let re = Regex::new(r"(?<file>.*?)(:(?<line>\d+))?(:(?<col>\d+))?$").unwrap(); let Some(caps) = re.captures(&args[3]) else { return; }; let file: &str = &caps["file"]; let line = caps.name("line").map_or("", |l| l.as_str()); let col = caps.name("col").map_or("", |c| c.as_str()); let mut args_out = vec!["-n"]; let mut position: String = "+".to_string(); if !line.is_empty() { position += line; if !col.is_empty() { position += ":"; position += col; } args_out.push(&position); } args_out.push(file); let _ = Command::new("emacsclientw").args(&args_out).spawn(); }
Rust で code で始まる名前 (code2emacs とか) で新規プロジェクトを作って Cargo.toml の dependencies に regex = "1.11.1" を追加すればビルドできます。
Unity の External Script Editor に code2emacs.exe を指定して Visual Studio Code と認識されれば OK です。
プロジェクトからファイルを開いたりエラー行にジャンプしたりできてプロジェクトファイルも都度更新されるはずです。できない場合は emacsclientw.exe にパスが通っているか、 Emacs 側でサーバーが起動しているか確認してください。
Rust 言語、初めて触ったけど所有権の概念でランタイムのコスト無しでメモリ安全を実現してるの面白いですね。他にも意図しないディープコピーが発生しないとか抽象化のコストがゼロとか実行速度に悪影響を与えないように色々考えられている。
まだ慣れてないせいか適当に書くとエラーだらけになるんだけどコンパイラが「こうすればいいよ」って hint をくれるのでそれに従えば大抵なんとかなる。(もっと勉強しろw)
ちなみに VisualStudio の外部エディタに Emacs を指定するにはメニューバーの ツール - 外部ツールをこんな感じに。(VS がプロジェクトファイルを管理するので code2emacs は不要です)
昔は自分でショートカットキーを設定したような記憶があるのですが、何故か自動で Alt+Enter に割り振られていました。
割り振られなかったり変更したい場合はここ