basyura's blog

あしたになったらほんきだす。

Inkdrop - vim plugin で独自コマンド定義

v5.5 @ windows

v5.5 がリリースされたものの、Electron のバージョンが上がったからなのか Windows でウインドウを最大化するとタスクバーの前面に出てしまう現象に悩み中。タスクバーの位置を上にしたうえで非表示にして使っているのでいろいろ困る。ウインドウを最大化せずに最大のサイズ(スクリーンサイズ)にリサイズすればタスクバーの前には出てこないので、これで回避中。MS の PowerBI でも発生してるし (最近使ってないから知らないが)、何かしらのアプリが掴むからなのかタスクバーが常に表示された状態になることもしばしばなので根本的になにかあるんだろうと思うけど直る気配は無い。アイコン点灯してタスクバー出してくるのはいいとしても一定期間 (3sとか) 過ぎたら非表示に戻って欲しいんだな、ホントは。

いろいろ手間

Inkdrop は基本的に最大化して使っていて、自分で画面を表示しながらメモを取りたい場合や、資料と並べてメモを取ることがしばしばある。最大化状態とサイズ (主に横幅) を小さくした通常状態で切り分けていたので、最大化相当状態としてスクリーンサイズに広げただけでは、マウスを使ってサイズを変える手間が増える。最大化相当状態に戻すのも手間。

vim plugin を愛用しているので独自コマンドを定義して代用することにした (本来はフォーラムに登録しろよなんだけど、手元の課題を自分でできる範囲でプログラムを書いて解決してしまいたくなってしまう病)。

コマンド定義

init.js に定義しておけば :slim<CR> or :sl<CR> で発動できる。便利。 Inkdrop のコマンドとして定義してショートカットキーに当ててもいいのだけど、組み合わせは有限なので vim plugin のコマンドとして定義できると便利。引数も使えるし。

inkdrop.onEditorLoad(() => {
  const CodeMirror = require("codemirror");
  // 幅を指定してリサイズ
  CodeMirror.Vim.defineEx("width", "wi", (cm, event) => {
    if (event.args == null) {
      showConfirm(cm, "requires an argument.");
      return;
    }
    const height = window.screen.height;
    const width = window.screen.width;
    const arg = parseInt(event.args[0], 10);
    const info = { x: width - arg, y: 0, width: arg, height: height };
    inkdrop.window.setBounds(info);
  });
  // 横幅細めでリサイズ
  CodeMirror.Vim.defineEx("slim", "sl", (_, event) => {
    const height = window.screen.height;
    const width = window.screen.width;
    const info = { x: width - 600, y: 0, width: 600, height: height };
    inkdrop.window.setBounds(info);
  });
  // 横幅半分にリサイズ
  CodeMirror.Vim.defineEx("half", "ha", (_, event) => {
    const height = window.screen.height;
    const width = window.screen.width;
    const info = { x: width / 2, y: 0, width: width / 2, height: height };
    inkdrop.window.setBounds(info);
  });
  // 画面いっぱいにリサイズ (≠ Full Screen)
  CodeMirror.Vim.defineEx("full", "fu", (_, event) => {
    const height = window.screen.height;
    const width = window.screen.width;
    const info = { x: 0, y: 0, width, height };
    inkdrop.window.setBounds(info);
  });
});

// メッセージ表示 (Vim Plugin から拝借)
function showConfirm(cm, text) {
  if (cm.openNotification) {
    cm.openNotification('<span style="color: red">' + text + "</span>", {
      bottom: true,
      duration: 5000,
    });
  } else {
    alert(text);
  }
}

Windows で最大サイズにしたらタスクバーが出なくなったのでちょっと修正

  // 画面いっぱいにリサイズ (≠ Full Screen)
  CodeMirror.Vim.defineEx("full", "fu", (_, event) => {
    const height = window.screen.height - 1;   // 高さを微調整
    const width = window.screen.width;
    const info = { x: 0, y: 1, width, height };  // 位置を微調整
    inkdrop.window.setBounds(info);
  });

もうひとこと

zenn.dev に書こうとすると "ちゃんとかこう" と思ってしまったりでハードルが上がるので、こっちでひとまずアウトプットしたうえでまとめたものを zenn.dev に登録するのがいいのかなぁと思う今日このごろ。