くふんを狙え(vimグループ) このページをアンテナに追加 RSSフィード

くふんを狙え

 | 

2008-06-21

パーセントではさまれた文字列の置換

18:58 | パーセントではさまれた文字列の置換 - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - パーセントではさまれた文字列の置換 - くふんを狙え(vimグループ) パーセントではさまれた文字列の置換 - くふんを狙え(vimグループ) のブックマークコメント

前回の「単純な置換」ほど汎用的ではないけど、たまに使う表現をメモ。

関数の目的は、パーセントではさまれた文字列の置換すること。例えば、文字列'hello, %lang%'の%lang%を'Perl'で置き換えたり、'Ruby'で置き換えたりしたい場合に使う。いちいちsubstitute()って書くのが嫌いなので*1、変換前の文字列と辞書を渡して置換してもらう。

ごちゃごちゃ書くより見たほうが早いので、貼り付ける。ぺたり。

function! s:replace_percent(fmt, dict, ...)
  let pat = (exists('a:1') && a:1 ? '\c' : '\C') . '%\([^%]*\)%'
  let sub = '\=s:replace_percent_stub(a:dict, submatch(1))'
  return substitute(a:fmt, pat, sub, 'g')
endfunction

function! s:replace_percent_stub(dict, match)
  if a:match == '' | return '%' | endif
  if has_key(a:dict, a:match)
    return a:dict[a:match]
  else
    return '%' . a:match . '%'
  endif
endfunction

パーセントを二つ重ねるとパーセントになる。マッチしない場合は、削除したり特別な置換はしない。大文字小文字はデフォルトで区別する。第三引数が真なら区別しない。以下に使い方の例を示す。

" The True Vim Master
echo s:replace_percent('The True %fuga% Master', {'fuga': 'Vim'})

「substitute()の第三引数に式(関数)が使える」それを知ったときの感動の余韻としか思えない。即興で同じようなものを(書けてしまうから)書いてしまうことが多い。そんなかわいそうな関数

*1関数名が長いし、引数が多いし、前回書いたように引数に特別な意味があったりするから。いろいろ理由はあるけど、とにかく嫌い

ChrisChris2012/11/26 10:43I thought finding this would be so aroduus but it's a breeze!

ChrisChris2012/11/26 10:44I thought finding this would be so aroduus but it's a breeze!

irrlhxirrlhx2012/11/30 02:44eduEPe <a href="http://wrhiqdbexfur.com/">wrhiqdbexfur</a>

pmlgkatzhzpmlgkatzhz2012/11/30 11:478V4Sbt , [url=http://uuatgxgfghyi.com/]uuatgxgfghyi[/url], [link=http://cjyedguajljn.com/]cjyedguajljn[/link], http://sjdsgcvbfvhk.com/

aziiuyaflvaziiuyaflv2012/11/30 19:33bylOM1 <a href="http://kfsikcltoikg.com/">kfsikcltoikg</a>

dacnnldddacnnldd2012/12/01 01:02lMDcpS , [url=http://zzqvjsyysbqj.com/]zzqvjsyysbqj[/url], [link=http://cbdpeedqwfmq.com/]cbdpeedqwfmq[/link], http://hatkmjpeezjg.com/

 | 
最近のコメント
最近のトラックバック
Error : RSSが取得できませんでした。
カレンダー
<< 2008/06 >>
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 30
カウンター
267427