Как заставить emacs считать приращение слов?
Реализуя метод Мартини, я бы хотел посчитать количество слов, добавленных в файл с момента последней контрольной точки (скажем, каждый день).
Полагаю, я мог бы подсчитать слова из более старой резервной версии, сосчитать слова в текущей версии и разницу, но похоже, что большая обработка бесполезна, и есть файлы, которыми нужно управлять.
Есть ли способ посчитать это по пути, то есть иметь прогрессивный счет, который учитывает все входные данные, и что я смог бы сбросить в любой момент?
Я не против умирать между сессиями. Я рассматриваю возможную проблему с янкингом, но в основном я не имею представления о том, как обрабатывать ввод, а не о файлах.
2 ответа
Вот что я придумал, следуя идеям Тердона.
Я очень доволен этим, он делает то, что хотел, через несколько файлов в my-martini-files
переменная.
Редактировать: Был добавлен временный счетчик, который позволяет составлять прогресс и иногда сбрасывать счетчик, чтобы не принимать тяжелые копии / вставки, которые не должны добавлять слова во внимание для достигнутого прогресса.
Я привязал его к f4 для отчета, C-f4 для повторной инициализации счетчика (файлов), S-f4 для стека прогресса и CS-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)
Любые комментарии или предложения по улучшению кода приветствуются.
Вы должны иметь возможность вызывать функцию подсчета слов при первом открытии сеанса 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 будут рассматриваться как слова, поэтому счет может быть не идеальным. Не знаю, как обойти это, хотя...