diff --git a/doc/eregex.txt b/doc/eregex.txt new file mode 100644 index 0000000..0c26fe9 --- /dev/null +++ b/doc/eregex.txt @@ -0,0 +1,459 @@ +*eregex.txt* + + File: eregex.vim, eregex_e.vim + Author: AKUTSU toshiyuki + Maintainer: othree + Version: 2.56 + Required: Vim version 6.1 + Note: eregex.vim is used to convert regexp notation. + eregex_e.vim is used to map command for eregex.vim. + +1. License |eregex-license-to-use| +2. Installation |eregex-installations| +3. Functions |eregex-functions| +4. Command |eregex-commands| +5. Usage |eregex-examples| +6. Keymap |eregex-keymappings| +7. Principle |eregex-principle| +8. Convert Table |eregex-table| +9. Options |eregex-options| +10. Multiline |eregex-multiline| +11. Limitation of Delimiter |eregex-limitation-of-delimiter| +12. About Vim RegExp |eregex-about-vimregex| + +============================================================================== +1. License *eregex-license-to-use* + + Copyright of eregex.vim and eregex_e.vim belongs to AKUTSU toshiyuki. + It is free to change and redistribute this script. You can think as an + GPL License software. + + Author will not take any reponsibility for damages due to using this + script (eregex.vim, eregex_e.vim). + +============================================================================== +2. Installation *eregex-installations* + + Open eregex.vba using Vim. And execute the following command. +> + :so % +< + +============================================================================== +3. Functions *eregex-functions* *eregex* + *E2v()* +E2v({extendedregex} [, {iISCDMm}]) + + Vim regexp notation will return. +> + :let vimregex = E2v('(?<=abc),\d+,(?=xzy)','i') + :echo vimregex + \c\%(abc\)\@<=,\d\+,\%(xzy\)\@= +< + Detail of option value can be found at |eregex-options| + or |eregex-multiline| + +E2v("","V") + Return eregex.vim version number +> + :echo E2v('','V') + 248 +< +E2v({replacement}, {R1,R2,R3}) + Return the "to" part of :S/pattern/to/ . +> + E2v('\r,\n,\&,&,\~,~', 'R1') => \n,\r,\&,&,\~,~ + E2v('\r,\n,\&,&,\~,~', 'R2') => \r,\n,&,\&,~,\~ + E2v('\r,\n,\&,&,\~,~', 'R3') => \n,\r,&,\&,~,\~ +< + +============================================================================== +4. Command *eregex-commands* + *:E2v* +:[range]E2v [iISCDMm] + Extended regex To Vim regex. + Replace each extended-regex in [range] with vim-style-regex. + + *:M* +:M/eregex[/{offset} [iISCDMm]] + Match + :M/.*?<\/span>/Im + ==> /\C\_.\{-}<\/span> + + *:S* +:[range]S/{eregex}/{string}/[&cegpriISCDMm] + Substitute + :'<,'>S/(\d{1,3})(?=(\d\d\d)+($|\D))/\1,/g + ==> :'<,'>s/\(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@=/\1,/g + + *:G* *:G!* +:[range]G/{eregex}/{command} +:[range]G!/{eregex}/{command} + Global + :G/<<-(["'])?EOD\1/,/^\s*EOD\>/:left 8 + ==> :g/<<-\(["']\)\=EOD\1/,/^\s*EOD\>/:left 8 + + *:V* +:[range]V/{eregex}/{command} + Vglobal + +============================================================================== +5. Usage *eregex-examples* + +(1) :E2v command + + Change the regexp notation of the cursor line. + +(\d{1,3})(?=(\d\d\d)+($|\D)) + + Move cursor to this line and execute :E2v command will change this line to + the following result. + +\(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@= + + +(2) :M command +> + :M/.+?<\/Items>/Im +< + :normal! /\C\_.\{-1,}<\/Items> + + + + + + + + +(3) :S command +> + :'<,'>S/(\d{1,3})(?=(\d\d\d)+($|\D))/\1,/g +< + :'<,'>s/\(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@=/\1,/g + + 1 --> 1 + 12 --> 12 + 123 --> 123 + 1234 --> 1,234 + 12345 --> 12,345 + 123456 --> 123,456 + 1234567 --> 1,234,567 + 12345678 --> 12,345,678 + 123456789 --> 123,456,789 + +(4) :G command +> + :G/^begin$/+1;/^end$/-1:S/\l+/\U&/g +< + :g/^begin$/+1;/^end$/-1:s/\l\+/\U&/g + +begin + hello world. + hello world wide web. + hello The Internet. +end + + |begin + | HELLO WORLD. + | HELLO WORLD WIDE WEB. + | HELLO THE INTERNET. + |end + +(5) :V command + Skipped. + +============================================================================== +6. keymap *eregex-keymappings* + + You can add the following keymap to use / instead of type :/M + +nnoremap / :M/ +nnoremap ? :M? +nnoremap ,/ / +nnoremap ,? / + + "/" will use :M/ to search. ",/" will use the original "/". + + -------------------- + Add the following line to ~/.vimrc + let eregex_replacement=3 + will make :S have the following rules. + +:S/pattern/\r,\n,\&,&,\~,~/ +:s/pattern/\n,\r,&,\&,~,\~/ + + +--------------------+-----------------------------+ + | eregex_replacement | :S/pattern/\n,\r,&,\&,~,\~/ | + +--------------------+-----------------------------+ + | 0 | :s/pattern/\n,\r,&,\&,~,\~/ | + | 1 | :s/pattern/\r,\n,&,\&,~,\~/ | + | 2 | :s/pattern/\n,\r,\&,&,\~,~/ | + | 3 | :s/pattern/\r,\n,\&,&,\~,~/ | + +--------------------+-----------------------------+ + + +============================================================================== +7. Principle *eregex-principle* + eregex.vim adopts the way of extended regex about "alternation", + "repetition" and "grouping". + eregex.vim において、 + +============================================================================== +8. Convert Table *eregex-table* + + Perl notation on left side. Vim notation('magic') on right side. + +Alternation +-------------------- + :M/a|b /a\|b + +Repetition +-------------------- + :M/a* /a* + :M/a+ /a\+ + :M/a? /a\= + + :M/a*? /a\{-} + :M/a+? /a\{-1,} + :M/a?? /a\{-,1} + + :M/a{3,5} /a\{3,5} + :M/a{3,} /a\{3,} + :M/a{,5} /a\{,5} + + :M/a{3,5}? /a\{-3,5} + :M/a{3,}? /a\{-3,} + :M/a{,5}? /a\{-,5} + +Grouping +-------------------- + :M/(abc) /\(abc\) + :M/(?:abc) /\%(abc\) + :M/(?<=abc) /\%(abc\)\@<= + :M/(?abc) /\%(abc\)\@> + +Special Characters +-------------------- + :M/\\,\|,\(,\),\{,\},\?,\+,\*,\[,\] /\\,|,(,),{,},?,+,\*,\[,\] + :M/\^,\$ /\^,\$ + +Not support +-------------------- + \A, \b, \B, \G, \Z, \z + Vim doesn't support these features. + (?i:a) and (?-i) neither. + +Vim の正規表現で使えないもの +-------------------- + \%(re\) 等、パレン(丸カッコ) を使うもの全般。 + ~ matches the last given substitute string + \m 'magic' on for the following chars in the pattern + \M 'magic' off for the following chars in the pattern + \v the following chars in the pattern are "very magic" + \V the following chars in the pattern are "very nomagic" + + \x hex digit: [0-9A-Fa-f] + \\x[0-9A-Fa-f]{1,2} の場合、文字そのものに変換する。 + \x82\xa0 => 'あ' ( shift-jis, cp932 ) + ただし、0x00 と 0x0a と 0x08 は変換しません。 + +Vim の正規表現で使えるもの +-------------------- + 大抵使えます。(^^;) + \d, \D, \w, \W, \s, \S, \a, \A, \u, \U, \b, ... + \<, \>, \zs, \ze + \_[a-z], \%[abc], [[:alpha:]], \_., \_^, \_$ + \%23l, \%23c, \%23v, \%# + など。 + +============================================================================== +9. 特殊なオプションとアトム *eregex-options* + Note: "^L" は \x0c + + eregex.vim Vim +--------------------------------------- + :M/a/i /\ca/ + :M/\ca/ /\ca/ + :M/a/I /\Ca/ + :M/\Ca/ /\Ca/ + + :M/\s/S /[ \t\r\n^L] + :M/\S/S /[^ \t\r^L] + :M/[^az]/C /\_[^az]/ + :M/\W/C /\_W/ + :M/./D /\_./ + + :M/\s[^az]./M /[ \t\r\n^L]\_[^az]./ + :M/\s[^az].\M/ 同上。 + + :M/\s[^az]./m /[ \t\r\n^L]\_[^az]\_./ + :M/\s[^az].\m/ 同上。 + ++--------+------+--------------------------------------------------------+ +| OPTION | ATOM | 説明 | ++--------+------+--------------------------------------------------------+ +| /i | \c | 大小文字の区別無し。 | +| /I | \C | 大小文字の区別あり。 | ++--------+------+--------------------------------------------------------+ +| /S | | \s および \S を [ \t\r\n^L] や [^ \t\r^L] に変換する。 | +| /C | | 補集合が改行にもマッチする。 | +| /D | | ドットが改行にもマッチする。 | ++--------+------+--------------------------------------------------------+ +| /M | \M | /S と /C を行なう。 部分マルチライン。 | +| /m | \m | /S と /C と /D を行なう。完全マルチライン。 | ++--------+------+--------------------------------------------------------+ + + Note: + (A) オプション /iImM + (B) \c, \C, \m, \M + (C) (?i), (?I), (?m), (?M) + これらが同時に指定された場合、上の方が優先順位が高い。 + ちなみに、(?M) と (?m) は、ブラケットの中の \s には適用されません。 + +============================================================================== +10. マルチライン *eregex-multiline* + + とりあえず以下の表を見て。(^^;) ++-----+----------------------------------------------+--------------------+ +| Num | eregex.vim => vim regex | ruby regex | ++-----+----------------------------------------------+--------------------+ +| (1) | :M/a\s[^az].z/ => /a\s[^az].z/ | /a[ \t][^az\n].z/ | ++-----+----------------------------------------------+--------------------+ +| | :M/a\s[^az].z/S => /a[ \t\r\n^L][^az].z/ | /a\s[^az\n].z/ | +| | :M/a\s[^az].z/C => /a\s\_[^az].z/ | /a[ \t][^az].z/ | +| | :M/a\s[^az].z/D => /a\s[^az]\_.z/ | /a[ \t][^az\n].z/m | ++-----+----------------------------------------------+--------------------+ +| (2) | :M/a\s[^az].z/M => /a[ \t\r\n^L]\_[^az].z/ | /a\s[^az].z/ | +| (3) | :M/a\s[^az].z/m => /a[ \t\r\n^L]\_[^az]\_.z/ | /a\s[^az].z/m | ++-----+----------------------------------------------+--------------------+ + + (1) は、「文字クラス」が Vim 流。 + (2) は、「文字クラス」が Ruby 流。 + Vim 流に言えば、改行にマッチする所が増えたので、部分マルチライン。 + Ruby 流に言えば、マルチラインでない。よってオプションは大文字の M 。 + (3) は、いわゆる Ruby 流のマルチライン。 + + Note: + Vim の正規表現では、/[^az]/ は改行にマッチしません。 + 改行にマッチしないことを明示して /[^az\n]/ と書く必要はありません。 + /[^az\n]/ は意図に反して改行にもマッチします。 + よって、本来 /[^ \t\r\n^L]/ とするべきところを、/[^ \t\r^L]/ に + 変換している場合があります。 + 原則的に Vim では、[^...] の中に \n を書いてはいけません。 + +============================================================================== +11. デリミタの制限 *eregex-limitation-of-delimiter* + + :M で使える区切り文字は / だけです。 + :S 、:G および :V で使える区切り文字は /, #, @ です。 + これらの使用方法は :s 、:g 、:v と同じです。 + 制限も同様です。 + + 区切り文字を @ にするといろいろ制限があります。 + + 一見うまくいきそうに見えてダメな例。 + "foo@bar.baz.co.jp" を "foo@hoge.co.jp" に置換しようとして、 +> + :%s@\@foo\@hoge.co.jp@Ig +< + は、エラーです。 + Vim の正規表現で、\@ は特別な扱いを受けています。 +============================================================================== +12. Vim の正規表現について *eregex-about-vimregex* + + 以下 カーソルを "111,222,333" の行に置いて、:S... を実行してください。 + +(1)通常のサブマッチ。 + +111,222,333 +> + :S/(\d+),(\d+),(\d+)/\=submatch(1) + submatch(2) + submatch(3) +< +666 + +(2)Vim 独自機能。 + マッチデータ($&, &, matchdata) と、サブマッチを分離できます。 + \zs と \ze を使う。 See :h /\zs + +111,222,333 +> + :S/(\d+),\zs\d+\ze,(\d+)/\=submatch(1) + submatch(0) + submatch(2) +< +111,666,333 + + +(3) + 以下の方が分かりやすいかも。 + +111,222,333 +> + :S/(\d+),\zs(\d+)\ze,(\d+)/\=submatch(1) + submatch(2) + submatch(3) +< +111,666,333 + + \zs と \ze を使うと、マッチデータに含まれないサブマッチを操作できます。 + +(4) \_x の機能。 + + \u で [A-Z] を表す。 + \_u で [A-Z\n] を表す。 + \_[A-Z] は [A-Z\n] と同じ。 + + 大文字以外で改行を含む文字。 + \_U == \_[^A-Z] + + \_. は改行を含む任意の文字。 + + +(5) ^ と \_^ および $ と \_$ の違い。 + + $ を例にとります。 + + 通常 $ は + (1)正規表現の一番最後。 + (2) ) の直前。 + (3) | の直前。 + にある場合だけ行末を表す。 + + ところが任意の場所で行末を表せるのが \_$ 。 + +111,222,333 +> + :S/(\d+),(\d+),(\d+)\zs\_$\ze/\=',' . (submatch(1) + submatch(2) + submatch(3)) +< +111,222,333,666 + + ここで使っている \_$ の代わりに $ を使っても意図した結果になりません。 + Note: + \_^ と \_$ は perl の /m オプションとは全然違います。 + + +============================================================================== +13. Changes +revision 2.56 + (1) Add support for "?" + +revision 2.55 + (1) E2v() にバージョン番号や、sub-replace-special の置換を加えた。 + (2) \v を 0x0b に置換するようにした。 + (3) :M/pattern/ でマッチしなくても、@/ を更新した。 + +revision 2.35 + (1) オプション S,C,D,M,m の追加と変更。 + +revision 1.4x + (1) :S/\x2f/\\/g とかすると、:s///\\/g に変換してしまうバグ修正。 + (2) エスケープされたデリミタを検索履歴ではアンエスケープした。 + デリミタが '@' の場合を除く。 + (3) オプション m の修正。 + +revision 1.13 + :G で ! を使えるようにした。 + +revision 1.1.1.21 + :S の /c オプションで確認のプロンプトが見えなくなってしまう問題修正。 + +-- vim:ft=help: