Wie kann ich Wörter in einem Makro in camelCase konvertieren?

14

Ich habe eine Liste von Wörtern, wie folgt:

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

Ich brauche eine Möglichkeit, zum Beispiel camel casein camelCaseein Makro zu verwandeln (oder eine Möglichkeit, jede Zeile einer visuellen Zeilenauswahl in einen Kamelkasten zu verwandeln).

Ich könnte so etwas wie wgUlhxso oft wie nötig benutzen , aber das Problem ist, dass dies nicht für Wörter unterschiedlicher Länge funktioniert (so wgUlhxwgUlhxwürde es zum Beispiel funktionieren, convert this pleaseaber nicht für convert these pretty please).

Die gewünschte Ausgabe für die obigen Zeilen wäre

theseAre
some
wordsThatIWant
toConvertTo
camelCase

Gibt es eine Möglichkeit, dies zu automatisieren?

Türknauf
quelle

Antworten:

16

Ein Einzeiler

Ich habe einen einfachen regulären Ausdruck als Ersatz gefunden (vorausgesetzt, 'magic' ist gesetzt):

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

Dies entspricht einem einzelnen Buchstaben nach einem Leerzeichen und speichert den Buchstaben. Anschließend wird es für jede Übereinstimmung in der Zeile durch den gespeicherten Großbuchstaben ( \u= Großbuchstaben, \1= erste gespeicherte Übereinstimmung) ersetzt.

Bewerben Sie sich über die gesamte Datei, indem Sie ein %zwischen :und setzen s.

Der Nachteil dieser Lösung ist, dass sie zeilenweise ist (was für Ihre Beispiele funktioniert), aber zu kurz greifen würde, wenn Sie nur ein paar Wörter aus vielen innerhalb einer Zeile herausfinden möchten.

Eine umfassendere Lösung

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

Dadurch wird ein neuer Bediener erstellt, der eine Bewegung ausführen kann. Wenn Sie <leader>als haben \, dann geben Sie den folgenden Text ein (mit |als Cursor):

This is some |example text to work with.

Tippen \g~3wgibt

This is some exampleTextTo work with.

Das heißt, wir haben 3 Wörter in Kamelhüllen geschrieben.

Beschreibung dieser Ersetzung:

