Добавить время в буфере - PullRequest
       13

Добавить время в буфере

0 голосов
/ 30 августа 2011

Предположим, у меня есть буфер emacs, который содержит времена в формате минут 'секунд' и в формате минут ', а также секунд' ', например 5'30' ', 6'15' ', 10' и 1''.Можно ли автоматически добавлять все время в буфер с выводом (в минибуфере) в формате минут 'секунд' (здесь = 21'46 '')?

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Вы можете использовать:

(defun add-times ()
  (interactive)
  (save-excursion
    (let ((mins 0) (secs 0) 
          (accum-nums 
           (lambda (regexp)
             (let ((value 0))
               (beginning-of-buffer)
               (while (re-search-forward regexp nil t)
                 (setq value (+ value (string-to-int (match-string-no-properties 1)))))
               value))))
      (setq mins (funcall accum-nums "\\([0-9]+\\)'\\([^']\\|$\\)"))
      (setq secs (funcall accum-nums "\\([0-9]+\\)''"))
      ; adjust > 60 seconds
      (setq mins (+ mins (/ secs 60)))
      (setq secs (mod secs 60))
      (format "%d'%d''" mins secs))))

И вы можете использовать его следующим образом: В буфере файла со временем вы набираете ESC : и затем оцениваете:

(insert (add-times))

Если вам нужна функция, которая делает это тоже, запрашивая буфер:

(defun insert-add-times-to-buffer-at-point (buffer)
  (interactive "BBuffer to add and insert times: ")
  (with-current-buffer buffer
    (insert (add-times))))
1 голос
/ 31 августа 2011

Это то, что вы хотите?

(defun add-times ()                 
  (interactive)                                
  (let ((minutes 0) (seconds 0))     
    (save-excursion                        
      (goto-char (point-min))
      (while (re-search-forward "\\([0-9]+\\)'\\('\\)?" (point-max) t)
        (if (match-string 2)
            (setq seconds (+ seconds (string-to-number (match-string 1))))
          (setq minutes (+ minutes (string-to-number (match-string 1)))))))
    (insert (format "%d'%d''"(+ minutes (/ seconds 60)) (% seconds 60)))))
...