19894


今までずっとマウスで選択した場合、その範囲がRegionとなっていると認識していたのですマウス選択が解除された後もそこに `region-
beginning` が残るようで`elisp`が思った通りの動作をしてくれません。

選択してる行が存在する場合だけ`markdown-mode`で先頭にスペースを4つ追加するという処理をしたかったので

[code]

    (defun indent-rigidly-4 ()
      (interactive)
      (indent-rigidly (region-beginning) (region-end) 4))
    
    (define-key markdown-mode-map (kbd "TAB")
      '(lambda () (interactive)
         (unless
             (eq (region-beginning) (region-end))
           (indent-rigidly-4))))
    
[/code]

としたのですが、これだと選択を解除した後の`Tab`でも更にインデントがついてしまいました。  
現在選択してる文字列・行だけを対象に処理するにはどうすれば良いのでしょうか？


CC BY-SA 3.0
2015-12-11T09:57:32.187
19877
2015-12-11T16:01:11.740
3271
question
emacs elisp
Emacsのマウスで選択した範囲を取得する


マウス等で選択状態にあるかどうかは、`region-active-p`関数で取得できると思います。


CC BY-SA 3.0
2015-12-11T14:20:15.633
19890
2015-12-11T14:20:15.633
4010
19877
answer


既に emasaka さんの回答で解決済みかと思いますが、`interactive` を使って `region` 情報を得ることができますので
`(region-beginning)` と `(region-end)` を使わなくても済みます。

[code]

    (defun indent-rigidly-4 (begin end)
      (interactive "r")
      (indent-rigidly begin end 4))
    
    (define-key markdown-mode-map (kbd "TAB")
      '(lambda (begin end) (interactive "r")
         (and (region-active-p) (indent-rigidly-4 begin end))))
    
[/code]

`(interactive "r")` とすることで、interactive に呼び出された場合は `begin` と `end` に `region`
の開始位置と終了位置が自動的にバインドされます。


CC BY-SA 3.0
2015-12-11T16:01:11.740
19894
2015-12-11T16:01:11.740
19877
answer