![如何让 emacs 计算单词的增量?](https://linux22.com/image/1341014/%E5%A6%82%E4%BD%95%E8%AE%A9%20emacs%20%E8%AE%A1%E7%AE%97%E5%8D%95%E8%AF%8D%E7%9A%84%E5%A2%9E%E9%87%8F%EF%BC%9F.png)
实施马提尼方法,我想计算自上次检查点(比如说,每天)以来添加到文件的单词数。
我想我可以计算一下旧备份版本的单词数、计算一下当前版本中的单词数以及差异,但听起来很多处理都是没用的,而且还需要管理一些文件。
有没有办法在途中计算这个,即是否有一个将所有输入都考虑在内的渐进计数,并且我可以在任何时候重置?
我不介意它在会话之间死机。我认为 yanking 可能是一个问题,但大多数情况下我不知道如何处理输入而不是文件差异。
答案1
您应该能够在第一次打开 emacs 会话时调用字数统计函数并将结果保存到变量中。然后,您可以再次运行字数统计命令并处理结果以获取添加的单词数。
我试过了,但我的 emacs-lisp foo 太差了。如果你比我更了解 emacs-lisp,并且更熟悉,你应该可以编辑这个字数统计功能以满足您的需求。如果您愿意,请在此处回复,我想看看如何操作 :)。
我从中获得了该功能和其他一些有用的信息emacs wiki 字数统计页面。
如果可以接受无 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 控制序列视为单词,因此计数可能不准确。不过不知道如何解决这个问题...
答案2
以下是我想到的terdon 的想法。
我对它非常满意,它按照我的要求对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)
非常欢迎任何有关改进代码的评论或建议。