Großschreibung des ersten Buchstabens jedes Wortes in einer Auswahl mit vim

82

In vim weiß ich, dass wir verwenden können ~ ein einzelnes Zeichen großschreiben können (wie in dieser Frage erwähnt ), aber gibt es eine Möglichkeit, den ersten Buchstaben jedes Wortes in einer Auswahl mit vim groß zu schreiben?

Zum Beispiel, wenn ich von ändern möchte

hello world from stackoverflow

zu

Hello World From Stackoverflow

Wie soll ich das in vim machen?

Kielar
quelle
1
Kann auch mit sed
jpaugh

Antworten:

173

Sie können die folgende Ersetzung verwenden:

s/\<./\u&/g
  • \< entspricht dem Wortanfang
  • . entspricht dem ersten Zeichen eines Wortes
  • \u Weist Vim an, das folgende Zeichen in der Ersetzungszeichenfolge in Großbuchstaben zu schreiben (&)
  • & bedeutet Ersatz, was auch immer auf der LHS abgestimmt wurde
Rohit Jain
quelle
4
Vielen Dank, vor allem für die Erklärung jedes Details!
Kielar
Ich musste dies nur tun und ein Makro verwenden, das ich zu oft wiederholte, und ich wusste, dass es einen besseren Weg geben musste, aber ich dachte nie an Regex. Das ist toll. Vielen Dank.
Isaac Nequittepas
4
um es in der gesamten Datei zu tun%s/\<./\u&/g
Gabriel Borges Oliveira
51

:help case sagt:

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

Erläuterung:

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

Der Musterteil hat diese Bedeutung.

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

Das Ergebnis oder der Ersatzteil hat folgende Bedeutung:

\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

Ergebnis:

ROPER STATE PARK
Roper State Park  

Eine Alternative zum sehr magischen Modus:

    : % s/\<\(.\)\(\w*\)/\u\1\L\2/g
    # Each capture group requires a backslash to enable their meta
    # character meaning i.e. "\(\)" verses "()".
ernix
quelle
3
Dies war die interessanteste Antwort für mich. Ich hatte den magischen Modus noch nie gesehen. Ich dachte, ich würde die Antwort dokumentieren, nachdem ich die Antwort verstanden hatte.
Greg
Darüber hinaus behandelt diese Antwort alle Klein-, Groß- oder Großbuchstaben.
Greg
Diese Antwort ist die MVP
New Alexandria
12

Das Vim Tips Wiki verfügt über eine TwiddleCase-Zuordnung , mit der die visuelle Auswahl auf Kleinbuchstaben, Großbuchstaben und Groß- und Kleinschreibung umgeschaltet werden kann.

Wenn Sie die TwiddleCaseFunktion zu Ihrer hinzufügen .vimrc, wählen Sie einfach visuell den gewünschten Text aus und drücken das Tilde-Zeichen, ~um durch die einzelnen Fälle zu blättern.

Ingo Karkat
quelle
2

Versuchen Sie diese Regex ..

s/ \w/ \u&/g
Krishna
quelle
Ich mochte die Antwort mit der Verwendung von, &aber es funktioniert nicht, wenn Ihre Zeichenfolge zunächst in Groß- oder Kleinschreibung oder zunächst in Großbuchstaben geschrieben ist.
Greg
2

Option 1. - Diese Zuordnung ordnet den Schlüssel zuq zum Großschreiben des Buchstabens an der Cursorposition zu und bewegt sich dann zum Anfang des nächsten Wortes:

: map q gUlw

Um dies zu verwenden, setzen Sie den Cursor an den Anfang der Zeile und drücken Sie qeinmal für jedes Wort, um den ersten Buchstaben groß zu schreiben. Wenn Sie den ersten Buchstaben so lassen möchten, wie er ist, drücken Sie wstattdessen, um zum nächsten Wort zu gelangen.

Option 2. - Diese Zuordnung ordnet die Tasteqzu, um die Groß- und Kleinschreibung des Buchstabens an der Cursorposition umzukehren, und bewegt sich dann zum Anfang des nächsten Wortes:

:map q ~w

Um dies zu verwenden, setzen Sie den Cursor qfür jedes Wort einmal an den Anfang der Zeile , um die Groß- und Kleinschreibung des ersten Buchstabens umzukehren. Wenn Sie den ersten Buchstaben so lassen möchten, wie er ist, drücken Sie wstattdessen, um zum nächsten Wort zu gelangen.

Zuordnung aufheben. - So heben Sie die Zuordnung (Löschung) der demqSchlüsselzugewiesenen Zuordnung auf:

:unmap q
Michael
quelle
Warum ein Mapping und kein eigentliches Makro? qq~wqund wiederholen mit @qgefolgt von @@?
D. Ben Knoble