Come posso convertire parole in camelCase in una macro?


14

Ho un elenco di parole, come questo:

these are
some
words that I want
to convert to
camel case

Ho bisogno di un modo per trasformarmi, ad esempio, camel casein camelCaseuna macro (o un modo per trasformare ogni linea di una selezione di linea visiva in un caso di cammello).

Potrei usare qualcosa come wgUlhxtutte le volte che è necessario, ma il problema è che questo non funziona con parole di varia lunghezza (quindi, per esempio, wgUlhxwgUlhxfunzionerebbe per convert this pleasema non per convert these pretty please).

L'output desiderato per le righe sopra sarebbe

theseAre
some
wordsThatIWant
toConvertTo
camelCase

C'è un modo per automatizzare questo?

Risposte:


16

A One Liner

Ho trovato una semplice sostituzione di espressioni regolari (supponendo che sia impostata la 'magia'):

:s/ \([a-zA-Z]\)/\u\1/g

Questo corrisponde a qualsiasi singola lettera dopo uno spazio, salvando la lettera. Quindi, lo sostituisce con la lettera salvata resa maiuscola ( \u= maiuscola, \1= prima corrispondenza salvata), per ogni corrispondenza nella riga.

Applicare per tutto il file mettendo un %tra il :e s.

Il rovescio della medaglia di questa soluzione è che è lineare (che funziona per i tuoi esempi), ma fallirebbe se volessi solo nascondere alcune parole su molte all'interno di una riga.

Una soluzione più completa

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

Questo crea un nuovo operatore che può operare su un movimento. Se hai <leader>come \, quindi inserisci il seguente testo (con |come cursore):

This is some |example text to work with.

Dare \g~3w

This is some exampleTextTo work with.

Cioè, abbiamo cammello racchiuso in 3 parole.

Descrizione di tale sostituzione:

s/inizia la sostituzione.
\%>'\[è un po 'doloroso. Il \%>'mdice di abbinare alla destra di un segno. Vogliamo un segno [, ma anche questo deve essere sfuggito a questo schema. Quindi, questo inizia la partita dopo il movimento dato all'operatore.
\([a-zA-Z\)è uguale a quello della riga superiore sopra.
\%<']questa è l'altra estremità, corrispondente prima della fine del movimento.
/\u\1/gè il rimontaggio dal rivestimento di cui sopra.


In realtà, questa non è una macro tanto quanto è una riga, ma è possibile mapparla su una combinazione di tasti.
John O'M.

Aggiunta una versione dell'operatore per farlo. Funziona un po 'meglio.
John O'M.

Penso che vada bene se la tua risposta non utilizza specificamente una macro; il richiedente ha presentato un problema XY , secondo me.
Tommaso,

@tommcdo Sì, hai ragione; non deve essere una macro reale. Deve solo essere una specie di metodo automatizzato.
Doorknob,

12

In alternativa, utilizzo il plug -in vim-abolish che offre una funzione di coercizione:

Vuoi trasformarti fooBarin foo_bar? Premi crs(costringi a snake_case). MixedCase ( crm), camelCase ( crc), snake_case ( crs) e UPPER_CASE ( cru) sono tutti a soli 3 sequenze di tasti. Questi comandi supportano repeat.vim .


2
+1 perché c'è sempre un plugin di Tim Pope che non conoscevo.
zool

5

È possibile creare una macro ricorsiva che lo fa per una singola riga con i seguenti tasti:

qqqqqf xgUl@qq

(Notare che lo spazio tra la fe la xè un tocco della barra spaziatrice, non una pausa)

In dettaglio:

  1. Cancella il registro q. Ciò è necessario perché stiamo creando una macro ricorsiva. (Vedi passaggio 5.):qqq

  2. Inizia a registrare una macro nel registro q: qq

  3. Non puoi usare il wmovimento qui, perché vuoi che la macro si interrompa quando arriva alla fine della linea, piuttosto che saltare alla linea successiva. Invece, passa al successivo carattere spaziale sulla linea premendo il ftasto seguito dalla barra spaziatrice:f<space>

  4. Elimina lo spazio e la lettera maiuscola: xgUl

  5. Ricorso. Poiché abbiamo cancellato il qregistro nel passaggio 1, non c'è ancora nulla in esso, quindi questo non farà nulla:@q

  6. Salva la macro: q

È quindi possibile applicare questa macro a più righe utilizzando un intervallo:

Applica la macro a ogni riga del file:

:%normal @q

Applicare la macro alle righe 2–5 incluse:

:2,5normal @q

Fai una selezione visiva, quindi digita :normal @q. Questo pre-popolerà la riga di comando quando si preme il :tasto, risultando in un comando che applica la macro a ogni riga nella selezione:

:'<,'>normal @a

Non è necessario cancellare il qregistro, così come qqprima che inizi a registrare le battiture. In effetti, è proprio per questo che qqqfunziona per cancellare il qregistro :)
tommcdo

