Dynalist Mover for VS Code eyecatch

Dynalist Mover for VS Codeは、Visual Studio Code上でテキストやアウトラインの塊をDynalistっぽく上下に動かすための拡張機能です。Obsidian版Dynalist Moverに慣れすぎて、VSCodeでの作業中にも同様の操作をしたい場面が増えたため、VSCode版を作成しました。これでMarkdown以外も動かせます。

VSCodeのMarketplaceで公開しました。拡張機能からインストールできます。

機能 | Features

  • 選択した複数行をまとめて上または下に移動できます。
  • 親のリスト項目を動かすと、インデントされた子項目もまとめて移動できます。
  • 親子構造を維持したまま移動できます。親項目を動かすと、インデントされた子項目も一緒に移動します。
  • 移動後も選択範囲を維持するため、同じショートカットを続けて押して位置を調整できます。
  • 箇条書きだけでなく、通常の段落、Markdown要素、任意のテキストブロックで使えます。
  • 選択中の行を淡い青色でハイライトし、どの範囲を動かしているかを確認しやすくします。

Markdown以外でも動くけど、基本はMarkdownやテキストドキュメント系用を想定しています。

使い方 | Usage

  1. 移動したい行にカーソルを置くか、複数行を選択します。
  2. Ctrl+Shift+Alt+↑ / Ctrl+Shift+Alt+↓ を押します。macOSでは Cmd+Shift+Alt+↑ / Cmd+Shift+Alt+↓ です。
  3. コマンドパレットから使う場合は、Dynalist Mover: Move selected lines up または Dynalist Mover: Move selected lines down を実行します。

既定のショートカットは、VSCode標準のショートカットと衝突しにくい組み合わせにしています。通常の1行移動としても使えますが、親項目にインデントされた子項目がある場合は、子項目もまとめてひとつのブロックとして移動します。

Alt+↑/↓ で使いたい場合

Alt+↑/↓ はVSCode標準の Move Line Up/Down に割り当てられているため、使いたい場合は個人用のキーバインドで上書きします。コマンドパレットから Preferences: Open Keyboard Shortcuts (JSON) を開き、次の設定を追加します。

[
  { "key": "alt+up",   "command": "dynalistMover.moveLinesUp",          "when": "editorTextFocus && !editorReadonly" },
  { "key": "alt+up",   "command": "-editor.action.moveLinesUpAction",   "when": "editorTextFocus && !editorReadonly" },
  { "key": "alt+down", "command": "dynalistMover.moveLinesDown",        "when": "editorTextFocus && !editorReadonly" },
  { "key": "alt+down", "command": "-editor.action.moveLinesDownAction", "when": "editorTextFocus && !editorReadonly" }
]

- で始まる行は、VSCode標準の行移動コマンドの割り当てを外すための設定です。別のキーに割り当てたい場合は、Keyboard Shortcuts UIで「Dynalist Mover」を検索して変更できます。

Ctrl+↑/↓ で使いたい場合

Dynalistに近い操作感にしたい場合は、Ctrl+↑/↓ に割り当てることもできます。VSCodeではエディタの1行スクロールと衝突するため、次のように個人用キーバインドで上書きします。

[
  { "key": "ctrl+up",   "command": "dynalistMover.moveLinesUp",   "when": "editorTextFocus && !editorReadonly" },
  { "key": "ctrl+up",   "command": "-scrollLineUp",               "when": "editorTextFocus" },
  { "key": "ctrl+down", "command": "dynalistMover.moveLinesDown", "when": "editorTextFocus && !editorReadonly" },
  { "key": "ctrl+down", "command": "-scrollLineDown",             "when": "editorTextFocus" }
]

この場合、エディタ内の1行スクロールは使えなくなりますが、通常の編集操作中はDynalist Moverだけが反応するようになります。

制作背景 | Background

Obsidianプラグインを作ってDynalistっぽい動きを使えるようにしたら、VSCodeでも同じように動かしたくなったので作りました。思ったよりDynalist依存が強かったようです。