2013-07-03 20 views

risposta

103

È possibile utilizzare la seguente sostituzione:

s/\<./\u&/g 
  • \< corrisponde l'inizio di una parola
  • . corrisponde al primo carattere di una parola
  • \u dice a Vim in maiuscolo il carattere successivo in la stringa di sostituzione (&)
  • & significa sostituto qualunque è stato abbinato sul lato sinistro
+2

Grazie mille, soprattutto per la spiegazione di ogni dettaglio! – keelar

+0

@keelar. Prego :) –

+0

Ho dovuto farlo e ho usato una macro che ho sovra-ripetuto e sapevo che ci doveva essere un modo migliore ma non ho mai pensato di regex. È grandioso Grazie. –

24

:help case dice:

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

Spiegazione:

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

La porzione di modello ha questo significato.

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

Il risultato o parte di ricambio ha questo significato:

\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 

Risultato:

ROPER STATE PARK 
Roper State Park 

alternativa alle modalità molto magica:

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

Questa è stata la risposta più interessante per me. Non avevo mai visto la modalità molto magica. Ho pensato di documentare la risposta dopo aver capito la risposta. – Greg

+0

Inoltre, questa risposta gestisce tutte le stringhe minuscole, tutte maiuscole o miste. – Greg

9

Il Tips Vim Wiki ha un TwiddleCase mapping che alterna la selezione visiva in minuscole, MAIUSCOLE e Caso titolo.

Se si aggiunge la funzione TwiddleCase al proprio .vimrc, è sufficiente selezionare visivamente il testo desiderato e premere il carattere tilde ~ per scorrere ciascun caso.

2

Prova Questa espressione regolare ..

s/ \w/ \u&/g 
+0

Mi è piaciuta la risposta con l'uso di '&' ma non funziona se la stringa della stringa è composta da maiuscole o minuscole per iniziare. – Greg

1

V'è anche l'utilissimo vim-titlecase plug-in per questo.

+0

Grazie. Smart Title Case funziona bene anche con Sublime Text. https://github.com/mattstevens/sublime-titlecase –