VimでSyncTexをEvinceで

ただ現時点で一応使えるプラグインはあるらしいsved。
これも後で試してみて、挙動を確認しておこう。
ただpython依存っぽいのがやや...
個人的にpython依存より、denops依存or無依存が嬉しいのでその方向でいこかな

-
d-feet
これでdbusのデバッグ?とかをGUIでできるから使える -
busctl
dbusをいい感じに表示してくれるやつ

d-feetでevinceで起動されてるdaemonの動きはなんとなく分かるが、d-feetで検知できないっぽいevinceのdbus通した口について調べないと色々不便なので、やっとく

現状dbusのsystem busはちゃんと起動してるっぽいけど、sesstionのほうは起動されてないっぽい
ユーザー固有がsesstionなので、wslのsystemd固有の動作の可能性ありでとてもダルそう

$ loginctl enable-linger $UID
をしたら、おそらくユーザー周りの初期設定をリセットして、いい感じにdbusのsessionが動くようになった

MacのSkimでSyncTeXするdenopsプラグイン
通信部分は大きく変更する必要ありそうだけど、実装のためになるやも
↑これ使う時は以下のようなフラグを適切につけてやると、うまく動く
deno run --allow-env --allow-read --allow-write --allow-sys --unstable main.ts

ゴリラ氏いわく
そこの処理はたしかRust側でチェックしていた気がします
なので npm かは関係なくて、runtime 側で同じ関数が呼ばれるからそこでチェックされるって感じですね
との事
参考コードとしては、↓ここ

これで動作確認できそうなので、それが終わったら、denops経由でも動くかどうか確認しときたい
多分systemdは起動しとかないと駄目な感じかな

ライブラリをDenoで使ってみる、お試し用のうんこみたいなコード
import dbus from "npm:dbus-next@0.10.2";
const bus = dbus.sessionBus();
const EVINCE_PATH = "/org/gnome/evince/Evince";
const EVINCE_INTERFACE = "org.gnome.evince.Application";
const EV_WINDOW_INTERFACE = "org.gnome.evince.Window";
// evinceのdestinationを取得
const obj = await bus.getProxyObject(
"org.gnome.evince.Daemon",
"/org/gnome/evince/Daemon",
);
const daemon = obj.getInterface("org.gnome.evince.Daemon");
const owner: string = await daemon.FindDocument(
"file://" + "path-to-pdf",
false,
);
const evince = await bus.getProxyObject(owner, "/org/gnome/evince/Evince");
const app = evince.getInterface("org.gnome.evince.Application");
const windowList = await app.GetWindowList();
if (windowList.length === 0) {
throw new Error("No window found");
}
const windowPath = windowList[0];
const windowProxy = await bus.getProxyObject(owner, windowPath);
const window = windowProxy.getInterface(EV_WINDOW_INTERFACE);
await window.SyncView(
"full-path-to-tex",
[ 33, 1 ],
0,
);
window.on("SyncSource", (a: string, b: [ number, number ], c: number) => {
console.log("SyncSource");
console.log(a);
console.log(b);
console.log(c);
});
特に
import dbus from "npm:dbus-next@0.10.2";
const bus = dbus.sessionBus();
この部分だけで、端末が戻ってこないので、ここでのsessionBusの意味を理解する必要あり

とりあえず仮ぐみで作成してみた
面倒くさそうな箇所をユーザーの設定に丸投げして、プラグイン自体はdbusとかdenopsとかの連携をwrapする感じ
めちゃ人を選びそうなプラグインになりそうだな...:awoo: