rcmdnk's blog
Last update

Surround

Octopressで強調表示をしようと思うと **で囲えば太字にしてくれますが(*一つはイタリック)、 囲うのが面倒であまり使ってませんでした。

これを使っていくために簡単に使える様にプラグインを使って設定しなおしました。

vim-surround

vim-surroundは 文字列を囲う括弧などをスマートに扱えるようになるプラグインです。

NeoBundleなどを使っていたら.vimrc

.vimrc
1
NeoBundle "trope/vim-surround"

を加えておくだけで入れられます。

これだけでも

"Hello| world!"

と言う文字列の|のところにカーソルがあったとして、 ノーマルモードでds"(delete surround “)とするだけで両側の"が消えます。 "は大概の記号が使えます。

括弧とかだと{を使うと{ a }の様に両側に空白をいれ、 }を使うと{a}の様に空白無し、にしたりします。

また、tはタグを意味し、<div>~</div>みたいな中でdstすると両側のタグが消えます。

cs"'(change surround “ (to) ‘)とすれば"'に変わります。

逆に単語の途中にカーソルがあるときにysiw"(you surround inner word (with) “)と押すと 単語の両側を"で囲います 1

ビジュアルモードに置いてはS"Sを使うとその囲った部分を"で囲ってくれます。

一つだけ、vim-surroundで行われる動作をuで取り消そうとすると 結構予期しない動作をします。 囲む作業で色々な動作を指定てその辺が上手くヒストリーできてないのか 仕方ないのかわかりませんが、 囲んだ後にuとかしようとする場合には多少手作業が必要になることもあるので 気をつけます。

キー設定

このままでも大分便利ですが、ysiw"とかはちょっと長いのでキーマップします。

.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
let g:surround_{char2nr("a")} = "**\r**"
nm <Leader>{ ysiw{
nm <Leader>} ysiw}
nm <Leader>[ ysiw[
nm <Leader>] ysiw]
nm <Leader>( ysiw(
nm <Leader>) ysiw)
nm <Leader>< ysiw<
nm <Leader>> ysiw>
nm <Leader>" ysiw"
nm <Leader>' ysiw'
nm <Leader>` ysiw`
nm <Leader>* ysiw*
nm <Leader><Leader>* ysiw*wysiw*
nm <Leader>a ysiwa
xm { S{
xm } S}
xm [ S[
xm ] S]
xm ( S(
xm ) S)
xm < S<
xm > S>
xm " S"
xm ' S'
xm ` S`
xm * S*
xm <Leader>* S*gvS*
xm <Leader>a Sa

ノーマルモードでは<Leader> と記号を使ってカーソル下の記号を囲う様に設定。

<Leader>は通常は\ですが自分設定では

" mapleader (<Leader>) (default is \)
let mapleader = ","
" use \ as , instead
no <Subleader> <Nop>
map \ <Subleader>
no <Subleader>, ,

として、,<Leader>として使って \へは<Subleader>とういものを新たに割り当てて、 一応\,,を使える様にしてあります。 (faとかで飛んだ時に;でもう一つ進むのに対して後ろに戻るキー。ほとんど使いませんが。。。)

ビジュアルモードでは記号を押すだけで選択範囲を囲う様に設定。

この設定はずいぶん前からあったんですが、 今回アスタリスクのものも付け加えて、 特に、nm <Leader><Leader>* ysiw*wysiw*<Leader>をもう一つ打つことで*2つで囲う、という項目も入れました。

この設定により、ノーマルモードからでも一発で**を両側における様になります。

追記: 2016/03/12

let g:surround_{char2nr("a")} = "**\r**"

を追加。 vim-surroundではこの様にg:surruound_{char2nr("<char>")} という変数を使ってaを記号の一つの様に使え、 それに対して囲む物を定義することが出来ます。

定義は\rで分けて左側と右側に囲むのにつかう文字列を入れます。 ここに複数文字を入れることが出来るので、"<div>\r</div>" みたいなものをdに割り当てたり数rことも可能です。

追記ここまで

これでOctopressで強調したい単語が出てきた時も 単語上で,*したり、 ビジュルモードで適当に囲んで,,*するだけで すぐに強調表示に出来ます。

これまではなんとなく強調したいだけのものも、'で囲うことが多かったのですが、 なんとなく見難い感じもするので、 コードっぽいものとそうでないものと分けてやってみようかと思います。

まあ、気分次第ですが。

Sponsored Links
  1. iwが単語選択のtext-objectなので、これをys3l"とだけすれば今の所から3文字の部分を囲う、とかも出来ます。

    surroundの特殊な使い方としてyss"sを使うとその行全体を囲います。

Sponsored Links

« ブラウザ間でのパスワードの同期 GNU screenでのソケットディレクトリについて »

}