Open16

VimでSyncTexをEvinceで

kamechakamecha

wsl上のlinuxでtex書く時にvimtex使うとライブコンパイル?みたいな事はできるけど、Evinceを使った†SyncTex†(pdfとエディタ上で位置を相互ジャンプできる機能)は対応してないらしい。
どうやらSkimとかと違ってEvinceは相互ジャンプのための仕様が違うらしい、具体的にはEvinceはD-Busとかいう技術を使って相互ジャンプをするみたい。(:h vimtex-view-evince
これをvimで扱いたいので、そのプラグインを作るぞい☆的なスクラップ

kamechakamecha

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

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

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

kamechakamecha

現状dbusのsystem busはちゃんと起動してるっぽいけど、sesstionのほうは起動されてないっぽい

ユーザー固有がsesstionなので、wslのsystemd固有の動作の可能性ありでとてもダルそう

kamechakamecha

https://www.npmjs.com/package/dbus-next
↑これ使う時は以下のようなフラグを適切につけてやると、うまく動く

deno run --allow-env --allow-read --allow-write --allow-sys --unstable main.ts

kamechakamecha

これで動作確認できそうなので、それが終わったら、denops経由でも動くかどうか確認しときたい

多分systemdは起動しとかないと駄目な感じかな

kamechakamecha
ライブラリを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の意味を理解する必要あり

kamechakamecha

https://github.com/kamecha/denops-dbus_synctex
とりあえず仮ぐみで作成してみた

面倒くさそうな箇所をユーザーの設定に丸投げして、プラグイン自体はdbusとかdenopsとかの連携をwrapする感じ

めちゃ人を選びそうなプラグインになりそうだな...:awoo:

kamechakamecha

大体の方針は決まったことだし、細かい使い勝手よりも先に、READMEとかdocとかのユーザーからの窓口を作っといた方が良さそうだな

後から全部docに書くのも面倒ですし、お寿司

kamechakamecha

READMEもdocも書いたし、luaのラッパーも書いたぜ!

まだcheckhelthでdbusの検知とか、適切なエラーハンドリングとかしたいけど、時間かかりそうだから、いったんここで一区切りって事にしとこう

このプラグインの紹介記事でも書いて、スクラップのクローズとするかな