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

markdown での vim-operator-surround の設定について考え...たんだけど

囲みプラグインには vim-operator-surround を使うようになって,気になっていた markdown でやりたい設定についてちゃんと考えてみることに.

今回はそこでのメモです.

いずれも個人的な使い方での話で,汎用性とかは考えてません.悪しからず.

今回やっておきたかったことは,;

  1. コードブロック``` 囲み.
  2. 強調** 囲み.
  3. はてな Markdown 記法の脚注 (()) 囲み.

で,こうしてみました.;

" add ```...``` surround when filetype is markdown
let g:operator#surround#blocks = {
\ '-' : [
\       { 'block' : ['[ ', ' ]'], 'motionwise' : ['char', 'line', 'block'], 'keys' : [' ]', ' ['] },
\ ],
\ 'markdown' : [
\       { 'block' : ["```\n", "\n```"], 'motionwise' : ['line'], 'keys' : ['`'] },                   --- 1.
\       { 'block' : ["**", "**"], 'motionwise' : ['char', 'line', 'block'], 'keys' : ['*'] },        --- 2.
\       { 'block' : ["((", "))"], 'motionwise' : ['char', 'line', 'block'], 'keys' : [' (', ' )'] }, --- 3.
\ ] }

"ref. :h g:operator#surround#no_default_blocks

こうすることで,以下の操作で囲めるようになります.;

  1. コードブロックです.``` で囲みます.
    操作は該当領域を選択し(ex. vip),sa`
  2. 強調でボールドスタイル*1にする記法です.** で囲みます.
    操作は該当領域を選択し(ex. viw),sa*
  3. 脚注になります.(()) で囲んでくれます.
    操作は該当領域を選択し,sa<Space>( または sa<Space>)
    ちなみにこれははてな Markdown での記法です.

注意が必要なのは,囲める append けど,削除 delete と置き換え replace が上手くいかない,というところ.
残念ながらこれについては,今のところお手上げ状態.

括弧や記号で文字列を一発囲むプラグインと言うと surround.vim が根強い人気でありますが*2,ちょっとしたキッカケにてカッとなり vim-operator-surround に変えました.

実は上に挙げた 3 つ,コードブロック,強調,そして脚注は,当該プラグインvim-operator-surround に変えてから,ただでさえ恥知らずの情弱に加えズボラな性格もあって使い方を良く調べず人力でやっていたのですが,そのうち思っていた以上に頻度が高いことに気づかされ,これはさすがに身体に悪い,と思ったわけです.

以下今回の作業で気になった事,分かった事メモです.

なお今回,ヘルプや本家 md 以外で,最も参考にさせていただいた情報はこちらになっています.;

» Surround.vimからvim-operator-surroundに移行した - TODESKING
» 犬製 Vim プラグイン紹介3本立て - sorry, uninuplemented

コードブロック のところ

これはヘルプに答えが載ってます.

:h operator-surround-setup-example
この一番最初に載ってます.

そしてこれを読み解くだけで,カスタマイズの基本的な方法はほぼ把握できる.
感謝.

強調 ボールド <strong></strong> のところ

'keys' キーは,アスタリスク * 1つのみで良しとしました.

強調は今回の ** ** の他にも,* * と1つのみのスタイルを採るものもあります.これは <em> タグとなります.
これは個人的な,しかも好みの話なのですが,ここでは強調のスタイルの場合,この <em> にあたる書き方は採ることはありません.

このことから,'keys' キーは * で良しとしました.

はてな記法 脚注 (( )) のところ

これも 'keys' キーの話ですが,先述の強調での考え方とは趣が異なったりします.

こちらは <Space>( または <Space>) とすることにしてます.

なぜ <Space> を挿し込むことにしたか.

考え方は,こちらもヘルプ g:operator#surround#no_default_blocks の記載を参考にしています.以下の部分.;

    : *snip*
    \       { 'block' : ['( ', ' )'], 'motionwise' : ['char', 'line', 'block'], 'keys' : [' (', ' )'] },
    \       { 'block' : ['{ ', ' }'], 'motionwise' : ['char', 'line', 'block'], 'keys' : [' {', ' }'] },
    \   ],
    \ }

これを見て,「あぁ,スペース入れるのもアリか」と.

このキーは最初 (( を考えていました.
勿論 ( は使えないので.

ところが,やはりダメなのですよね.

.., 'keys' : ['((', '))'] }, 定義してしまうと,
(( を叩いた時は問題なく当該括弧で囲んでくれるのですが,そうではなくデフォルトでの "( )" で囲みたいと ( を叩くと発動しないのですよね.

そりゃそうか,と.

と言う事で (( を当てるのは止めます.

そして上述ヘルプの当該記載を見て,「そういえば」と以前ブラケット [ ] でやった事を思い出し,キーとして <Space> を挿すことにしたわけです.

ちなみに [ ] の定義

[ ] 括弧について,こんなんことしてますが,;

let g:operator#surround#blocks = {
\ '-' : [
\       { 'block' : ['[ ', ' ]'], 'motionwise' : ['char', 'line', 'block'], 'keys' : [' ]', ' ['] },
\ ],
: *snp*

これは shellscript での test コマンド [ expression ] を想定してのことです.

わからないこと

上述 3 つの囲みで囲めるようになったことは良いのですが,こうやって付けた囲みの削除 delete と書き換え replace がどうも上手くいかない.

自分の場合,プラグイン側デフォルトで提供されているマッピングを使っていないのですが,それが良くなかったりするのかも.

ところで

このプラグインでしばしば経験するのですが,keys のキャラで素直に囲んでしまわれる事ってありませんか?
block キーで定義している括弧のセットではなく.

具体的な症状例を書きますと,

"()" で囲みたいと思って ) を叩きます.
期待するのは "(文字列)" なのですが,そいうではなく ")文字列)" と叩いたキャラで正直に囲んでしまう.対の ( を叩けばこれも同様 "(文字列(" と.

「...となる時がある」ではイケないのは分かっているので気にはしているのですが,いつも "いつの間にか" で orz,発症する文脈は未だ掴めず.

vim 自身を再起動すると元には戻ってくれるので,そうしちゃってます.

今のところ同様のレポート見当たらないし.
何か自分の設定の悪さしあっていたりするのかもしれない,と思うのですが.

ちなみに,ちなみに

motionwise キーの charline そして blockblock
これ CTRL-v による矩形の範囲選択のことだと.

それを "ブロック" と言い,"ブロック選択" と称する事を今更に知りました.*3

と恥をさらしたところで,はい,おしまいです.

*1:<strong> タグになる奴ですね.

*2:今年 2015 年の日付をもったエントリーがあるくらいなので,そう思った次第.

*3:ずっと "矩形選択" とかと,"矩形","矩形..." 言ってましたよ orz