バッファタブメニューに「別のxyzzyで開く」
xyzzyはタブエディタでウィンドウを上下左右とマルチに分割して複数ファイルを同時編集できるのですが、マルチディスプレイ環境下だと、それぞれのディスプレイにxyzzyを起動させたくなります。
そして、xyzzyを複数起動させてしまうと、「あっちで開いてるファイルをこっちに持ってくる」、というのが簡単にできません。なにより、エクスプローラから新たにファイルを開くときにどちらのウィンドウで開かせるか、そこからしてままなりません。
ということで、他方のxyzzyにバッファを移動するマクロを書いてみました。
ベースはxyzzywiki にもある別のウィンドウでexpを実行するサンプルです。これをバッファタブメニューから実行できるようにして、こんな感じです。
?

?
?
?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; バッファタブメニュー
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-hook '*init-app-menus-hook*
#'(lambda ()
(let ((menu *buffer-bar-context-menu*))
(delete-menu menu 0 t)
(add-menu-item menu nil "別のxyzzyで開く" 'my-reopen-other-xyzzy)
(add-menu-separator menu nil)
(add-menu-item menu nil "すべてコピー" 'my-copy-all)
(add-menu-separator menu nil)
(add-menu-item menu nil "タブを閉じる" 'my-close-buffer)
(add-menu-item menu nil "他のタブをすべて閉じる" 'my-close-other-buffers)
)))
;; 別のxyzzyで開く
(defmacro int2str (int)
`(format nil "~A" ,int))
(defun my-reopen-other-xyzzy ()
(interactive)
(if (and (buffer-modified-p) (yes-no-or-cancel-p "保存しますか?"))
(save-buffer))
(let ((buffer *buffer-bar-context-menu-buffer*))
(setq name (get-buffer-file-name buffer) line (current-line-number))
(delete-buffer buffer)
(let ((callcmd "xyzzy.exe"))
(if (>= (count-xyzzy-instance) 2)
(progn (setq callcmd "xyzzycli.exe")
(next-xyzzy-window)))
(call-process (concat callcmd " \"" name "\" -g " (int2str line))
:exec-directory (si:system-root) :wait nil))))
;; すべてコピー
(defun my-copy-all()
(interactive)
(copy-region-to-clipboard (point-min) (point-max)))
;; 閉じる
(defun my-close-buffer()
(interactive)
(kill-buffer *buffer-bar-context-menu-buffer*))
;; 他のタブをすべて閉じる
(defun my-close-other-buffers ()
(interactive)
(let ((buf0 *buffer-bar-context-menu-buffer*))
(dolist (buffer (buffer-list))
(unless (or (eq buffer buf0)
(string= (buffer-name buffer) "*scratch*"))
(kill-buffer buffer)))))
