作ってはみたけど、問題が発生。
ブロック
テキストにおいて、空行で挟まれた範囲を「ブロック」と呼ぶことにします。
マークダウンで箇条書きすると、段落の切れ目に空行を入れる。 その範囲を一つの単位と見なします。 これがブロック。
このブロックをオブジェクトとして扱いたい。
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 +1if((n+m)>p)breakn+= 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 +1if(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 +1if(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()
リビルドを掛ければキッシュを更新できますが、入力モードでなくなりますね。
これはこれで困る。