Skip to content

Instantly share code, notes, and snippets.

@takaxp
Created November 7, 2011 15:30
Show Gist options
  • Save takaxp/1345278 to your computer and use it in GitHub Desktop.
Save takaxp/1345278 to your computer and use it in GitHub Desktop.
e2wm のパラレルパースペクティブもどきとフレームのキーボードによる移動
;;;; e2wm のパラレルパースペクティブもどきとフレームのキーボードによる移動
;;;; Last Update: 2011-11-07@23:37
;;;; Takaaki ISHIKAWA <takaxp@ieee.org>
;;
;; なにこれ:
;; e2wm の2画面(M-x e2wm:dp-two)から左右の従属関係を取り去る仕掛け
;; => 概念図(http://dl.dropbox.com/u/2440/e2wm/e2wm%2Borg-mode.pdf)
;; e2wm と,このelを導入後,M-x change-frame-width-double (C-x =) で
;; 2画面を並列関係で使うことができる.またキーボードからフレームの位置を変えられる.
;;
;; NOTE: e2wm が必須です.
;; cycle-buffer があると,バッファ一覧をミニバッファに表示できます(推奨)
;; frame-cmds があると,フレームを左右に移動できます(推奨)
;; org-mode ユーザは,リンクを開くときの振る舞いを制御できます
;; => C-c C-o は,カーソルのあるバッファにリンクを開きます
;; => C-u C-c C-o は,カーソルのあるバッファの隣にリンクを開きます
;;
;;; 設定済みのキーバインド
;; M-0 => フレームを画面左上に移動
;; C-u M-0 => フレームの移動先を指定して移動 (ミニバッファで座標を指定する)
;; M-2 => フレームを画面中央に移動
;; C-x = => e2wm の二画面モードを開始して,フレームを画面中央に移動 (height=35)
;; C-x - => e2wm の二画面モードを終了して,フレームを画面中央に移動 (height=35)
;; C-u C-x = => e2wm の二画面モードを開始して,フレームを画面中央に移動 (height=60)
;; C-u C-x - => e2wm の二画面モードを終了して,フレームを画面中央に移動 (height=60)
;; M-] => 一つ前のバッファを表示
;; M-[ => 一つ後のバッファを表示
;; C-M-p => 一つ前のウィンドウにカーソルを移します
;; C-M-n => 一つ後のウィンドウにカーソルを移します
;;; (frame-cmds があれば,以下も使える)
;; M-1 => フレームを右に移動 (200px), see (move-frame-right 200)
;; M-3 => フレームを左に移動 (200px), see (move-frame-left 200)
;; [e2wm](必須)
;; 1) http://github.com/kiwanami/emacs-window-manager/raw/master/e2wm.el
;; 2) http://github.com/kiwanami/emacs-window-layout/raw/master/window-layout.el
(require 'e2wm)
;; [frame-cmds](なくてもよい)
;; 1) http://www.emacswiki.org/emacs/download/frame-cmds.el
;; 2) http://www.emacswiki.org/emacs/download/frame-fns.el
(when (require 'frame-cmds nil t)
(global-set-key (kbd "M-1")
'(lambda () (interactive) (move-frame-left 200)))
(global-set-key (kbd "M-3")
'(lambda () (interactive) (move-frame-right 200))))
(global-set-key (kbd "M-]") 'next-buffer)
(global-set-key (kbd "M-[") 'previous-buffer)
;; [cycle-buffer](なくてもよい/previous-buffer/next-buffer の代替)
;; 1) http://www.emacswiki.org/emacs/download/cycle-buffer.el
(autoload 'cycle-buffer "cycle-buffer" "Cycle forward." t)
(autoload 'cycle-buffer-backward "cycle-buffer" "Cycle backward." t)
(when (require 'cycle-buffer nil t)
;; e2wm でカーソルのないウィンドウに表示されているバッファもバッファリストで表示する
(setq cycle-buffer-allow-visible t)
(setq cycle-buffer-show-length 12)
(setq cycle-buffer-show-format '(" <(%s)>" . " %s"))
(global-set-key (kbd "M-]") 'cycle-buffer)
(global-set-key (kbd "M-[") 'cycle-buffer-backward))
;; Move the frame to somewhere (default: 0,0)
(global-set-key (kbd "M-0") 'move-frame-with-user-specify)
;; Move the frame to the center of the window display
(global-set-key (kbd "M-2") 'move-frame-to-center)
;; Set the frame width single size
(global-set-key (kbd "C-x -") 'change-frame-width-single)
;; Set the frame width double size
(global-set-key (kbd "C-x =") 'change-frame-width-double)
;; Focus on the previous split window (oppose to C-x o)
(global-set-key (kbd "C-M-p") '(lambda () (interactive) (other-window -1)))
(global-set-key (kbd "C-M-n") '(lambda () (interactive) (other-window 1)))
(defcustom frame-width-single 80
"The width of the current frame as the default value"
:type 'integer
:group 'e2wm-parallel-pack)
(defcustom frame-width-double 163
"The width of the current frame (double size)"
:type 'integer
:group 'e2wm-parallel-pack)
(defcustom frame-height-small 35
"The height of the current frame as the default value"
:type 'integer
:group 'e2wm-parallel-pack)
(defcustom frame-height-tall 60
"The height of the current frame (tall version)"
:type 'integer
:group 'e2wm-parallel-pack)
(defcustom move-frame-pixel-offset '(0 . 0)
"Offset of the center position"
:type 'sexp
:group 'e2wm-parallel-pack)
;;; Setting for e2wm.el
(setq e2wm:c-two-recipe
'(- (:lower-size 10)
(| left right)
sub))
(setq e2wm:c-two-winfo
'((:name left )
(:name right )
(:name sub :default-hide t)))
(setq e2wm:c-two-right-default 'left) ; left, prev
;; To avoid rebooting issue when using desktop.el and recentf.el
(add-hook 'kill-emacs-hook 'e2wm:stop-management)
(message "* --[ Loading an init file, e2wm-parallel-pack.el ] --")
;;; switch-buffer を再定義
(defun e2wm:dp-two-switch (buf)
(e2wm:message "#DP TWO switch : %s" buf)
(let ((wm (e2wm:pst-get-wm))
(curwin (selected-window)))
(cond
((eql curwin (wlf:get-window wm 'left))
;; left画面の場合
(e2wm:pst-buffer-set 'left buf)
(e2wm:dp-two-update-history-list)
nil)
((eql curwin (wlf:get-window wm 'right))
;; right画面の場合
(e2wm:pst-buffer-set 'right buf)
(e2wm:dp-two-update-history-list)
nil)
(t nil))))
;;; popup-buffer を再定義 (writen by @kiwanami, it’s my pleasure)
;; org-mode のリンクに対応
(defun e2wm:dp-two-popup (buf)
(e2wm:message "#DP TWO popup : %s" buf)
(let ((buf-name (buffer-name buf))
(is-right?
(eql (selected-window)
(wlf:get-window (e2wm:pst-get-wm) 'right))))
(cond
((memq this-command '(org-open-at-point org-open-at-mouse))
(cond
(current-prefix-arg
(e2wm:pst-buffer-set (if is-right? 'left 'right) buf))
(t
(e2wm:pst-buffer-set (if is-right? 'right 'left) buf)))
(e2wm:dp-two-update-history-list) t)
((e2wm:document-buffer-p buf)
(e2wm:pst-buffer-set 'right buf)
t)
((e2wm:history-recordable-p buf)
(e2wm:pst-show-history-main)
t)
(t
(e2wm:dp-two-popup-sub buf)
t))))
(defun move-frame-to-center ()
"Move the current frame to the center of the window display."
(interactive)
(let
((prev-pos-x (frame-parameter (selected-frame) 'left))
(prev-pos-y (frame-parameter (selected-frame) 'top))
(center-pos-x
(+ (car move-frame-pixel-offset)
(/ (- (display-pixel-width) (frame-pixel-width)) 2)))
(center-pos-y
(+ (cdr move-frame-pixel-offset)
(/ (- (display-pixel-height) (frame-pixel-height)) 2))))
(set-frame-position (selected-frame) center-pos-x center-pos-y)
(message "Frame move: from (%s, %s) to (%s, %s)"
prev-pos-x
prev-pos-y
(frame-parameter (selected-frame) 'left)
(frame-parameter (selected-frame) 'top))))
(defun move-frame-with-user-specify (&optional arg)
"Move the frame to somewhere (default: 0,0).
Use prefix to specify the destination position."
(interactive "P")
(let ((pos-x 0)
(pos-y 0))
(when arg
(setq pos-x (string-to-number
(read-from-minibuffer
(format "X: from %s to "
(frame-parameter (selected-frame) 'left)))))
(setq pos-y (string-to-number
(read-from-minibuffer
(format "Y: from %s to "
(frame-parameter (selected-frame) 'top))))))
(set-frame-position (selected-frame) pos-x pos-y)
(message "Frame move: (%s, %s)"
(frame-parameter (selected-frame) 'left)
(frame-parameter (selected-frame) 'top))))
(defun change-frame-width-single (&optional arg)
"Change the width of the frame to a single width frame"
(interactive "P")
(let
((selected-buffer (current-buffer)))
(e2wm:stop-management)
(cond (arg
(set-frame-size (selected-frame)
frame-width-single frame-height-tall))
(t
(set-frame-size (selected-frame)
frame-width-single frame-height-small)))
(switch-to-buffer selected-buffer)
(move-frame-to-center)))
(defun change-frame-width-double (&optional arg)
"Change the width of the frame to double width frame"
(interactive "P")
(cond (arg
(set-frame-size (selected-frame)
frame-width-double frame-height-tall))
(t
(set-frame-size (selected-frame)
frame-width-double frame-height-small)))
(move-frame-to-center)
(e2wm:start-management)
(e2wm:dp-two))
(provide 'e2wm-parallel-pack)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment