Ich schreibe eine Markdown-Tabelle auf, die so aussieht:
| 13/05/15 | 09:30-16:00 | 6.5 |
| 14/05/15 | 10:00-16:30 | 6.5 |
| 16/05/15 | 15:30-01:00 | 9.5 |
| 21/05/15 | 09:00-16:30 | 7.5 |
| 22/05/15 | 08:30-17:00 | 8.5 |
| 28/05/15 | 09:30-15:30 | 6 |
| 02/06/15 | 09:00-20:00 | 11 |
| 03/06/15 | 08:30-22:30 | 14 |
Ich suche nach einer Möglichkeit, die Summe der dritten Spalte schnell zu berechnen und sie in den Puffer einzufügen. Die Lösung, an die ich denke, würde den Visual-Block-Modus (zum Auswählen aller Zahlen) und möglicherweise das Ausdrucksregister (zum Berechnen) verwenden.
Wäre dies mit nativen Vim-Befehlen möglich? Wenn nicht, gibt es ein Plugin, das mir helfen kann?
visual-mode
arithmetic
zool
quelle
quelle
Antworten:
Ich habe ein Plugin geschrieben: https://github.com/sk1418/HowMuch, das die visuelle Auswahl unterstützt und mathematische Berechnungen durchführt.
Standardmäßig unterstützt das Plugin drei Bewertungsmodule für mathematische Ausdrücke: Gnu bc, Python und Vimscript. Sie können die Berechnungen für ein bestimmtes Plugin durchführen oder das Plugin automatisch eines für Sie auswählen lassen.
Es funktioniert mit Ihrem Beispiel so:
Für Details lesen Sie bitte die README auf Github.
quelle
For details please read the README on github.
Auch wenn ich die Tastenanschläge, die ich für dieses Problem gedrückt habe, hier eingebe , sehe ich nicht, wie hilfreich es sein könnte, es sind nur 3 oder 4 Tastenkombinationen. Wenn mein Skript wirklich von jemandem benötigt wird, wird er / sie die Details trotzdem überprüfen.Wenn Sie keine Plugins verwenden oder kein Bash-Skript verwenden möchten, können Sie Folgendes tun:
c-V {motions} "ay
Spalte kopieren in"a
:let @a = substitute(@a, 'c-V c-J', '+', 'g')
Ersetzen Sie die Spalten-Zeilenumbrüche durch+
ic-R=c-Ra
Führen Sie das Ersetzte"a
durch das Ausdrucksregister ausAlternativ: Machen Sie den Ausdrucksverlaufseintrag für weitere Spaltensummen wiederverwendbar
ctrl-V {motions} y
Spalte ins Ruckregister legen""
ictrl-R=eval(substitute(@", '\n', '+', 'g'))
Wiederholen für eine andere Spalte:
ctrl-V {motion} y
(unverändert)ictrl-R=<CR>
oder wenn Sie etwas anderes mit dem Ausdrucksregister gemacht haben,ctrl-P
blättern Sie mit der Aufwärtspfeiltaste durch den Verlauf (oder mit, wenn Sie ihn neu zugeordnet haben):ictrl-R=<up>...<up><CR>
quelle
"
anstelle von einfachen Anführungszeichen'
für densubstitute
Befehl verwenden. Wissen Sie, ob es dafür einen Grund gibt?Erläuterung:
Ich habe eine Funktion ausprobiert, die hier funktioniert:
Unter Verwendung der oben enthaltenen Karte müssen Sie nach dem Laden der Funktion nur die Zahlen auswählen, die Sie summieren möchten, und
<leader>s
den ausgewählten Bereich mit summieren.Funktionserklärung:
Es verwendet
try/finally/endtry
Extruktur, um Fehler zu erfassen.Wenn Sie diese Funktion ausprobieren möchten, gehen Sie wie folgt vor: Kopieren Sie diese Funktion in Ihren Browser und führen Sie diesen Befehl auf vim aus
:@+
, damit Sie sie:call SumVis()
normal verwenden können.Dazu muss man mit ctrl+ eine visuelle Blockauswahl treffen, die Auswahl vaufheben und schließlich die Funktion aufrufen. Alternativ können Sie die vorgeschlagene Karte verwenden, die die Auswahl vor der Berechnung entfernt.
quelle
Mein csv Plugin erlaubt dies. Verwenden Sie den
:SumCol
Befehl und lesen Sie die Dokumentation.quelle
Ein Plugin zu erstellen oder dies in Vimscript zu kodieren, scheint ein bisschen schwer. Ich glaube an ein Plugin-freies Vim und eine gute Komposition mit externen Tools.
Hier ist ein einmaliger Befehl, der auf dem Befehl user2571881 basiert und auch dann funktioniert, wenn der Puffer nicht gespeichert wurde.
Wenn Sie diesen Befehl für die zukünftige Verwendung speichern möchten, können Sie ihn benennen:
Es funktioniert mit visueller Auswahl. Wenn Sie einige Zeilen auswählen und in den Befehlsmodus wechseln, stellt vim Ihrem Befehl
:'<,'>
den Zeilenbereich für die visuelle Auswahl voran. So können Sie laufen:und es wird nur die 3. Spalte der ausgewählten Zeilen summiert. Standardmäßig ist der Bereich
%
alsosummiert die 3. Spalte aller Zeilen.
BEARBEITEN: Wenn Sie in der Lage sein möchten, andere Feldtrennzeichen anzugeben und die Spalte standardmäßig bis zur letzten gezählt zu haben, können Sie den Befehl abdecken
bash
und die Argumente damit behandeln, wie folgt:Jetzt,
zählt die letzte Spalte einer Tabelle mit "|" Feldtrennzeichen,
zählt die 3. Spalte einer Tabelle mit "|" Feldtrennzeichen und
zählt die 3. Spalte einer Tabelle mit "+" Feldtrennzeichen.
quelle
SumColumn
vimrc hinzuzufügen bedeutet, dass Sie einfach Ihre 'Plugins' in Ihrem vimrc haben. Hoffentlich sind Sie gut darin, dies mit der Zeit beizubehalten. Für mich liefern Plugins Dokumentation, Aufteilung in bedeutungsvolle Teile und nutzen den Einfallsreichtum anderer. Ich trage zum Upstream bei, der verblüffende Plugins verbessert, für die niemand Zeit hat, sie alle selbst zu erstellen (außer tpope). Verwenden Sie nicht Vim-Surround, Vim-Fugitive, Vim-Easy-Align / Vim-Lion, Vim-Unimpaired, Vim-Commentary, Ultisnips oder ft-spezifische wie Vim-Go, Vim-Rails, Vimtex?Wenn die Spalten richtig ausgerichtet sind, kann dies mit einem einfachen Einzeiler erfolgen.
CTRL-V
+ bewegen Sie den Cursory
:echo eval(join(split(@", '\_s\+'), '+'))
teilt den Text in Leerzeichen und neue Zeilen auf, setzt das Element wieder mit einem+
Zeichen zusammen und wertet die Zeichenfolge aus.+
und bewerten Sie::echo eval(substitute(@", "\n", '+', 'g'))
-eval()
ist das Nächste, wasreduce
wir haben.Wenn nicht, müssen Sie andere Tricks anwenden, um Felder zu zählen. Zum Beispiel
split(getline('.'), "[ \t|]\\+")
kann verwendet werden , um die Spalten aus einer Zeile in der Matrix zu spalten. Von dort wird es so einfach wie::echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))
Um die magischen Werte (Feldnummer - 1 und
+
) loszuwerden , kann es sich um einen Befehl handelnWelches kann verwendet werden mit:
Hinweis: Hier verwende ich Lambdas aus Vim 7.4.1xxx
quelle
vmap
++
vom Pluginvmath
von Damian ConwayInstallieren Sie das Plugin von Github (nur 178 Sloc) zB
Fügen Sie Ihrem vimrc eine Zuordnung hinzu
Ich würde jedoch vorschlagen, etwas anderes zu verwenden, z
gA
2f|
Spalte und wählen Sie die Spalte im Visual Block-Modus aus<C-V>G$
++
(oder Ihre gewählte Zuordnung)s
)s
, zB mit"sp
Eine Präsentation dieses Plugins finden Sie im YouTube-Video Damian Conway, "More Instantly Better Vim" - OSCON 2013 (ab Minute 29).
quelle
Externes CLI-Tool
csvstat
von CSVKITKurze Erläuterung der Optionen
-d DELIMITER
Begrenzungszeichen der CSV-Eingabedatei. Hier|
.-H
Geben Sie an, dass die CSV-Eingabedatei keine Kopfzeile enthält.-c COLUMNS
Eine durch Kommas getrennte Liste der zu untersuchenden Spaltenindizes oder Namen. Standardmäßig werden alle Spalten verwendet.--sum
Nur Ausgabesummen.Dieses Tool bietet auch Min, Max, Mittel, Median, Standardabweichung (Standardabweichung), eindeutige Zählwerte und eine Liste mit häufigen Werten.
In Datei einfügen mit
Installation
Unter macOS ist csvkit über Homebrew und unter Debian / Ubuntu verfügbar und kann mit ähnlichen Programmen installiert werden
$ sudo apt install csvkit
.quelle