Kann Vim inkrementelle Zeilen schreiben? dh in jeder Zeile wird A zu B und 1 wird zu 2

8

Ich wollte das schreiben:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

Am Ende habe ich LibreCalc verwendet, die verschiedenen Teile in verschiedene Zellen eingefügt, die Buchstaben und Zahlen hinzugefügt, die Ergebnisse verkettet und das Los wieder in Vim eingefügt.

Ich schätze, dass das, was ich schreiben wollte, schrecklicher Code ist. Ich lerne gerade Python und habe versucht zu vermeiden, dass ich selbst Informationen finde, von denen ich weiß, dass sie später in dem Kurs, dem ich folge, behandelt werden ( http://interactivepython.org/ ).

Der schnellste Weg, dies in vim zu tun, war, so etwas zu tippen

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

Ich weiß, dass vim sehr mächtig ist (ich benutze es seit ein paar Wochen, genieße es wirklich).

Wäre es möglich gewesen, mit einem vim-Befehl zu schreiben, was ich wollte?

Duncan Betts
quelle

Antworten:

11

Wenn Sie eine sehr aktuelle Version von Vim haben (z. B. die in Arch Linux), können Sie g Ctrl-aeinen visuellen Block inkrementieren, obwohl dies mit Skripten möglich ist. In deinem Fall:

  1. Schreiben Sie die ursprüngliche Zeile: A = mapping[0] Esc
  2. Ziehe die Linie und lege 25 Kopien davon unten ab: yy25p
  3. Wählen Sie visuell die Spalte aus, die das 0Zeichen enthält (Blockauswahl, Verwenden von Ctrl-v), und schließen Sie das 0aus der ersten Zeile aus (so dass Sie eine Spalte mit den letzten 25 Nullen erhalten), und erhöhen Sie sie dann mit g Ctrl-a.
  4. Wenden Sie dieselbe Methode für die Spalte an, die enthält A.

( Hinweis : Wie Kommentare zeigen, müssen alphadie nrformatsOptionen erweitert werden, um Buchstaben inkrementieren zu können, z. B.: set nrformats+=alphaMein vimrc hat : set nrformats=hex,alpha, wodurch das oktale und binäre Inkrement deaktiviert wird, das ich nicht verwende.)

VanLaser
quelle
yy arbeitet nicht für mich. Ich kann auf dem Cheatsheet sehen, das ich von www.vimcheatsheet.com ausgedruckt habe, dass dies ein sehr Standardbefehl ist. vim --version gibt Folgendes zurück: pastebin.com/DcFxZh1S . Ich muss untersuchen, warum es bei mir nicht funktioniert ... (Ich habe es im visuellen Befehls- und Einfügemodus versucht). Auch wenn ich einfüge, erscheint alles in derselben Zeile. Allerdings habe ich g Strg-a ausprobiert und es macht genau das, was ich wollte, danke :)
Duncan Betts
1
:verbose map ysollte Ihnen zeigen, welche Zuordnungen mit yIhnen beginnen und wo sie festgelegt wurden. Sie müssen jedoch yyim normalen Modus verwenden.
VanLaser
1
Behoben
Duncan Betts
1
Was Version vimwird erhöht , Aum Bmit der Ctrl-aAktion? Meins definitiv nicht, und ich bin dran 7.4 1-1202.
Cory Klein
4
@CoryKlein Versuchen Sie zu tippen :set nrformats+=alpha. Es fügt der alphaOption den Wert hinzu 'nrformats'und sollte es ermöglichen Ctrl-a, alphabetische Zeichen zu "inkrementieren". Wenn Ihnen dieses Verhalten gefällt, können Sie es Ihrem vimrc hinzufügen. Andernfalls können Sie es der Option mit dem Operator hinzufügen +=und anschließend mit dem Operator -=( :set nrformats-=alpha) entfernen .
Saginaw
6

Ich bevorzuge die visuelle Inkrementlösung, die @VanLaser verwendet hat (siehe :h v_CTRL-A). Ich werde jedoch zeigen, dass dies auch über ein Makro möglich ist.

Beginnen mit:

A = mapping[0]

Notieren Sie die folgenden Tastendrücke in einem Makro Ihrer Wahl (z. B. q):

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

Dadurch wird die Zeile dupliziert und dann das erste Zeichen (z. B. A) und dann der Zahlenteil erhöht. Führen Sie dieses Makro 24 Mal aus und Sie sind fertig, z 24@q.

  • qq - Aufnahme in das Register starten q
  • yyp - Dupliziere die Zeile
  • :set nrformats+=alpha<cr>- 'nrformatshat nicht alphastandardmäßig
  • <c-a>- Mit können alphawir jetzt Buchstaben inkrementieren
  • :set nrformats-=alpha<cr>- entfernen alphavon'nrformats'
  • <c-a> - Erhöhen Sie die nächste Zahl
  • q - höre auf, aufzunehmen
  • 24@q- Makro q24 Mal im Register abspielen

Weitere Hilfe finden Sie unter:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Peter Rincker
quelle
Schön :) 25?
VanLaser
1
@ VanLaser: 1 (Startzeile) + 1 (Aufzeichnung des Makros) + 24 = 26.
Peter Rincker
4

Es wurden bereits gute Antworten gegeben, ich hätte nicht gedacht, dass ich so gut vorgehen würde. Ich hätte alle Buchstaben in einer einzelnen Zeile abgetippt und dann Text und Zeilenumbruch mit einer Ausdrucksersetzung (unter Verwendung der Zeilennummer als inkrementelle Nummer) eingeführt, so etwas wie

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
quelle
sehr cool ! (+1)
JJoao
2

Fast immer, wenn ich so etwas mache, entscheide ich mich für die Verwendung :substituteüber Makros. Insbesondere die Möglichkeit, den Ausdruck als Ersatz zu bewerten, \=macht es häufig möglich (siehe :h sub-replace-special).

Sobald Sie leere Zeilen an Ort und Stelle haben ( 25i<Enter><Esc>), können Sie den Befehl verwenden

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

Die erforderlichen Sequenzen werden unter Verwendung der aktuellen Zeilennummer ( '.'Argumentnummer) generiert, die von der Funktion zurückgegeben wird line(), und unter Verwendung von nr2char (), um Dezimalzahlen in ASCII-Äquivalente umzuwandeln (65 = A). Notwendige Zeichenfolgen werden mit verkettet.

Sakari Cajanus
quelle
1

Sie können jederzeit versuchen, das Betriebssystem zu verwenden ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
JJoao
quelle
1
Perl ist nicht im Betriebssystem.
Dash-Tom-Bang