最近混乱したsubstitute-key-definition

何となく引数の意味が分からないのでSourceを見てみた。

(defun substitute-key-definition (olddef newdef &optional (keymap *global-keymap*) (okeymap keymap))
  (dolist (x (expand-command-keys (command-keys olddef okeymap nil)))
    (define-key keymap x newdef))
  t)

(define-key keymap x newdef)と書いてあるのを見ると、keymapのキーxにnewdefを定義すると言うことらしい。xはokeymapでolddeffが割り当てられているkey全部らしい。

  ;;; text-mode での行の移動を物理行単位にする
  (substitute-key-definition 'next-virtual-line 'next-line
                             *text-mode-map* *global-keymap*)

keymapのキーバインドを変更するのかokeymapのキーバインを変更するのかどっちなんだろう。例の場合はだとokeymap=*text-mode-map*でkeymap=*global-keymap*に成りそうだけど、それだと*global-keymap*のキー設定が変更されていることになるような。何かよく分からん。
良く引数を見てみたら。逆だったorz。keymap=*text-mode-map*でokeymap=*global-keymap*なのか。(keymap *global-keymap*)が*text-mode-map*で(okeymap keymap)が*global-keymap*なのか。なんだか頭が混乱してる。