как использовать макрос клавиатуры в функции LISP, пока он не потерпит неудачу - PullRequest
1 голос
/ 18 мая 2011

сейчас у меня есть клавиатурный макрос, определенный и названный, и я хочу сделать функцию lisp, которая переходит в верхнюю часть буфера и выполняет:

i = 1
do{
    run macro
    if macro hit the end of the buffer, break out of the loop
    insert i
    i++
}while(true)

вот что находится в моем .emacs

(fset 'next-id
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([19 73 68 61 34 13 67108896 19 34 13 2 23] 0 "%d")) arg)))
(global-set-key (kbd "C-x n") 'next-id)

как мне поступить?

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Srsly. Вот как это сделать: C-u 0 F4

2 голосов
/ 18 мая 2011

Это должно сработать:

(defun apply-macro-to-buffer (&optional macro)
  "Apply last keyboard macro to the buffer"
  (interactive "CEnter the name of the macro to apply: ")
  (or macro
      (progn
        (if (null last-kbd-macro)
            (error "No keyboard macro has been defined"))
        (setq macro last-kbd-macro)))
  (let ((end-marker (copy-marker (point-max)))
        (i 1))
    (save-excursion
      (goto-char (point-min))
      (while (and  (< (point) end-marker))
        (let ((mark-active nil))
          (execute-kbd-macro macro))
        (insert (format "%d\n" i))
        (setq i (1+ i))))))

Чтобы сделать то же самое для обычной команды, попробуйте это:

(defun apply-command-to-buffer (command)
  "Apply a command to the buffer"
  (interactive "CEnter the name of the command to apply: ")
  (let ((end-marker (copy-marker (point-max)))
        (i 1))
    (save-excursion
      (goto-char (point-min))
      (while (and  (< (point) end-marker))
        (call-interactively command)
        (insert (format "%d\n" i))
        (setq i (1+ i))))))
...