Zamień na wielką pierwszą literę każdego słowa w zaznaczeniu, używając vim

83

W vimie wiem, że możemy użyć ~dużej litery dla pojedynczego znaku (jak wspomniano w tym pytaniu ), ale czy istnieje sposób, aby pierwsza litera każdego słowa w zaznaczeniu była wielką literą za pomocą vim?

Na przykład, jeśli chciałbym zmienić

hello world from stackoverflow

do

Hello World From Stackoverflow

Jak mam to zrobić w vimie?

keelar
źródło
1
Można to również zrobić za pomocą sed
jpaugh

Odpowiedzi:

173

Możesz użyć następującej zamiany:

s/\<./\u&/g
  • \< dopasowuje początek słowa
  • . dopasowuje pierwszy znak słowa
  • \u nakazuje Vimowi wielkie litery w następnym znaku w łańcuchu podstawienia (&)
  • & oznacza zastąpienie wszystkiego, co zostało dopasowane na LHS
Rohit Jain
źródło
4
Dziękuję bardzo, szczególnie za wyjaśnienie każdego szczegółu!
keelar
Po prostu musiałem to zrobić i użyłem makra, które wielokrotnie powtarzałem i wiedziałem, że musi być lepszy sposób, ale nigdy nie pomyślałem o wyrażeniu regularnym. To jest świetne. Dzięki.
Isaac Nequittepas
4
zrobić to w całości%s/\<./\u&/g
Gabriel Borges Oliveira
51

:help case mówi:

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

Wyjaśnienie:

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

Część wzoru ma to znaczenie.

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

Wynik lub część zastępcza ma to znaczenie:

\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

Wynik:

ROPER STATE PARK
Roper State Park  

Alternatywa dla bardzo magicznego trybu:

    : % s/\<\(.\)\(\w*\)/\u\1\L\2/g
    # Each capture group requires a backslash to enable their meta
    # character meaning i.e. "\(\)" verses "()".
ernix
źródło
3
To była dla mnie najciekawsza odpowiedź. Nigdy nie widziałem bardzo magicznego trybu. Pomyślałem, że udokumentuję odpowiedź po jej zrozumieniu.
Greg
Ponadto ta odpowiedź obsługuje wszystkie małe i wielkie litery lub ciągi znaków mieszanych.
Greg
ta odpowiedź to MVP
New Alexandria
12

Vim Tips Wiki ma mapowanie TwiddleCase, które przełącza wizualny wybór na małe litery, WIELKIE LITERY i WIELKIE LITERY .

Jeśli dodasz TwiddleCasefunkcję do swojej .vimrc, po prostu wizualnie wybierz żądany tekst i naciśnij znak tyldy, ~aby przełączać się między przypadkami.

Ingo Karkat
źródło
2

Wypróbuj to wyrażenie regularne ...

s/ \w/ \u&/g
Kryszna
źródło
Podobała mi się odpowiedź z użyciem the, &ale nie działa, jeśli twój ciąg znaków ma na początku różne litery lub wszystkie wielkie litery.
Greg
2

Opcja 1. - To mapowanie mapuje klawiszqna wielką literę w pozycji kursora, a następnie przechodzi do początku następnego słowa:

: map q gUlw

Aby tego użyć, umieść kursor na początku linii i naciśnij qraz dla każdego słowa, aby pierwsza litera była wielka. Jeśli chcesz zostawić pierwszą literę tak, jak jest, naciśnij wzamiast tego, aby przejść do następnego słowa.

Opcja 2. - To mapowanie mapuje klawisz,qaby odwrócić wielkość liter w pozycji kursora, a następnie przenosi się na początek następnego słowa:

:map q ~w

Aby tego użyć, umieść kursor na początku trafionej linii qraz dla każdego słowa, aby odwrócić wielkość liter pierwszej litery. Jeśli chcesz zostawić pierwszą literę tak, jak jest, naciśnij wzamiast tego, aby przejść do następnego słowa.

Usuń mapowanie. - Aby usunąć mapowanie (usunąć) przypisane doqklawisza:

:unmap q
Michael
źródło
Dlaczego mapowanie, a nie rzeczywiste makro? qq~wqi powtórz, a @qnastępnie @@?
D. Ben Knoble
0

Aby ograniczyć modyfikację do selekcji wizualnej, musimy użyć czegoś takiego:

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

\%V ............... see help for this
SergioAraujo
źródło