Как заставить emacs считать приращение слов?

441
Nikana Reklawyks

Реализуя метод Мартини, я бы хотел посчитать количество слов, добавленных в файл с момента последней контрольной точки (скажем, каждый день).

Я думаю, я мог бы посчитать слова из более старой резервной версии, сосчитать слова в текущей версии и разницу, но похоже, что большая обработка бесполезна, и есть файлы, которыми нужно управлять.

Есть ли способ посчитать это по пути, то есть иметь прогрессивный счет, который учитывает все входные данные, и что я смог бы сбросить в любой момент?

Я не против, чтобы он умер между сессиями. Я рассматриваю возможную проблему с янкингом, но в основном я не имею представления о том, как обрабатывать ввод, а не о файлах.

2

2 ответа на вопрос

1
terdon

Вы должны иметь возможность вызывать функцию подсчета слов при первом открытии сеанса emacs и сохранять результат в переменной. Затем вы можете снова запустить команду подсчета слов и обработать результат, чтобы получить количество добавленных слов.

Я попробовал, но мой emacs-lisp foo жалок. Если вы более осведомлены и знакомы с emacs-lisp, чем я, вы сможете изменить эту функцию подсчета слов в соответствии со своими потребностями. Пожалуйста, напишите сюда, если вы делаете, я хотел бы посмотреть, как :).

Я получил эту функцию и некоторую другую полезную информацию со страницы подсчета слов в вики emacs .


Если приемлемо решение без emacs, попробуйте добавить следующие строки в ваш ~/.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!" } 

Теперь, когда вы начинаете работать, вы открываете свой файл для редактирования и сохраняете текущий счетчик слов ~/.countпримерно так:

start_count file.txt 

Когда вы хотите проверить свой прогресс, просто запустите:

show_progress file.txt 

Имейте в виду, что при этом управляющие последовательности LaTeX будут рассматриваться как слова, поэтому счет может быть не идеальным. Не знаю, как обойти это, хотя ...

Сегодня вечером я прочитаю более подробно, но это будет со свободным текстом в режиме org, последовательности LaTeX пока не будут проблемой. Более того, после того, как часть «update» управляется, я думаю, что будет легко заменить `wc` на некоторую функцию count-true-words-lost-in-markup` для любого языка разметки, для которого я видел несколько ответов уже существовал. Nikana Reklawyks 11 лет назад 0
Итак, * сегодня вечером * стало еще одним * как можно скорее *, но вот обновление: ·) Большое спасибо за ваши идеи. О, и благодаря этому мой elisp стал намного лучше сегодня вечером =) Nikana Reklawyks 11 лет назад 0
1
Nikana Reklawyks

Вот что я придумал, следуя идеям Тердона .

Я очень доволен этим, он делает то, что хотел, через несколько файлов в my-martini-filesпеременной.

Редактировать: Был добавлен временный счетчик, который позволяет составлять прогресс и иногда сбрасывать счетчик, чтобы не принимать тяжелые копии / вставки, которые не должны добавлять слова во внимание для достигнутого прогресса.

Я привязал его к f4отчету, C-f4чтобы заново инициализировать счетчик (файлов), S-f4чтобы отслеживать прогресс и C-S-f4начинать новый день, все считается на 0.

Причуды теперь состоят в том, чтобы интегрировать их в модельную линию, но это другой вопрос.

;; 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)

Любые комментарии или предложения по улучшению кода приветствуются.