如何让 emacs 计算单词的增量?

如何让 emacs 计算单词的增量?

实施马提尼方法,我想计算自上次检查点(比如说,每天)以来添加到文件的单词数。

我想我可以计算一下旧备份版本的单词数、计算一下当前版本中的单词数以及差异,但听起来很多处理都是没用的,而且还需要管理一些文件。

有没有办法在途中计算这个,即是否有一个将所有输入都考虑在内的渐进计数,并且我可以在任何时候重置?

我不介意它在会话之间死机。我认为 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)

非常欢迎任何有关改进代码的评论或建议。

相关内容