以下の内容はhttps://wineroses.hatenablog.com/entry/2024/09/14/105109より取得しました。


Obsidianでブロックごと入れ替える

作ってはみたけど、問題が発生。

ブロック

テキストにおいて、空行で挟まれた範囲を「ブロック」と呼ぶことにします。

マークダウンで箇条書きすると、段落の切れ目に空行を入れる。 その範囲を一つの単位と見なします。 これがブロック。

このブロックをオブジェクトとして扱いたい。

BlockCut

まずブロックをカットするTemplaterスクリプトを組んでみます。

<%*
e = app.workspace.activeLeaf.view.editor
p = e.getCursor().line
s = tp.file.content
d = s.split("\n\n")
for(i=n=0; i<d.length; i++){
  m = d[i].split("\n").length + 1
  if((n+m)>p) break
  n+= m
}
a = d.splice(i,1)
navigator.clipboard.writeText(a[0])
s = d.join("\n\n")
await e.setValue(s)
await e.setCursor(n, 0)
%>

カーソル行が何行目かを調べてから、空行で区切って配列化し、カーソル行のブロックを抜き出しクリップボードに入れる。 そうした動作になっています。

BlockUp

ブロックの切り出しができるなら、これを応用すれば入れ替えもできる。

ブロックを上に上げるスクリプトは下記の通り。

<%*
e = app.workspace.activeLeaf.view.editor
p = e.getCursor().line
s = tp.file.content
d = s.split("\n\n")
for(i=n=0; i<d.length; i++){
  n+= d[i].split("\n").length + 1
  if(n>p) break
}
if(i<2) return
[d[i],d[i-1]] = [d[i-1],d[i]]
m = d[i].split("\n").length + 1
s = d.join("\n\n")
await e.setValue(s)
await e.setCursor(p-m, 0)
%>

BlockDown

ブロックを下に下げるのは:

<%*
e = app.workspace.activeLeaf.view.editor
p = e.getCursor().line
s = tp.file.content
d = s.split("\n\n")
for(i=n=0; i<d.length; i++){
  n+= d[i].split("\n").length + 1
  if(n>p) break
}
if(i>=d.length) return
[d[i],d[i+1]] = [d[i+1],d[i]]
m = d[i].split("\n").length + 1
s = d.join("\n\n")
await e.setValue(s)
await e.setCursor(p+m, 0)
%>

こんな感じになります。

問題点

実はBlockUpとBlockDownには問題があります。 どうも連続して使えない。 見た目はブロックの入れ替えになるのですが、2回実行すると元の並びに戻ってしまいます。

途中でカーソルの操作をしたりスクロールを入れたりすると連続しても問題はない。 間を空けても動作するので、内部キャッシュの更新が遅れるのかなと疑っています。

こういうのはどうするとクリアできるんだろう?

まとめ

await app.workspace.activeLeaf.rebuildView()

リビルドを掛ければキッシュを更新できますが、入力モードでなくなりますね。

これはこれで困る。




以上の内容はhttps://wineroses.hatenablog.com/entry/2024/09/14/105109より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14