2017-03-09 11 views
1

Ich schreibe eine elisp Funktion, um die aktuelle Zeile zu kopieren, wenn keine Region ausgewählt wurde, aber es funktioniert nicht auf Emacs 24.5. Wenn ich die "M-w" -Tastenanschläge drücke, erscheint eine Meldung "Markiere gesetzt" im Minipuffer. Habe ich etwas verpasst?Was ist los mit dieser elisp Funktion?

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

Antwort

0

Ihre Funktion funktioniert: Du nennst yank und Befehl setzt die Marke; daher die Nachricht.

Das ist ein Nebeneffekt, den Sie zweifellos nicht wollen, und die Kill + Yank-Sequenz ist nicht notwendig.

Sie wissen bereits über kill-ring-save, verwenden Sie das also nur mit (line-beginning-position) und (line-end-position).

FYI, wegen des optionalen REGION Argument kill-ring-save, könnten Sie dies umschreiben als:

(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

Als allgemeine Fußnote, viele interaktive Befehle werden nicht als Funktionen empfohlen in Ihrem eigenen elisp zu nennen, wegen von solchen Nebenwirkungen - es ist üblich, dass Befehle Dinge tun (wie zum Beispiel das Setzen der Markierung), die in einem interaktiven Kontext nützlich sind, aber ansonsten nicht wirklich erwünscht sind. In einigen Fällen wird der Docstring eines Befehls darauf hinweisen, was Sie stattdessen verwenden sollten, also ist es gut, sich dessen bewusst zu sein. – phils