emacsでPythonを編集するとき、backword-kill-wordでアンダースコアまでをkillして欲しい


普段、C-wをbackword-kill-wordに割り当ててます。(シェルと同じ挙動にしたいので)
kill-regionは別のキーを割り当ててます

(global-set-key "\C-w" 'backward-kill-word)
(global-set-key "\C-x\C-k" 'kill-region)
(global-set-key "\C-c\C-k" 'kill-region)


ところが、python-modeだとアンダースコア区切りのメソッド名などをひとつのwordだと認識してしまい、一息にkillしてしまうのが不便でした。

例)

argsだけをkillしたいのに

parse_known_argsすべてをkillしてしまう

対応してみた(案1)

例えばruby-modeでは、アンダースコアまでがkillされます。
ruby-mode.elのソースを見てみるとアンダースコアをシンボルとして扱うようになってます。


ruby-mode.el(一部抜粋)

(defvar ruby-mode-syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?\' "\"" table)
    (modify-syntax-entry ?\" "\"" table)
    (modify-syntax-entry ?\` "\"" table)
    (modify-syntax-entry ?# "<" table)
    (modify-syntax-entry ?\n ">" table)
    (modify-syntax-entry ?\\ "\\" table)
    (modify-syntax-entry ?$ "." table)
    (modify-syntax-entry ?? "_" table)
    (modify-syntax-entry ?_ "_" table)
    (modify-syntax-entry ?< "." table)

なのでinit.elなどに以下の設定をすると同じような扱いにすることができそうです

(modify-syntax-entry ?\_ "_"  py-mode-syntax-table)

ただこれはM-f(forward-word)、M-b(backward-word)などの単語単位の移動コマンドも影響を受けます。
他にも影響がでるかもしれません。

参考)
http://www.emacswiki.org/emacs/EmacsSyntaxTable

対応してみた(案2)

案1がちょっと乱暴で、他に影響がでるかもしれない、と思ったので別の方法を考えてみました

python-modeにはM-f(forward-word)、M-b(backward-word)の代わりに、アンダースコアをwordとして扱わないpy-forward-into-nomenclature、py-backward-into-nomenclatureが定義されていますので、それを使ってpy-backwrd-kill-wordを定義する、というものです

(defun py-backward-kill-word (arg)
  (interactive "p")
  (kill-region (point) (progn (py-forward-into-nomenclature (- arg)) (point))))

(add-hook 'python-mode-hook
	  (lambda()
	    (define-key py-mode-map [(meta f)] 'py-forward-into-nomenclature) 
	    (define-key py-mode-map [(meta b)] 'py-backward-into-nomenclature) 
	    (define-key py-mode-map [(control w)] 'py-backward-kill-word) 
	    ))


これでも望む挙動にすることができました。