2017-03-09 120 views
1

我写了一个elisp函数来复制当前行,如果没有选择区域,但它不适用于emacs 24.5。当我点击“M-w”键击时,在小缓冲区中出现“Mark set”消息。我错过了什么?这个elisp函数有什么问题?

(defun copy-region-or-current-line (beg end) 
    "copy current if no region selected, copy the region otherwise" 
    (interactive "r") 
    (let ((cur-pos (point))) 
    (if (region-active-p) 
     (kill-ring-save beg end) 
     (progn 
     (kill-whole-line) 
     (yank) 
     (goto-char cur-pos))))) 
(global-set-key (kbd "M-w") 'copy-region-or-current-line) 

回答

0

你的函数的工作原理:你打电话yank和该命令设置标志;因此消息。

虽然这是一个无疑并不想要的副作用,并且kill + yank序列不是必需的。

您已经知道kill-ring-save,所以请使用(line-beginning-position)(line-end-position)

仅供参考,考虑可选区域参数kill-ring-save,你可以重写此为:

(defun copy-region-or-current-line() 
    "Copy the active region or the current line to the kill ring." 
    (interactive) 
    (if (region-active-p) 
     (kill-ring-save nil nil t) 
    (kill-ring-save (line-beginning-position) (line-end-position)))) 
+0

作为一般的注脚,许多交互式命令不建议作为功能在自己的elisp打电话,是考虑的这些副作用 - 命令执行某些事情(如设置标记)是常见的,这些事情在交互式上下文中很有用,但并非真正需要的。在某些情况下,命令的文档字符串会指出您应该使用什么,因此很好意识到这一点。 – phils