Переменная `last-command 'в Emacs Lisp - PullRequest
1 голос
/ 08 октября 2011

Я написал фрагмент, чтобы скопировать предыдущую строку в точку, если я повторю команду, она скопирует больше предыдущей строки. Это здесь:

    (defun my-copy-line (num)
      "copy lines"
      (interactive "p")
      (save-excursion
        (move-end-of-line 1)
        (push-mark)
        (move-beginning-of-line num)
        (kill-ring-save (point) (mark))))


(defvar copy-line-num 1)
(defun my-copy-line-here (num)
  "copy line ahead here"
  (interactive "p")
  (if (eq this-command last-command)
      (setq copy-line-num (+ copy-line-num num)) ;count num lines up
    (setq copy-line-default 1))
  (save-excursion
    (save-excursion                     ;make current line blank
      (move-beginning-of-line 1)
      (push-mark)
      (move-end-of-line 1)
      (kill-region (point) (mark)))     ;不用kill-line,以免删除空白行
    (push-mark)
    (previous-line copy-line-num)
    (my-copy-line 1)
    (exchange-point-and-mark)
    (yank))
  (setq this-command 'my-copy-line-here))

Я намеревался восстановить предыдущую строку, чтобы переопределить текущую строку. Если я повторю my-copy-line-here, я восстановлю 2-ю предыдущую строку, это выполняется с помощью теста (if (eq this-command last-command). Но это не удалось, потому что каждый раз после выполнения my-copy-line-here, он устанавливает last-command на yank, вместо my-copy-line-here. Я просто не могу понять, что происходит. Мне нужна ваша помощь.

1 Ответ

2 голосов
/ 08 октября 2011

`My (yank-pop) работает аналогично, вставляя предыдущие скопированные строки при повторных вызовах.Проверяя его источники, я вижу два различия с вашим:

; explicit check for yank 
(if (not (eq last-command 'yank))

; setting this command
(setq this-command 'yank)

Возможно, один или оба из них вместе могут быть полезны.Установите this-command после вызова yank возможно?

...