s/Startet die Substitution.
\%>'\[ist ein bisschen schmerzhaft. Das \%>'msagt, um rechts von einer Marke zu passen. Wir wollen Zeichen [, aber das muss auch in diesem Muster ausgeblendet werden. Dies startet also das Spiel nach der Bewegung, die der Bediener erhalten hat.
\([a-zA-Z\)ist das gleiche wie ab dem Einzeiler oben.
\%<']Dies ist das andere Ende, das vor dem Ende der Bewegung übereinstimmt.
/\u\1/gist der Ersatz vom oben genannten Einzeiler.

John O'M.
quelle
Eigentlich ist das kein Makro, sondern ein Einzeiler, aber Sie können es einer Tastenkombination zuordnen.
John O'M.
Es wurde eine Operator-Version hinzugefügt. Funktioniert etwas besser.
John O'M.
Ich denke, es ist in Ordnung, wenn Ihre Antwort kein spezielles Makro verwendet. Der Fragesteller stellte meiner Meinung nach ein XY-Problem .
tommcdo
@tommcdo Ja, du hast recht; Es muss kein tatsächliches Makro sein. Es muss nur eine Art automatisierte Methode sein.
Türknauf
12

Als Alternative verwende ich das Vim-Abolish- Plugin, das eine Zwangsfunktion bietet:

Möchten Sie biegen fooBarin foo_bar? Presse crs(coerce zu snake_case). MixedCase ( crm), camelCase ( crc), snake_case ( crs) und UPPER_CASE ( cru) sind nur drei Tastatureingaben entfernt. Diese Befehle unterstützen repeat.vim .

Sukima
quelle
2
+1, weil es immer ein Plugin von Tim Pope gibt, von dem ich nichts wusste.
Zool
5

Sie können ein rekursives Makro erstellen, das dies für eine einzelne Zeile mit den folgenden Tastenanschlägen ausführt:

qqqqqf xgUl@qq

(Beachten Sie, dass das Leerzeichen zwischen dem fund dem xein Tippen auf die Leertaste und keine Pause ist.)

Im Detail:

  1. Löschen Sie das q-Register. Dies ist notwendig, da wir ein rekursives Makro erstellen. (Siehe Schritt 5.):qqq

  2. Starten Sie die Aufzeichnung eines Makros in Register q: qq

  3. Sie können die wBewegung hier nicht verwenden , da das Makro am Ende der Zeile abgebrochen werden soll, anstatt zur nächsten Zeile zu springen. Springen Sie stattdessen zum nächsten Leerzeichen in der Zeile, indem Sie die fTaste gefolgt von der Leertaste drücken :f<space>

  4. Löschen Sie das Leerzeichen und schreiben Sie den folgenden Buchstaben in Großbuchstaben: xgUl

  5. Recurse. Da wir das qRegister in Schritt 1 geleert haben, ist noch nichts darin, und dies wird nichts bewirken:@q

  6. Speichern Sie das Makro: q

Sie können dieses Makro dann auf mehrere Zeilen anwenden, indem Sie einen Bereich verwenden:

Wenden Sie das Makro auf jede Zeile in der Datei an:

:%normal @q

Wenden Sie das Makro auf die Zeilen 2 bis 5 an:

:2,5normal @q

Treffen Sie eine visuelle Auswahl, und geben Sie dann ein :normal @q. Dadurch wird die Befehlszeile vorab ausgefüllt, wenn Sie die :Taste drücken. Dies führt zu einem Befehl, der das Makro auf jede Zeile in der Auswahl anwendet:

:'<,'>normal @a
Reich
quelle
Es ist nicht erforderlich , das qRegister zu löschen, qqgenau wie dies, bevor mit der Aufzeichnung von Tastenanschlägen begonnen wird. Genau deshalb qqqfunktioniert das Löschen des qRegisters :)
tommcdo
Wenn Sie etwas tun, das das Anhängen an das qRegister (dh das Verwenden qQ) erfordert, ist es wahrscheinlich erforderlich, es zuerst zu löschen .
tommcdo
2
@tommcdo Das stimmt definitiv nicht in meiner Kopie von Vim. (Vim 7.3.87, aufgerufen mit vim -u NONE). Die vorhandenen Inhalte werden nur dann gelöscht, wenn Sie speichern das Register, das in Schritt 6 Clearing aus dem Register , bevor Sie damit beginnen , ist notwendig , wenn Sie rekursiv möchten.
Rich
@tommcdo Ich habe die Antwort aktualisiert, um klarer zu machen, warum dieser Schritt erforderlich ist.
Rich
Mein Fehler, ich habe da irgendwie die Waffe gesprungen. Hervorragende Klarstellung!
tommcdo
1

Siehe http://vim.wikia.com/wiki/Changing_case_with_regular_expressions Hier werden die \ U, \ L, \ u, \ l-Modifikatoren ganz klar und prägnant erklärt!

Sein Wesen ist das Folgende:

In manchen Fällen möchten Sie möglicherweise eine Datei durchgehen und die Groß- und Kleinschreibung von Zeichen ändern, die bestimmten Kriterien entsprechen. Wenn Sie reguläre Ausdrücke gut verstehen, können Sie dies ziemlich einfach tun.

Es ist so einfach, \ U oder \ L vor die Rückverweise zu setzen, deren Groß- / Kleinschreibung Sie ändern möchten, und \ E am Ende. Vim schreibt den Text in Groß- oder Kleinbuchstaben. Verwenden Sie \ u und \ l (ohne das \ E am Ende), um nur die Groß- und Kleinschreibung des allerersten Zeichens in der Rückbeziehung zu ändern.

(Ein "Rückverweis" ist ein Teil eines regulären Ausdrucks, der sich auf einen vorherigen Teil eines regulären Ausdrucks bezieht. Die häufigsten Rückverweise sind &, \ 1, \ 2, \ 3, ..., \ 9).

Einige Beispiele, die die Leistungsfähigkeit dieser Technik demonstrieren:

Kleinschreibung der gesamten Datei

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

(& ist eine praktische Rückreferenz, die sich auf den vollständigen Text der Übereinstimmung bezieht.)

Großschreibung aller Wörter, denen ein <vorangestellt ist (dh HTML-Tag-Namen öffnen):

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

Beachten Sie auch die Befehle gu und gU.

Zum Beispiel wird mit ggguG die gesamte Datei in Kleinbuchstaben geschrieben. (gg = nach oben gehen, gu = Kleinbuchstaben, G = nach EOF gehen).

Indem Sie das \ 0-General-Backref anstelle der Namen-Backref (\ 1, \ 2 usw.) verwenden, können Sie einige Eingaben für die Ersetzungszeilengruppe des regulären Ausdrucks speichern.

Diese Regex-Großbuchstaben bestehen aus einer expliziten Menge von Wörtern, die in einer Datei in Großbuchstaben geschrieben werden:

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

Keine Raketenwissenschaft, aber sonst müsstest du Folgendes tun:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g
Luke Kendall
quelle
1
Können Sie bitte den Artikel, den Sie in Ihrer Antwort erwähnt haben, zusammenfassen?
EvergreenTree
Wir sehen uns? Es ist sehr wichtig, dass diese Site einige Jahre später mit gelöschten Links voll ist, wenn Antworten auf einzelne Links in Ordnung wären. Wenn Sie jedoch nur einen wichtigen Teil des Links kopieren, auf den Sie verweisen, und auch den Link angeben, über den das OP weitere Informationen erhalten kann, ist dies in Ordnung.
peterh