Como o emacs conta um incremento de palavras?


2

Implementando o método Martini , gostaria de contar o número de palavras adicionadas a um arquivo desde o último ponto de verificação (digamos, todos os dias).

Eu acho que eu poderia contar as palavras de uma versão de backup mais antiga, contar as palavras na versão atual e a diferença, mas parece que muito processamento é inútil, e há arquivos para gerenciar no caminho.

Existe uma maneira de contar isso no caminho, ou seja, ter uma contagem progressiva que leve em consideração todas as entradas e que eu seria capaz de redefinir a qualquer momento?

Eu não me importo de morrer entre as sessões. Eu vejo o yanking como um possível problema, mas principalmente eu não tenho idéia sobre como processar a entrada em vez de diferenciar arquivos.

Respostas:


1

Você deve ser capaz de chamar uma função de contagem de palavras na primeira vez que abrir uma sessão do emacs e salvar o resultado em uma variável. Em seguida, você pode executar o comando de contagem de palavras novamente e processar o resultado para obter o número de palavras adicionadas.

Eu dei uma chance, mas o meu foo emacs-lisp é lamentável. Se você é mais conhecedor e confortável com o emacs-lisp do que eu, você deve ser capaz de editar esta função de contagem de palavras para atender às suas necessidades. Por favor, poste de volta aqui se você quiser, eu gostaria de ver como :).

Eu tenho a função e algumas outras informações úteis da página de contagem de palavras do wiki emacs .


Se uma solução sem emacs for aceitável, você pode tentar adicionar essas linhas ao seu ~/.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!"
}

Agora, quando você começar a trabalhar, abra seu arquivo para edição e salve sua contagem de palavras atual da seguinte ~/.countforma:

start_count file.txt

Quando quiser verificar seu progresso, basta executar:

show_progress file.txt

Tenha em mente que isso tratará as sequências de controle do LaTeX como palavras, de modo que a contagem pode não ser perfeita. Não sei como contornar isso embora ...


Vou ler mais detalhadamente esta noite, mas isso vai com texto livre no modo de organização, as sequências de LaTeX não serão um problema por enquanto. Além disso, uma vez que a parte de “atualização” é gerenciada, eu acho que deve ser fácil de substituir wcpor alguma count-true-words-lost-in-markupfunção para qualquer linguagem de marcação, para a qual eu vi algumas respostas já existiam.
Nikana Reklawyks

Ok, então esta noite tornou-se ainda outro o mais cedo possível , mas aqui está a atualização: ·) Muito obrigado por suas idéias. Ah, e meu elisp ficou muito melhor hoje à noite graças a isso =)
Nikana Reklawyks

1

A seguir é o que eu fiz, seguindo as idéias de Terdon .

Estou muito feliz com isso, ele faz o que eu queria, ao longo de alguns arquivos na my-martini-filesvariável.

Editar: Uma contagem temporária foi adicionada, o que permite empilhar o progresso, e ainda redefine a contagem às vezes, para não usar cópias / colagens pesadas que não devem adicionar palavras ao progresso alcançado.

Liguei f4para um relatório, C-f4reinicializei a contagem (de arquivos), S-f4para empilhar o progresso e, C-S-f4para começar um novo dia, todas contagens em 0.

A fantasia consistiria agora em integrá-lo à modelina, mas isso é outro assunto.

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

Quaisquer comentários ou sugestões para melhorar o código são bem-vindos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.