まつもとさんの日記にあった、Effective EmacsのItem3について。もしtransient-mark-modeを有効にしているなら、C-wはこうすればいいんじゃないかな。

(defun kill-region-or-backward-kill-word (&optional arg)
  "Kill a region or a word backward."
  (interactive)
  (if mark-active
      (kill-region (mark) (point))
    (backward-kill-word (or arg 1))))
(global-set-key "\C-w" 'kill-region-or-backward-kill-word)

zshで同じことをするならこう。

    tcsh-backward-delete-word () {
	local WORDCHARS="${WORDCHARS:s#/#}"
	zle backward-delete-word
    }
    zle -N tcsh-backward-delete-word
    kill-region-or-tcsh-backward-delete-word () {
        if [ $MARK -eq 0 ]; then
            tcsh-backward-delete-word
        else
            zle kill-region
            MARK=0
        fi
    }
    zle -N kill-region-or-tcsh-backward-delete-word
    bindkey '^W' kill-region-or-tcsh-backward-delete-word

zshにはtransient-mark-modeはないので、マーク位置がバッファの先頭だったらマークされていないと見なす。
けっこう便利。
※その後変数REGION_ACTIVEが導入されたので、今は以下でOK。(2013-10-21追記)

    kill-region-or-tcsh-backward-delete-word () {
        if ((REGION_ACTIVE)); then
            zle kill-region
        else
            tcsh-backward-delete-word
        fi
    }

Tags : ,
Categories : Tech