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

トントンってのがさ,つい.って話.(まーくだん変,じゃなく markdown 編)

tech vim settings

markdown 形式での編集作業について.

ここで話題にしたいのは "改行" についてです.

<br> に展開されるあれです.

行末に半角のスペースを 2 つ以上入れる,というあれ

皆さんは markdown 形式上での作業中,この作法に煩わしさを覚えることってありませんか?

自分はしばしばあります.と言いますか,しょっちゅう.

とりわけ,入力作業にスピードが求められるようなシーン.

こんな状況下となりますと,「行末にスペース 2 個入れて return」というどうってことない単純な手続きが,それこそ「いちいち...」になってしまうのです.

そのうち「忘れる → 気になる → タイプ作業自体が乱れる → 集中できなくなる → ぶっち切りで置いてかれる → 慌てる → (闇)」といった悪循環の華が開くわけです.

だったらいっそのこと作業中一切忘れて集中し,後でまとめて修正なり調整をすれば,とも考えるわけです,当然.でもこれも結局,後へしわ寄せしただけの話で,それなりの手間を要する.

とこんな過ちを経て以下のような Vim script を用意して凌ぐことにしました,と言うのがこの度のお話です.


Space Bar (1 of 2)Space Bar (1 of 2) / Brett Jordan




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 もっと知らなくちゃな.今回の作業で新しく知った事,気付いた事,色々とありました.

と言うところで,はいおしまい.