“最后一个命令';Emacs Lisp中的变量

“最后一个命令';Emacs Lisp中的变量,emacs,elisp,Emacs,Elisp,我编写了一个代码段,将前一行复制到点,如果我重复该命令,它将复制更多的前一行。在这里: (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 (

我编写了一个代码段,将前一行复制到点,如果我重复该命令,它将复制更多的前一行。在这里:

    (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))
我打算猛拉上一行以覆盖当前行。如果我在此处重复我的复制行,我将猛拉上一行的第2行,这是通过测试
(If(eq this command last command)完成的
。但它失败了,因为每次执行
我在这里的复制行
,它都会将
最后一个命令
设置为
yank
,而不是
我在这里的复制行
。我就是搞不清楚发生了什么。我需要你的帮助。

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

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

也许这两者中的一个或两个都是有用的。在调用<代码> YANK < /代码>之后,设置<代码>这个命令也许,

嗨,你应该考虑把你以前的问题的答案标记为“被接受”。所以其他人会更倾向于帮助你。判断答案的正确性是每个人回馈so社区的一部分。谢谢你,你的方法成功了。但实际上,真正让我困惑的是何时显式设置
这个命令
变量?因为当你从某个命令返回时,Emacs会自动设置它,它eems不适用于我的情况。我在Elisp手册中找到了这一点。`一些命令在执行过程中设置此变量,作为下一步运行的任何命令的标志。特别是,终止文本的函数将
此命令设置为
终止区域',以便紧跟其后的任何终止命令都知道将终止的文本附加到pr“以前的杀戮.`我认为美国佬就是属于这种类型的。