2017-03-09 1 views
1

영역을 선택하지 않은 경우 현재 행을 복사하는 elisp 기능을 작성하지만 이맥스 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 시퀀스는 필요하지 않습니다.

당신은 이미 에 대해 알고 있으므로 (line-beginning-position)(line-end-position)으로 사용하십시오. 많은 대화 형 명령이 자신의 elisp에서 호출하는 기능으로 사용하지 않는 것이 좋습니다 일반적인 각주로

(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

계정에,로 :

참고로, kill-ring-save로 선택 지역 인수의 계정에, 당신은이를 다시 작성할 수 이러한 부작용 중 - 대화 형 컨텍스트에서 유용하지만 실제로 필요하지 않은 명령 (예 : 표시 설정)은 일반적입니다. 어떤 경우에는 명령의 문서화 문자열이 대신 사용해야하는 것을 지적하므로 잘 알고 있어야합니다. – phils

관련 문제