1日9時間寝たい

本当は10時間寝たいです

カーソル行の直前・直後に空行を挿入する micro の plugin を作った

micro editor で Insert Line Above/Below するプラグインを作りました。

VSCodeCtrl+Enter とか Ctrl+Shift+Enter とかに割り当てられている *1 あれです。

レポジトリ

github.com

Demo

コード

実装のメイン部分は10行くらいなので、プラグインというには大げさでせいぜいマクロといったところでしょう。

function insertLineBelow()
  local v = CurView()
  v:EndOfLine(false)
  v:InsertNewline(false)
end

function insertLineAbove()
  local v = CurView()
  v.Cursor:Up()
  insertLineBelow()
end

インストール

1 . ~/.config/micro/settings.jsonpluginchannels の部分を次のように書き換えます。

{
  "pluginchannels": [
    "https://raw.githubusercontent.com/micro-editor/plugin-channel/master/channel.json",
    "https://raw.githubusercontent.com/ia7ck/insertline/master/channel.json"
  ]
}

2 . micro の コマンドモードで plugin install insertline を入力してEnterを押します。

使い方

コマンドモードで insertlinebelow と打つと、カーソル行の下に空行が、 insertlineabove と打つと、カーソル行の上に空行が挿入されます。

キーボードショートカット

デフォルトでは Alt+Enterinsertlinebelow に割り当てています。

insertlineabove には何も割り当てていません *2

この設定は ~/.config/micro/keybindings.json を編集することで変更できます *3




メモ

マクロじゃダメなの?

Ctrl+U でマクロの登録、Ctrl+J でマクロの実行ができます *4 が複数登録ができません。

プラグインの開発

ここ を見ると、~/.config/micro/init.lua にコードを書けばプラグインが作れることが分かります。micro 本体が提供している関数や変数は ここ で確認できます。

たとえば、CurView() は Go のコード内で定義されている View 構造体のポインタを返します。EndOfLine*View 型の変数をレシーバにとってカーソルを行の末尾に移動させる関数です。InsertNewline も同様にして、現在のカーソル位置で改行する関数です。こういうのはIDEを使って複数ファイルを横断検索して、気になる関数とかがあれば定義元にジャンプする機能を使うといいです(と最近気づきました)。

Go だと *View 型の変数 v に対して EndOfLine を実行するにはドット . を使って v.EndOfLine() としますが、lua でそれに対応する記法は v:EndOfLine() です。意図せず再帰的に関数が呼ばれるのを防ぐためには引数に false を指定しておくといいみたいです *5

プラグインの公開

channel.jsonrepo.json を用意することで、micro のコマンドモードから plugin install でインストールできるようになります *6 。ただし、上で示したように ~/.config/micro/settings.json をあらかじめ編集しておく必要があります *7