multi-termで作業してると、「単にシェルとして扱いたい場合」と「シェルの出力を編集したい場合」とでほしいキーバインドが異なる場合があります。

例えば、C-aにterm-send-rawを割り当てているとして、普通にコマンドを打っているとき

$ sl ./hoge/fuga/fo# ここでコマンド名間違えてることに気づく

ここでC-aを押した時、期待しているカーソルの戻り位置は

$ sl ./hoge/fuga/fo
  ↑ここ

ここになります。
しかし、ここでコマンドを実行してlsの結果をコピペしたいとして、

$ ls ./hoge/fuga/foo
hoge fuga piyo rofi(←ここにキーがある)
foo bar baz quux
$ 

ここでうっかりC-aを押してしまうと、戻ってくる位置は

$ ls ./hoge/fuga/foo
(↓ここではなく)
hoge fuga piyo rofi
foo bar baz quux
$ (ここ)

このようになってしまいます。
これをいい感じに解決するために、toggle-term-keyというコマンドを作りました。

;; termの編集モードを切り替える
(defun toggle-term-key ()
  (interactive)
  (if (eq major-mode 'term-mode)
      (progn
        (loop for (key term-bind edit-bind) in multi-term-toggle-key-list do
              (if (eq multi-term-current-key 'term)
                  (define-key term-raw-map key edit-bind)
                (define-key term-raw-map key term-bind)))
        (if (eq multi-term-current-key 'term)
            (progn
              (setq multi-term-current-key 'edit)
              (message "switched to edit mode"))
          (progn
            (setq multi-term-current-key 'term)
            (message "switched to term mode"))))))

 (setq multi-term-toggle-key-list
      `(("\C-e" term-send-raw seq-end)
        ("\C-a" term-send-raw seq-home)))

;; multi-term-current-keyにセットされた値に対応するキーバインドになる。
;; 'term => シェルのキーバインドに近いやつ
;; 'edit => 出力を編集しやすいキーバインド
(setq multi-term-current-key 'term)

(add-hook 'term-mode-hook
          (lambda ()
            (define-key term-raw-map "\C-c\C-t" 'toggle-term-key)))

これでC-cC-tを押すたびに、C-e, C-aのキーバインドがseq-{home, end}とterm-send-rawを入れ替わるようになります。
あとはC-p, C-nあたりも設定しておくと幸せになれます。

こういったキーバインドの切り替えはmulti-term以外にもrun-schemeやrun-haskell等でも欲しくなってくるので、
いい感じにモジュール化できたらパッケージとして公開しようかな……。