vim-users.jp

Hack #227: surround.vim の囲むルールを独自に拡張する

Posted at 2011/09/05
このエントリーをはてなブックマークに追加

surround.vim について

テキストを好きな文字列で”囲む”ことに特化したプラグインとして、surround.vim があります。
定番プラグインなので使用している方も多いでしょう。

デフォルトで、テキストを括弧( [([{ 等)や、HTMLタグで囲んだりする事が出来ます。

surround.vim は囲むルール( 以降 surrounding rule と記載 )を拡張する機能を用意しており、ユーザーが独自に surrounding rule を追加することが出来ます。

surrounding rule の拡張

例えば下記のような設定は

autocmd FileType ruby let b:surround_45 = "<% \r %>"

&filetype が ruby 場合に let b:surround_45 = "<% \r %>" を設定しています。

  • b:surround_4545- の ASCII コード番号です。
  • \r は囲まれるテキストが入るプレースホルダです。

上記のように設定すると、

puts "Hello world!"

の行にカーソルを合わせ、ノーマルモードで yss- と入力すると、下記のように eruby のコードとして囲む事ができます。

<% puts "Hello world!" %>

しかし、毎回 ASCII コードを確認して設定するのは面倒なので、 char2nr() を使用し、下記のように設定する方が分かりやすいでしょう。
以下の設定は E で囲まれるテキストをヒアドキュメント化します。

let b:surround_{char2nr("E")} = "<<EOS \r EOS"

surrounding rule のより詳細な説明は :help surround-customizing を参考にして下さい。

さらに簡単に surrounding rule を拡張する

さて、ここまでは前置きで、目的は基本知識の整理だったのでした。
上述の surrounding rule の拡張をより簡単に行う為の、簡単なプラグインを作成しました。

インストール

Vundle を使用している場合以下のコマンドでインストール出来ます。

:BundleInstall t9md/vim-surround_custom_mapping

設定

g:surround_custom_mapping ディクショナリを設定します。
キー に surrounding rule が設定される &filetype 、値には surrounding rule をディクショナリとして設定します。
キー _(アンダースコア)は特殊なキーで、ここに設定された surrounding rule は全てのファイルタイプで利用できるようになります。

例えば下記の様に設定すると

let g:surround_custom_mapping = {}
let g:surround_custom_mapping._ = {
            \ 'p':  "<pre> \r </pre>",
            \ 'w':  "%w(\r)",
            \ }
let g:surround_custom_mapping.ruby = {
            \ '-':  "<% \r %>",
            \ '=':  "<%= \r %>",
            \ }
  • ppre タグで囲む(全てのファイルタイプで有効)
  • w%w() で囲む(全てのファイルタイプで有効)
  • -%<%> で囲む(ruby ファイルのみ)
  • =%<=%> で囲む(ruby ファイルのみ)

という意味になります。

より具体的な例

もともと私がこのヘルパープラグインを作ったのは

  • html を編集していようが、
  • textile を編集していようが、
  • vim のヘルプを編集していようが

p で整形済みテキストとして囲むというように、似た様な意味(=整形済みテキスト)で囲む場合は、指運動を同じにしたかった からです。
意味に対応する指運動(=運指)が別だと覚えるのが大変です。
上記を実現する設定は下記になります。

let g:surround_custom_mapping = {}
let g:surround_custom_mapping.help = {
            \ 'p':  "> \r <",
            \ }
let g:surround_custom_mapping.textile = {
            \ 'p':  "<pre> \r </pre>",
            \ }
let g:surround_custom_mapping.html = {
            \ 'p':  "<pre> \r </pre>",
            \ }

最後に

このプラグインを作った際、surround.vim 作者の tpope さんに Pull Request を送りました。
取り込まれはしませんでしたが、8/7 日頃に「 来月か、再来月位に新しいのを出す予定、それまでこの pull request はオープンにしておくよ。」と返事をくれました。
ですので、もしかすると9月か10月頃には surround.vim のニューバージョンがリリースされ、今回紹介したプラグインは不要になっているかもしれません。

t9md

もどる
blog comments powered by Disqus