Что не так с этой функцией 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))))