トントンってのがさ,つい.って話.(まーくだん変,じゃなく markdown 編)
markdown 形式での編集作業について.
ここで話題にしたいのは "改行" についてです.
<br>
に展開されるあれです.
行末に半角のスペースを 2 つ以上入れる,というあれ
皆さんは markdown 形式上での作業中,この作法に煩わしさを覚えることってありませんか?
自分はしばしばあります.と言いますか,しょっちゅう.
とりわけ,入力作業にスピードが求められるようなシーン.
こんな状況下となりますと,「行末にスペース 2 個入れて return」というどうってことない単純な手続きが,それこそ「いちいち...」になってしまうのです.
そのうち「忘れる → 気になる → タイプ作業自体が乱れる → 集中できなくなる → ぶっち切りで置いてかれる → 慌てる → (闇)」といった悪循環の華が開くわけです.
だったらいっそのこと作業中一切忘れて集中し,後でまとめて修正なり調整をすれば,とも考えるわけです,当然.でもこれも結局,後へしわ寄せしただけの話で,それなりの手間を要する.
とこんな過ちを経て以下のような Vim script を用意して凌ぐことにしました,と言うのがこの度のお話です.
function! s:FormMarkdownEOL() range exe 'silent %s/\s\+$//e' exe 'silent %s/^[^$].\+$/& /e' exe 'silent %s/^[^$]\s*.\+\zs\s\{2}\ze$\n$//e' " -- headers exe 'silent g/^\(=\|-\)\+\s*$/s/\s\+$//e' exe 'silent g/^\(=\|-\)\+\s*$/-1s/\s\+$//e' exe 'silent g/^#\+[^#]/s/\s\+$//e' exe 'silent g/^#\+[^#]/-1s/\s\+$//e' " -- horizontal rules (This really doesn't have any meaning...) exe 'silent %s/\(^\(-\|*\|_\)\{3,}\)\s\+$/\1/e' exe 'silent %s/\(^-\+\(\s\+-\+\)\s\{-}-\+\)\s\+$/\1/e' exe 'silent %s/\(^\*\+\(\s\+\*\+\)\s\{-}\*\+\)\s\+$/\1/e' exe 'silent %s/\(^_\+\(\s\+_\+\)\s\{-}_\+\)\s\+$/\1/e' " -- table exe 'silent %s/\(^\s\+|.\+|\)\s\+$/\1/e' " --- html tag exe 'silent %s/^\s*<\a.\{-}>\zs\s\+$//e' exe 'silent %s/<\/\a\{-}>\zs\s\+//ge' exe 'silent %s/\zs\s\+\ze$\n^\s*<\/\a\{-}>//e' " -- Reference-style links exe 'silent %s/^\s*\[\(\a\|\d\)\{-}]:\s\+<*https*:.\+>*\s\+".*"\zs\s\+$//e' exe 'silent %s/^\s*\[\(\a\|\d\)\{-}]:\s\+<*https*:.\+>*\s\+''.*''\zs\s\+$//e' exe 'silent %s/^\s*\[\(\a\|\d\)\{-}]:\s\+<*https*:.\+>*\s\+(.*)\zs\s\+$//e' let l:iscodeblock = 0 " is NOT code block for l:linenum in range(a:firstline, a:lastline) let l:linestr = getline(l:linenum) " -- code blocks if match(l:linestr, '^\s*```') >= 0 if l:iscodeblock == 0 let l:iscodeblock = 1 " is code block (switch on) else let l:iscodeblock = 0 " is NOT code block (switch off) endif endif if l:iscodeblock == 1 "erase the blanks on EOL exe 'silent ' . l:linenum . 's/\s\+$//e' else " -- lists let l:linenum_next = l:linenum + 1 if len(getline(l:linenum_next)) >= 0 if match(getline(l:linenum_next), '^\s*\(\*\|+\|-\|\d\+\.\)\s\+[^-*].') >= 0 exe 'silent ' . l:linenum . 's/\s\+$//e' endif else exe 'silent ' . l:linenum . 's/\s\+$//e' endif endif endfor endfunction command! -nargs=0 -range=% Mdown <line1>, <line2> call s:FormMarkdownEOL()
こんなスクリプトを markdown 向けに用意したファイル形式プラグイン filetypeplugin の中に挿し込んで使っています.
作業中気が向いたときに :Mdown
と叩くと必要な箇所の行末へスペースを 2 つセットしてくれる,と言う塩梅です.
一応ではありますが,情弱ながらも出来る限り "必要な箇所へ" セットされるようにしてみてます.
客観的に捉えて,当の本人ですら,「頑張るとこ,ソコかよw」的な箇所多々ありますが「痛い奴」ということで軽く流して下さい(笑.
勿論ツッコミ大歓迎であります.
そう言う事ですので,markdown の仕様を完全に準拠したものではなかったりします.と申しますか,もっと根本的な話,今の自分には無理でしょ,と.
いずれも自分の作業中心で考えてます.
コードブロックはバッククォート x3 の表記方法しか採らない,半角スペース x4 やタブによる表記ってしないから,それに関わらない細かい所は気にしなない.引用 blockquotes で複数行連続で >
使う場合,それらの行は繋がらず,各行必ず改行して欲しいから,そうする.リンクは参照型 Reference-style links しか使わないし,その参照型の定義でも url とタイトルの間で改行 & インデントといった表記方法採らないので,それに関係ない部分は無視で良し.テーブルは,markdown の標準の仕様にあるものでないから,余り細かいこと気にしないで良っか.
そんな「まずは自分の作業で困ること無ければそれでいい」な感覚で,余り細かい所に関しては気にならなければ気にせず,サラッと見切っちゃっています.
おわりに
調べてみますと,シンタックスハイライトやプレビューに関する話題は色々と見受けられるのですが,ここで感じていたような <br>
についての情報に辿り着く事ができませんでした.一部キーマップを調整していると言う話題はありましたが.
と言う事で,自分が知らないだけで,必ずもっとスマートな方法が有るはずだとは思っているのですが...もしこれをご覧になった中でご存じの方いらっさいましたら,教えて頂きたいです.
あと,Vim script もっと知らなくちゃな.今回の作業で新しく知った事,気付いた事,色々とありました.
と言うところで,はいおしまい.