Что не так с этой функцией elisp?

Я пишу функцию elisp для копирования текущей строки, если ни одна область не была выбрана, но она не работает в emacs 24.5. Когда я нажимаю клавишу "Mw", в минибуфере появляется сообщение "Mark set". Я что-то пропустил?

(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)

1 ответ

Решение

Ваша функция работает: вы звоните yank и эта команда устанавливает метку; отсюда и сообщение.

Это побочный эффект, который вы, несомненно, не хотите, и последовательность kill+yank не обязательна.

Вы уже знаете о kill-ring-saveтак что просто используйте это с (line-beginning-position) а также (line-end-position),

К вашему сведению, из-за необязательного аргумента REGION 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))))
Другие вопросы по тегам