vimを使用して、選択範囲内の各単語の最初の文字を大文字にします


83

vimでは、~この質問で述べたように)1つの文字を大文字にするために使用できることは知っていますが、vimを使用して選択範囲内の各単語の最初の文字を大文字にする方法はありますか?

たとえば、から変更したい場合

hello world from stackoverflow

Hello World From Stackoverflow

どのようにvimでそれを行うべきですか?


回答:


173

次の置換を使用できます。

s/\<./\u&/g
  • \< 単語の先頭に一致します
  • . 単語の最初の文字に一致します
  • \u 置換文字列の次の文字を大文字にするようにVimに指示します (&)
  • & LHSで一致したものを置き換えることを意味します

4
特に詳細を説明してくれてありがとう!
キーラー2013

私はこれを行う必要があり、何度も繰り返したマクロを使用しました。もっと良い方法が必要だとわかっていましたが、正規表現はありませんでした。これは素晴らしい。ありがとう。
Isaac Nequittepas 2016

4
ファイル全体でそれを行うには%s/\<./\u&/g
Gabriel BorgesOliveira19年

51

:help case 言う:

To turn one line into title caps, make every first letter of a word
uppercase: >
    : s/\v<(.)(\w*)/\u\1\L\2/g

説明:

:                      # Enter ex command line mode.

space                  # The space after the colon means that there is no
                       # address range i.e. line,line or % for entire
                       # file.

s/pattern/result/g     # The overall search and replace command uses
                       # forward slashes.  The g means to apply the
                       # change to every thing on the line. If there
                       # g is missing, then change just the first match
                       # is changed.

パターン部分はこの意味を持っています。

\v                     # Means to enter very magic mode.
<                      # Find the beginning of a word boundary.
(.)                    # The first () construct is a capture group. 
                       # Inside the () a single ., dot, means match any
                       #  character.
(\w*)                  # The second () capture group contains \w*. This
                       # means find one or more word caracters. \w* is
                       # shorthand for [a-zA-Z0-9_].

結果または置換部分には、次の意味があります。

\u                     # Means to uppercase the following character.
\1                     # Each () capture group is assigned a number
                       # from 1 to 9. \1 or back slash one says use what
                       # I captured in the first capture group.
\L                     # Means to lowercase all the following characters.
\2                     # Use the second capture group

結果:

ROPER STATE PARK
Roper State Park  

非常に魔法のモードの代替:

    : % s/\<\(.\)\(\w*\)/\u\1\L\2/g
    # Each capture group requires a backslash to enable their meta
    # character meaning i.e. "\(\)" verses "()".

3
これは私にとって最も興味深い答えでした。私は非常に魔法のモードを見たことがありませんでした。答えを理解した後、答えを文書化しようと思いました。
グレッグ

さらに、この回答はすべて小文字、すべて大文字、または大文字と小文字が混在する文字列を処理します。
グレッグ

この答えはMVPです
ニューアレクサンドリア

12

Vim Tips Wikiには、視覚的な選択を小文字、大文字、およびタイトル大文字に切り替えるTwiddleCaseマッピングがあります。

TwiddleCase関数をに追加する場合は.vimrc、目的のテキストを視覚的に選択し、チルダ文字~を押して各ケースを循環します。


2

この正規表現を試してください..

s/ \w/ \u&/g

私はを使用して答えが好きでしたが、&文字列文字列が最初から大文字と小文字が混在している場合、または最初からすべて大文字である場合は機能しません。
グレッグ

2

オプション1。-このマッピングはキーをマップしますqをしてカーソル位置の文字を大文字にし、次の単語の先頭に移動します。

:map q gUlw

これを使用するには、行の先頭にカーソルを置き、q単語ごとに1回押して、最初の文字を大文字にします。最初の文字をそのままにしておきたい場合は、w代わりにを押して次の単語に移動します。

オプション2。-このマッピングqは、カーソル位置で文字の大文字と小文字を反転するようにキーをマップし、次の単語の先頭に移動します。

:map q ~w

これを使用するには、q単語ごとに1回ヒットした行の先頭にカーソルを置き、最初の文字の大文字と小文字を逆にします。最初の文字をそのままにしておきたい場合は、w代わりにを押して次の単語に移動します。

マッピングのマッピングを解除します。-qキーに割り当てられたマッピングをマップ解除(削除)するには:

:unmap q

なぜ実際のマクロではなくマッピングなのか?qq~wqとリプレイの@q後に@@
D.ベンKnoble


0

変更を視覚的な選択に制限するには、次のようなものを使用する必要があります。

:'<,'>s/\%V\<.\%V/\u&/g

\%V ............... see help for this
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.