Zapisuję tabelę przecen, która wygląda następująco:
| 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 |
Szukam sposobu, aby szybko obliczyć sumę trzeciej kolumny i wstawić ją do bufora. Rozwiązanie, które mam na myśli, wykorzystałoby tryb blokowania wizualnego (aby wybrać wszystkie liczby) i być może rejestr wyrażeń (aby wykonać matematykę).
Czy byłoby to możliwe przy użyciu natywnych poleceń Vima? Jeśli nie, czy istnieje wtyczka, która może mi pomóc?
visual-mode
arithmetic
zool
źródło
źródło
Odpowiedzi:
Napisałem wtyczkę: https://github.com/sk1418/HowMuch, która obsługuje selekcję wizualną i wykonuje obliczenia matematyczne.
Domyślnie wtyczka obsługuje trzy mechanizmy oceny wyrażeń matematycznych: Gnu bc, python i vimscript. Możesz wykonać obliczenia dla określonego lub pozwolić, aby wtyczka automatycznie wybrała jedno dla Ciebie.
Działa z twoim przykładem w następujący sposób:
Aby uzyskać szczegółowe informacje, przeczytaj README na github.
źródło
For details please read the README on github.
Nawet jeśli wprowadzę tutaj naciśnięcia klawiszy dla tego problemu, nie widzę, jak pomocny może być, to tylko 3 lub 4 kombinacje klawiszy. Jeśli ktoś naprawdę potrzebuje mojego skryptu, i tak sprawdzi szczegóły.Jeśli nie chcesz używać wtyczek ani upuszczać skrypt bash, możesz wykonać następujące czynności:
c-V {motions} "ay
skopiuj kolumnę do"a
:let @a = substitute(@a, 'c-V c-J', '+', 'g')
zamień kolumnę nowe wiersze na+
ic-R=c-Ra
uruchom zastąpiony"a
przez rejestr wyrażeńAlternatywnie: spraw, aby wpis historii wyrażeń był ponownie użyteczny dla dalszych sum kolumn
ctrl-V {motions} y
wstaw kolumnę do rejestru yank""
ictrl-R=eval(substitute(@", '\n', '+', 'g'))
Powtarzanie dla innej kolumny:
ctrl-V {motion} y
(bez zmian)ictrl-R=<CR>
lub jeśli zrobiłeś coś innego z rejestrem wyrażeń, przeglądaj historię za pomocą klawisza strzałki w górę (lub z,ctrl-P
jeśli go odwzorowałeś):ictrl-R=<up>...<up><CR>
źródło
"
zamiast pojedynczych cudzysłowów'
wsubstitute
poleceniu. Czy wiesz, czy jest tego jakiś powód?Wyjaśnienie:
Próbowałem funkcji, która działa tutaj:
Korzystając z powyższej mapy, wszystko co musisz zrobić po załadowaniu funkcji, to wybrać liczby, które chcesz zsumować i użyć,
<leader>s
aby zsumować wybrany obszar.Objaśnienie funkcji:
Używa
try/finally/endtry
ekstrakcji do wychwytywania błędów.Jeśli chcesz wypróbować tę funkcję, wykonaj następujące czynności: Skopiuj tę funkcję w przeglądarce i uruchom to polecenie na vimie,
:@+
co pozwoli ci:call SumVis()
normalnie korzystać .Musi dokonać wizualnego wyboru bloku za pomocą ctrl+ v, odznaczyć i wreszcie wywołać funkcję. Lub możesz użyć sugerowanej mapy, która sama usuwa zaznaczenie przed obliczeniem.
źródło
Moja wtyczka csv na to pozwala. Użyj
:SumCol
polecenia i koniecznie przeczytaj dokumentację.źródło
Tworzenie wtyczki lub kodowanie tego w vimscriptie wydaje się trochę ciężkie. Wierzę w vim bez wtyczek i dobrą kompozycję z zewnętrznymi narzędziami.
Oto jednorazowe polecenie oparte na użytkownikach 2571881, które działa, nawet jeśli bufor nie został zapisany.
Jeśli chcesz zapisać to polecenie do przyszłego użytku, możesz je nazwać:
Działa z selekcją wizualną. Jeśli wybierzesz kilka wierszy i przejdziesz do trybu komend, vim poprzedzi twoją komendę
:'<,'>
, która jest zakresem linii dla selekcji wizualnej. Możesz więc uruchomić:i będzie sumować tylko trzecią kolumnę wybranych wierszy. Domyślnie zakres jest
%
takizsumuje trzecią kolumnę wszystkich wierszy.
EDYCJA: Jeśli chcesz móc określić inne separatory pól i domyślnie kolumnę zliczoną do ostatniej, możesz przykryć polecenie
bash
i obsłużyć nim argumenty, w następujący sposób:Teraz,
policzy ostatnią kolumnę tabeli za pomocą „|” separatory pól,
policzy trzecią kolumnę tabeli za pomocą „|” separatory pól oraz
policzy trzecią kolumnę tabeli z separatorami pól „+”.
źródło
SumColumn
vimrc oznacza, że masz po prostu swoje „pluginy” w swoim vimrc. Mamy nadzieję, że jesteś dobry w utrzymywaniu tego z czasem. Dla mnie wtyczki zapewniają dokumentację, podział na znaczące części, korzystając z pomysłowości innych. Przyczyniam się do upstreamu, który ulepsza niesamowite wtyczki, których nikt nie ma czasu, aby stworzyć je wszystkie (z wyjątkiem tpope). Czy nie używasz vim-surround, vim-fugitive, vim-easy-align / vim-lion, vim-unimpaired, vim-commentary, ultisnips lub specyficznych dla ft, takich jak vim-go, vim-rails, vimtex?Jeśli kolumny są odpowiednio wyrównane, można to zrobić za pomocą prostego narzędzia oneliner.
CTRL-V
+ przesuń kursory
:echo eval(join(split(@", '\_s\+'), '+'))
który dzieli szarpany tekst na spacje i nowe wiersze, ponownie łączy element ze+
znakiem i ocenia ciąg.+
i oceń::echo eval(substitute(@", "\n", '+', 'g'))
-eval()
to najbliższa rzecz,reduce
jaką mamy.Jeśli nie, będziesz musiał użyć innych sztuczek, aby policzyć pola. Na przykład
split(getline('.'), "[ \t|]\\+")
można użyć do podzielenia kolumn z wiersza w tablicy. Odtąd staje się to tak proste, jak::echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))
Aby pozbyć się magicznych wartości (pole numer - 1, i
+
), może stać się poleceniemKtóre mogą być używane z:
Uwaga: tutaj używam lambd z Vim 7.4.1xxx
źródło
vmap
++
z wtyczkivmath
Damiana ConwayaZainstaluj wtyczkę z github (tylko 178 sloc) np
Dodaj mapowanie do swojego vimrc
Sugerowałbym jednak użyć czegoś innego, np
gA
2f|
kolumny i wybierz kolumnę w trybie wizualnego blokowania<C-V>G$
++
(lub wybrane mapowanie)s
)s
, np. Za pomocą"sp
Prezentację tej wtyczki można znaleźć w filmie na YouTube Damian Conway „More Natychmiast Better Vim” - OSCON 2013 (od 29 minuty).
źródło
Zewnętrzne narzędzie cli
csvstat
z csvkitKrótkie wyjaśnienie opcji
-d DELIMITER
Znak ograniczający wejściowy plik CSV. Tutaj|
.-H
Określ, że wejściowy plik CSV nie ma wiersza nagłówka.-c COLUMNS
Rozdzielona przecinkami lista indeksów lub nazw kolumn do zbadania. Domyślnie wszystkie kolumny.--sum
Tylko sumy wyjściowe.To narzędzie zapewnia także min., Maks., Średnią, medianę, odchylenie standardowe (odchylenie standardowe), zliczanie unikalnych wartości, listę częstych wartości.
Wstaw do pliku za pomocą
Instalacja
Na macOS csvkit jest dostępny przez homebrew oraz na Debian / Ubuntu i podobny, z którym można go zainstalować
$ sudo apt install csvkit
.źródło