Capitalize first letter of each word in a selection using vim

前端 未结 6 2445
抹茶落季
抹茶落季 2020-12-12 13:13

In vim, I know we can use ~ to capitalize a single char (as mentioned in this question), but is there a way to capitalize the first letter of each word in a sel

6条回答
  •  长情又很酷
    2020-12-12 13:21

    :help case says:

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

    Explanation:

    :                      # 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.
    

    The pattern portion has this meaning.

    \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_].
    

    The result or replacement portion has this meaning:

    \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
    

    Result:

    ROPER STATE PARK
    Roper State Park  
    

    An alternate to the very magic mode:

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

提交回复
热议问题