tmuxを有効活用する。

久々に直撃コース & 巨大台風とのことで。なんかこれだけでかいのは10年以上前の台風19号くらいしか記憶にありません。まぁそれ以外はほとんど東北までこなかったからですけれども。

とにかく電車に影響が出まくってます。メインで利用してる京葉線が5割減で運行しますとか言っていますので、明日動いているのに乗れたとしてどれだけ人が詰まっているか考えたくないです。

まぁそんな憂鬱になりそうな明日は明日の風が吹くとして。

portageで、tmuxが1.0にバージョンアップしていたので適用してみたところ、0.9よりずっと進化していました。まぁマルチバイトがところどころ消えたりするのは直ってないんですが。
screenでは余裕で出来た、
・shellでのコマンド結果をバッファに取り込める。
・show-bufferでバッファの内容を取得できる。
・viewモード(でいいんかな?)で検索が可能に & キーバインディングの変更が可能に(manを流し読みしただけだから多分ですが)
ということができるようになっていました。

で、私はw3mはmlterm上で利用しており、emacs上ではほとんど利用していないため、よくURLの受けわたしとかどうするべや、と思っていたのですが、この機能が実装されたおかげでなんとかなるようになりました。

とりあえずは.emacs.elに以下のような関数を定義して、tmuxのバッファと連携できるようにしてみました。

;; tmuxに依存した各種ユーティリティ関数。
(defvar my-tmux-bin-path "/usr/bin/tmux")

(defun get-tmux-exec-command (cmd)
  "Return command-string of tmux"
  (format "%s %s" my-tmux-bin-path cmd))
  
(defun tmux-save-buffer (data &optional e)
  "Set data to buffer of tmux (use `tmux set-buffer')"
  (interactive "ssave to tmux buffer: ")
  (when data
    (call-process-shell-command
     (get-tmux-exec-command (format "set-buffer \"%s\"" data))  nil nil t)
    (when e
      (message (format "set %s to buffer of tmux" data)))))

(defun tmux-get-buffer ()
  "Get data from current buffer fo tmux, and set to top of kill-ring"
  (interactive "*")
  (let ((buffer (get-buffer-create " *tmux-output*")))
    (when buffer
      (call-process-shell-command (get-tmux-exec-command "show-buffer")
                                  nil `(,buffer t) nil)
      (save-window-excursion
        (switch-to-buffer buffer)
        ;; 余分な改行を削除する。
        (kill-ring-save (point-min) (- (point-max) 1)))
      (kill-buffer buffer))))

;; kill-ring-saveしたデータを自動的にtmuxのバッファに登録する。
(defadvice kill-ring-save (around tmux-save-buffer-kill-ring activate)
  (tmux-save-buffer (current-kill 0) nil)
  ad-do-it)

なんか色々おかしいかもしれませんが勘弁してください。とりあえず、M-wしたら、そのデータをtmuxのバッファに取得し、tmux-get-bufferをしたら、tmuxのバッファデータを取得してkill-ringの先頭に積む、ということができるようになりました。

それほど色々mlterm上でやっているわけではありませんが、やっぱりemacs上よりもmlterm上でやった方が都合がいいこともあったりしますんで、時折重宝しています。