みんな大きくなあれ

文字列をすべて大文字 Uppercase にしたい時.

:'<,'>s/\w/\U\0/g

勿論これは方法のひとつ.他にも幾つかある.

先日,ドキュメント内に散在する特定の文字列の塊,例えば単語や変数など,を一発一括で大文字にしたい,と思ったの切っ掛けでした.

~ とか gU とかじゃなく,検索置換で一発ってやつの

小文字 lowercase を大文字 uppercase にする方法について調べると,選択範囲内およびカーソルの下の大文字/小文字をスウィッチする方法,~ とか gUgu ばかり.

そーじゃないっ*1

って事で,ここに落としとくことに.

The lively history of Jack & the beanstalk 37131013236575
The lively history of Jack & the beanstalk 37131013236575 / Toronto Public Library Special Collections


やり方は色々

冒頭でも述べました通り,同じ結果を導くための方法は,上に示した以外にも.あります.

例えば.

冒頭例の \w の部分は,今回の「(小文字を) 大文字にしたい」の “小文字を” の意味合いを,より厳格明示的に,[a-z] と指定してもよいでしょうし,
“大文字に” にあたる部分*2の,\U\0\0 は “マッチした文字列それ自身で置き換えるもの” と言う意味で次のように & を指定してやってもよいでしょう.;

:%s/[a-z]/\U&/g


「と言うか,[a-z] なら,それこそ...」と,文字クラス\l 使ったのだって良いでしょうし.;

:'<,'>s/\l/\U&/g

「いやいや,パターンとして小文字どうこうは結局どうでもよくてさ」的に,こんな引っ掛け方をしたってもまた同じ結果を導くことができるかと思います.
次の例は “小文字にする” の文脈なので,\L の部分は \U になりますが.;

:%s/.*/\L&/


と.厚かましくも公のスペース使ってくどくどと書き散らかしましたが,要は置き換え先としての辺に \U を指定する,というお話です.

今回参考にさせて頂いたのはこちら.;

» 『vim-jp » Hack #166: ローマ字の大文字/小文字を変換する
» 『Changing case with regular expressions | Vim Tips Wiki | Fandom powered by Wikia
» 『How to convert all text to lowercase in Vim - Stack Overflow
» 『Vi(m) tip #3: convert document to lowercase or uppercase « Alec’s Web Log
» 『Vim - Convert text to lowercase or uppercase (Example)


皆さま,ほんっと感謝.

して,いつもの.
こっから長くなりますよ.いつもの通り.

ここから最後までは,読み飛ばしていただいても構わない内容だと思ってます.

今回新たに知ったこと,何か良く分からなかったこと

晒しますよ.

ここからは,こちらにあった次の例を引用した上で話を進めようかと思います.;

:s/\w\+/\u\0/g
"bram moolenaar""Bram Moolenaar"

ご覧の通りキャピタライズ,って言って良いの?,での例です.

これ見て :h \u とヘルプ叩いて斜めに読んでは,「ははぁ~ん」という事で入力したのがコチラ.
結果もご一緒に.

:s/\w/\u/g
"bram moolenaar"" "

これは凹みますね笑.さすがに.

何を分かっていなかったか.

:s での置き換え {string} としての \u は “次の文字が大文字になる".で,検索 / パターン {pattern} マッチにおける文字クラス \u,"大文字英字” とは異なる

のね.

確かに \s とかそういうのあるもんな,とは思ったのですが,今更ながらも改めて認識し.

検索の際の文字クラスとしての \u は知っていたので,当然のように置き換え先として \u を充てたのですが,これが間違い.

表記上同じ \u でも,両者では扱いが異なるんだって.

うん,やっぱこう言うの嫌い.紛らわしい.

ちなみに,ヘルプ読んでいて,どう捉えたら良いか分からなくて腑に落ちないのですが,\u 等の一連の指定方法って,
pattern の検索のキーワードとして,つまり :s および検索コマンド /{pattern} としては,'文字クラス‘,もしくは ’定義済み文字範囲‘ 等と称し,
一方,change は :substitute の置き換え先として,{string} として使用する場合は,(置換コマンドで使える) 'フラグ’ と言うの? ですか?

って読み方で正しい?

正直.素人目に言って,素人だからのですが,内容のアウトライン,分かり難過ぎませんこと? 特に,置換の方.

