読者です 読者をやめる 読者になる 読者になる

partedit.vim 更新した

vim

遥か昔に partedit.vim と言うものを作ったのだけど、最近ちょっとあって更新してみた。
今月の TokyoVim#11 で、kawakami_o3 さんが文芸的プログラミング、具体的には Literate Haskell でうまいことインデントしようとがんばっていた。Literate Haskell はこんな感じのもの。

クイックソートだよ!

> quicksort :: Ord a => [a] -> [a]
> quicksort []     = []
> quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
>     where
>         lesser  = filter (< p) xs
>         greater = filter (>= p) xs

実行するよ!

> main :: IO ()
> main = print $ quicksort [4, 3, 1, 9, 7, 5, 2, 6, 8]

"> " で始まってる部分が Haskell のコード。ちなみにこれは .lhs として保存して直接実行できる。
で、これを編集する時にインデントとか効かなくて困ると言う話。確かに困る。
一方 partedit.vim は、バッファ内の一部分を別バッファで編集できるプラグイン。元々は html 内の javascript なんかを filetype=javascript で編集できるようにってことで作った。
で、今回の件、partedit.vim に prefix を削除して編集できる機能を付ければ今回のケースにも適用できるんじゃないかと思い、機能を追加してみた。以下のように設定する。

" ftplugin/lhaskell.vim
" lhaskell(Literate Haskell)を編集する際に使われる filetype plugin

" prefix 文字列を設定
let b:partedit_prefix = '> '
" partedit 側の filetype を設定
let b:partedit_filetype = 'haskell'

このようにしておくと、:Partedit 対象が全て指定した prefix で始まっている場合、その部分が取り除かれた状態で編集できる。もちろん元バッファへ復元されるときは prefix も戻される。
例では b:partedit_prefix を使っているが、auto_prefix (bool) と言うオプションもあって、これを使うと共通した prefix があった場合自動でそれが prefix として扱われる。デフォルトで有効なので実は b:partedit_prefix は必要なかったりする。
これ、例えば Markdown で字下げしてる部分とかにも使えると思うので、ちゃんと使えば多少は便利なんじゃないかなー。
ところで、オプションが増えたのでついでに :Partedit コマンドの引数を変更した。互換性がなくなったけど、使ってる人そんなにいないだろうし大丈夫だろう、と。
このプラグイン、partedit バッファを保存した瞬間に元のバッファも書き換えられたり、 partedit バッファ内で更に :Partedit することも可能で、そうすると全部のバッファが同時に書き換えられたりして見た目的にはなんかかっちょいいので、使用風景の動画でも取ろうかと思ったのだけど、面倒になってしまったのでもし良かったら誰かやってください。