LINUX.ORG.RU

Честно говоря, пока такую задачку удалось решить, если только 
transient-mark-mode включен (M-x transient-mark-mode)

(global-set-key [(control w)] (lambda () (interactive)   
				(if mark-active
				    (kill-region (mark) (point))
				  (backward-kill-word 1))))

Проблема в том, что маркер mark существует всегда в буфере. Но только
 в режиме transient можно отсеивать ситуации, когда mark-active, а 
когда нет. Эта переменная имеет смысл только для этого режима, к 
сожалению. Поэтому получается, что регион выбран всегда, а сами 
команды знают, над чем им работать.

Может, кто-то еще предложит решение, если таковое имеется.

Zubok ★★★★★
()

Например вот так:

(defun my-delete-word-or-region (arg)
  (interactive "p")
  (if (region-active-p)
      (kill-region (point) (mark))
    (backward-kill-word arg)))

(global-set-key "\C-w" 'my-delete-word-or-region)

madepa
()
Ответ на: комментарий от Zubok

Лучше так (использовать не (point) и (mark)):

(global-set-key [(control w)] (lambda () (interactive)   
				(if mark-active
				    (kill-region (region-beginning) 
						 (region-end))
				  (backward-kill-word 1))))

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

(defun region-active-p ()
  "Return t if Transient Mark mode is enabled and the mark is active.

Most commands that act on the region if it is active and
Transient Mark mode is enabled, and on the text near point
otherwise, should use `use-region-p' instead.  That function
checks the value of `use-empty-active-region' as well."
  (and transient-mark-mode mark-active))

mv ★★★★★
()
Ответ на: комментарий от mv

Ага, понятно. Тогда можно проверить fboundp на эту функцию, и если она не определена, то присвоить ей (and transient-mark-mode mark-active)). Тогда переносимый вариант получится.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.