[4. 複雑な変更 complex-change > 4.1 フィルタコマンド filter > 4.2 置換 :substitute] の下に,[置換コマンドで使えるフラグ:] ってあって,そこで何の前触れ(?)なく突如 “magic nomagic 作用” と出てくるのだもの.

よくわかんないです.

そんなこんなで,上のような過ち :s/\w/\u/g"bram moolenaar" → " " だって言う,を経て,参照先の 置き換える側 {string}\u\0\0 が気になって :h \0 叩いて初めて,"パターンマッチとしての \u“ と "置き換えとしての \u” の違いを知るのでした.

      \0   マッチしたパターン全体に置き換わる                        "\0" "s/\0"
      : 略
      \u   次の文字が大文字になる                                    "s/\u"
      \U   後に続く文字が (\e まで) 大文字になる                     "s/\U"
      \l   次の文字が小文字になる                                    "s/\l"
      \L   後に続く文字が (\e まで) 小文字になる                     "s/\L"
      \e   \u, \u, \l, \l の終わり ( note: <esc> の意味ではない!)   "s/\e"
      \E   \u, \u, \l, \l の終わり                                   "s/\E"
via. :h \0


で,上述引用の通り,置換側の \uハイパーリンクを見て舌打ちをしました,とさ.

s/\u って,誰が想像つきますの?
度々遭遇するコレに,その都度,心が病みます.

ヘルプ 《\u 次の文字が大文字になる》 の “次の文字” ってのは,コマンドラインでの話.バッファのコンテンツとかを指しての話じゃない.

いや.今となっては,だいぶ可笑しなこと言っているのは分かるのですが.

このヘルプで言う《次の文字》とは,"コマンドラインでの \u の次に書いた(指定した)文字" という意味.

:s/\w\+/\u\0/g
"bram moolenaar""Bram Moolenaar"

具体的にいつもの例で言いますと,指している “次の文字” とは :s/\w\+/\u\0/g\0 のこと.
イメージとして,\u は後ろで指定した \0 を修飾 (大文字に) している,と言った感じ?

う~ん...
{string} の側の \u を,文字クラス としての \u の感覚で捉え,それに頭が引っ張っていかれてた,と言うのがそもそもの誤りとは言え,「大文字に置き換えたいな」な回路で入って来た人に,"次の文字が大文字になる" って文章表現で説明されたら,人はどのようにイメージするかなぁ*3

ちょっと信じがたい恥ずかしい話,ヘルプの記述を目にして,《次の文字》の捉え方に中々自信が持てなくて,ちょっと苦しみました.

ちなみに今一つ.\u が相手にするのは,後ろの 1 文字だけ,ということ.

対して,\U は複数を相手にします.

ヘルプ \U では《後に続く文字が (\E まで) 大文字になる》とあります.

ここで「\E って何さ」って話.

\U (\L) で使う.\E と打ってやるとこまで大文字 (小文字) 化を続けてくれる.

これを見て.;

For example, assume a line with the text “This is a test”.
sh :s/\(test\)/\U\1 file/
produces: This is a TEST FILE
sh :s/\(test\)/\U\1\e file/
produces: This is a TEST file

2 つ目の例で,置き換え側 \U\1\e file\e があります.

このこと.

「大文字にして.」と言う \U により,その後ろ \1 にあたる “test” の箇所までが大文字になっています.

\e が現れるまでの箇所まで.

「また小面倒臭いことなのか」と構えたのですが,思ったより原始的な話でした.笑

「何で \e\E,用意されてるんだよ」と気にはなったのですが,あんまり意味無いっぽい."んなもんなんだっ,て" という事で.

backreferences? “後方参照” と言うものだと.\1\2 とかって言うアレのことでした

先のエントリを読んでいて「?」と思ったもの.

「また知らないの出てきた」と思ってキッとしたのですが,置換で個人的には良く使う \1 \2 の事だということで.

“to” の部分には “\2” と “\1” が指定されています。これは後方参照というものです。
“( )” で囲まれた部分にマッチしたテキストを参照しています。

しかし書いたな,おい.

はい,おしまい.

*1:ドキュメント内,四方八方好き勝手に散らばる文字列を,ひとつひとつ探して移動して選択して...と言うのは幾らなんでも,ということです.

*2:ヘルプでは ‘{string}’ と言ってますね.

*3:もちろん英語,日本語という言語の要因も重いでしょうが.