Wie kann man Emacs eine Zunahme von Wörtern zählen lassen?

480
Nikana Reklawyks

Bei der Implementierung der Martini-Methode möchte ich die Anzahl der Wörter zählen, die seit dem letzten Prüfpunkt (z. B. jeden Tag) zu einer Datei hinzugefügt wurden.

Ich denke, ich könnte die Wörter einer älteren gesicherten Version zählen, die Wörter in der aktuellen Version und den Unterschied zählen, aber es hört sich an, als wäre viel Verarbeitung nutzlos, und es gibt Dateien, die im Weg stehen.

Gibt es eine Möglichkeit, dies auf dem Weg zu zählen, dh eine progressive Zählung, die alle Eingaben berücksichtigt, und die ich jederzeit zurücksetzen könnte?

Es macht mir nichts aus, dass es zwischen den Sitzungen stirbt. Ich sehe Ruckeln als ein mögliches Problem an, aber meistens habe ich keine Ahnung, wie die Eingabe verarbeitet werden soll, und nicht als Dateiunterschiede.

2

2 Antworten auf die Frage

1
terdon

Sie sollten in der Lage sein, eine Word-Count-Funktion aufzurufen, wenn Sie eine Emacs-Sitzung zum ersten Mal öffnen und das Ergebnis in einer Variablen speichern. Anschließend können Sie den Befehl zur Wortzählung erneut ausführen und das Ergebnis verarbeiten, um die Anzahl der hinzugefügten Wörter zu erhalten.

Ich habe es versucht, aber mein Emacs-Lisp-Foo ist erbärmlich. Wenn Sie sich mit emacs-lisp besser auskennen und sich mit ihm auskennen als ich, sollten Sie die Funktion zum Zählen von Wörtern an Ihre Bedürfnisse anpassen können. Bitte schreibe hier zurück, wenn du es tust, ich würde gerne sehen wie :).

Ich habe die Funktion und einige andere nützliche Informationen von der Emacs-Wiki-Wortzahlseite erhalten .


Wenn eine Lösung ohne Emacs akzeptabel ist, können Sie versuchen, diese Zeilen zu folgenden Zeilen hinzuzufügen ~/.bashrc:

function start_count(){ wc -w $1 | cut -f 1 -d" " > ~/.count;  emacs $1 } function show_progress(){ p=`cat ~/.count`;  c=`wc -w $1 | cut -f 1 -d" "`;  echo "You have written "$(($c-$p))" words today!" } 

Wenn Sie nun mit der Arbeit beginnen, öffnen Sie Ihre Datei zur Bearbeitung und speichern die aktuelle Wortzahl ~/.countwie folgt:

start_count file.txt 

Wenn Sie Ihren Fortschritt überprüfen möchten, führen Sie einfach Folgendes aus:

show_progress file.txt 

Beachten Sie, dass dies LaTeX-Kontrollsequenzen als Wörter behandelt, sodass die Zählung möglicherweise nicht perfekt ist. Ich weiß nicht, wie man das umgehen kann ...

Ich werde es heute Abend ausführlicher lesen, aber das geht im Org-Modus mit Freitext, LaTeX-Sequenzen werden vorerst kein Thema sein. Wenn der Update-Teil erst einmal fertig ist, sollte es wohl leicht sein, "wc" durch eine Funktion "count-true-words-lost-in-markup" für jede Auszeichnungssprache zu ersetzen, für die ich einige Antworten gefunden habe existierte bereits. Nikana Reklawyks vor 11 Jahren 0
Ok so * heute Nacht * wurde noch eine weitere * so schnell wie möglich *, aber hier ist das Update: ·) Vielen Dank für Ihre Ideen. Oh, und mein Elisp ist heute Abend viel besser geworden =) Nikana Reklawyks vor 11 Jahren 0
1
Nikana Reklawyks

Das Folgende ist, worauf ich gekommen bin, den Ideen von Terdon folgend .

Ich bin ziemlich zufrieden damit, es macht, was ich wollte, über ein paar Dateien in der my-martini-filesVariablen.

Bearbeiten: Es wurde eine temporäre Zählung hinzugefügt, die es erlaubt, den Fortschritt zu stapeln und trotzdem die Zählung zurückzusetzen, um nicht zu starkes Kopieren / Einfügen zu verwenden, das keine Wörter für den erreichten Fortschritt berücksichtigen sollte.

Ich habe es f4für einen Bericht gebunden, C-f4um die Zählung (von Dateien) neu zu initialisieren, den S-f4Fortschritt des Stapels zu stapeln und C-S-f4um einen neuen Tag zu beginnen, alle Zählungen auf 0.

Fantasie würde jetzt darin bestehen, sie in die Modeline zu integrieren, aber das ist eine andere Sache.

;; Teh Martini method (require 'wc) ; The file terdon links to. (defun wc-in-buffer (file) "Return the number of words in the buffer opening the file passed as an argument. It should already be open." (with-current-buffer (get-file-buffer file) (wc-non-interactive (point-min) (point-max))) ) (defun my-martini-sum () "Sum words over my-martini-files." (apply '+  (loop for file in my-martini-files collect (wc-in-buffer file))) ) (setq my-martini-files '("~/path/to/file.org" "~/path/to/another/file.org" ;; Taken from org-agenda-files ))

(defun my-martini-update () "Update my-martini-count from files." (interactive) (setq my-martini-count (my-martini-sum)) (message "Files lengths updated.")) (defun my-martini-reset () "Reset counts and stack for a new day." (interactive) (my-martini-update) (setq my-martini-stack 0) (message "Martini counts re-initialized.")) (defun my-martini-stack () "Stack the current progress, and update. To be used before pasting loads of unsignificant words." (interactive) (setq my-martini-stack (+ my-martini-stack (- (my-martini-sum) my-martini-count))) (message "Current count is stacked. Mess at will, just update afterwards.") ) (defun my-martini-report () "Display changes in total word count since last update." (interactive) (message (concat "As for now, " (number-to-string (+ my-martini-stack (- (my-martini-sum) my-martini-count))) " new words have been added today.")) ) (global-set-key [f4] 'my-martini-report) (global-set-key [\C-f4] 'my-martini-update) (global-set-key [\S-f4] 'my-martini-stack) (global-set-key [\C-\S-f4] 'my-martini-reset)

Kommentare oder Vorschläge zur Verbesserung des Codes sind herzlich willkommen.