2017-03-09 6 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)でそれを使用してください。 、多くの対話型コマンドは、独自の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

アカウントに、:として

FYI、kill-ring-saveへのオプションREGION引数のために、あなたはこれを書き換えることができそのような副作用の中で - コマンドが対話的な文脈で有用であるが実際にはそうでないと望んでいないもの(マークを設定するなど)を行うのは一般的です。場合によっては、コマンドのdocstringが代わりに使用すべきものを指摘するので、それを知っておくとよいでしょう。 – phils

関連する問題