Naturalmente, se stavi facendo qualcosa che richiedeva l' aggiunta al qregistro (cioè l'utilizzo qQ), probabilmente sarebbe necessario cancellarlo prima.
Tommaso,

2
@tommcdo Questo non è assolutamente vero nella mia copia di Vim. (Vim 7.3.87, invocato con vim -u NONE). I contenuti esistenti vengono cancellati solo quando si salva il registro, al punto 6. È quindi necessario cancellare il registro prima di iniziare se si desidera ricorrere.
Ricco

@tommcdo Ho aggiornato la risposta per rendere più chiaro il motivo per cui questo passaggio è necessario.
Ricco

Errore mio, ho saltato la pistola lì. Chiarimento eccellente!
Tommaso,

1

Vedi http://vim.wikia.com/wiki/Changing_case_with_regular_expressions Spiega i modificatori \ U, \ L, \ u, \ l in modo abbastanza chiaro e succinto!

La sua essenza è la seguente:

Ci sono momenti in cui potresti voler esaminare un file e cambiare il caso di caratteri che soddisfano alcuni criteri arbitrari. Se capisci bene le espressioni regolari, puoi farlo abbastanza facilmente.

È semplice come posizionare \ U o \ L davanti a riferimenti indietro di cui si desidera cambiare il caso e, alla fine, \ E. Vim renderà il testo in backreference maiuscolo o minuscolo (rispettivamente). Usa \ u e \ l (senza \ E alla fine) per cambiare il caso del primissimo carattere nel backreference.

(Un "backreference" è una parte di un'espressione regolare che fa riferimento a una parte precedente di un'espressione regolare. I riferimenti più comuni sono &, \ 1, \ 2, \ 3, ..., \ 9).

Alcuni esempi che dimostrano il potere di questa tecnica:

Minuscolo l'intero file

:% S /.*/ \ L & / g

(& è un utile riferimento che fa riferimento al testo completo della corrispondenza.)

Maiuscole tutte le parole precedute da un <(ovvero apertura dei nomi dei tag HTML):

:%s/<\(\w*\)/<\U\1/g

Nota anche i comandi gu e gU.

Ad esempio, ggguG metterà in minuscolo l'intero file. (gg = vai all'inizio, gu = lettere minuscole, G = vai a EOF).

Usando il backref generale \ 0 anziché quelli di nome (\ 1, \ 2 ecc.) Puoi salvare un po 'di battitura per sostituire la stanza del regex.

Questo regex mette in maiuscolo un insieme esplicito di parole in maiuscolo in un file:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

Non scienza missilistica, ma altrimenti dovresti farlo:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
Puoi riassumere l'articolo che hai citato nella tua risposta?
EvergreenTree

Ci vediamo? È molto importante, se le risposte a link singolo andranno bene, alcuni anni dopo questo sito sarebbe pieno di link eliminati. Ma se copi solo una parte importante del link a cui fai riferimento e fornisci anche il link in cui l'OP può ottenere ulteriori informazioni, va bene.
Peter - Ripristina Monica l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.