Jak nagrywać dane z klawiatury, aby wykonywać na niej statystyki?

12

Chciałbym dowiedzieć się, jakie są najczęstsze wzorce, których używam podczas kodowania. Więc szukam sposobu na nagranie wszystkich danych z klawiatury, gdy jestem w vimie, najlepiej ze znacznikami czasu. Następnie mógłbym przeprowadzić analizę ostatnio używanych wzorców / ruchów, o której godzinie podejmuje się działanie, i znaleźć rzeczy do optymalizacji.

Czy jest jakiś idiomatyczny sposób, aby to zrobić w Vimie? Czy mam do tego napisać wtyczkę? Jakie byłyby implikacje wydajnościowe zrobienia czegoś takiego?

Dzięki

6D65
źródło
1
Powinieneś zacząć patrzeć na -wflagę, kiedy zaczynasz vima. Za jego pomocą możesz nagrywać każde naciśnięcie klawisza.
nobe4
4
Powiązany post na blogu ( link ). Pokazuje, jak zapisać dane wejściowe ( vim -w file.log) i udostępnia skrypt haskell do parsowania pliku w osobne polecenia, które można następnie przeanalizować. Brak znaczników czasu.
tokoyami
Dziękuję @ Nobe4, wygląda to na przydatne i prawie szukałem. Nadal zastanawiam się, czy czas można w jakiś sposób zebrać. Może nie znaczniki czasu, ale różnice czasowe między naciśnięciami klawiszy. Może to pomóc w ustaleniu prędkości.
6D65
Właściwie to było pytanie dla was obu. To po prostu nie pozwoliło mi wyszczególnić wzmianek w jednym komentarzu.
6D65
Oto pomysł, jak uchwycić znacznik czasu: Użyj następującego skryptu i wywołaj vim w ten sposób: vim -w <(./test-io.py > log)( vim -w <(tee raw-log | ./test-io.py > log)jeśli chcesz również surowego wyjścia) ( tylko * nix ). To powinno zapisać wszystkie dane wejściowe ze znacznikami czasu, po jednym bajcie na wiersz log. Zauważyłem, że vim nie wypisuje poleceń jeden po drugim, ale je opróżnia.
tokoyami

Odpowiedzi:

4

Vim zezwala na rejestrowanie wszystkich danych wejściowych po przekazaniu -wopcji wiersza poleceń z plikiem:

-w {scriptout} Wszystkie wpisane znaki są zapisywane w pliku {scriptout}, dopóki nie wyjdziesz z Vima. Jest to przydatne, jeśli chcesz utworzyć plik skryptu, który będzie używany z „vim -s” lub „: source!”. Jeśli plik {scriptout} istnieje, znaki są dodawane.

Teraz, gdy mamy dostęp do danych wejściowych, możemy przekierować je tam, gdzie chcemy. Na przykład następujący sposób ( tylko systemy * nix ):

vim -w >(./timestamper.py > log)
vim -w >(tee raw-log | ./timestamper.py > log) # If we want the raw log, too

Gdzie timestamper.pyjest następujący krótki skrypt Pythona:

#!/usr/bin/env python

import sys
import datetime

while True:
    if (sys.stdin.closed):
        sys.stdout.write("Input closed\n")
        break

    a = sys.stdin.read(1)
    if (not a):
        break
    sys.stdout.write("[{}]: {}\n".format(datetime.datetime.now(), a))

Skrypt można zastąpić dowolnym innym programem, który pobiera dane, jeśli chcesz zrobić coś bardziej zaawansowanego.

UWAGA: Po kilku krótkich testach odkryłem, że vim wydaje bufor danych wejściowych, które opróżnia w pewnym momencie i przy wyjściu. To sprawia, że ​​znaczniki czasu są dość niewiarygodne.

tokoyami
źródło
Tak. Zastanawiam się, czy mógłbym podnieść w tym względzie kwestię neovimów. Może faceci są zainteresowani udostępnieniem tej funkcji. Albo mógłbym najpierw zanurkować w głowę i spróbować załatać ją sam, jeśli jest to dozwolone, ale prawdopodobnie nie będę miał czasu.
6D65
@ 6D65 Myślę, że możesz zasugerować projektowi neovim funkcję dziennika debugowania danych wejściowych, w której każde wejście użytkownika jest oznaczone znacznikiem czasu. Często widziałem, jak tymczasowo łatają kod, aby próbować debugować :terminalproblemy związane z danymi wejściowymi, więc powinna to być przydatna funkcja. Nie znam ich interfejsu API zdalnej wtyczki, ale może to również mieć jakiś sposób na uzyskanie danych wejściowych w czasie rzeczywistym.
tokoyami
1
Lub nie rób tego w Vimie - użyj logera klawiatury systemowej (uruchomionego / zatrzymanego z Vima) i przeanalizuj to wyjście.
VanLaser,