2017-03-09 88 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