バッファ/ウィンドウ/フレーム

Last modified: "2019/01/02 17:49:36"

Table of contents


知っていると便利な辺り

バッファやウィンドウの状態を変更する

バッファやウィンドウの状態を変更するあたりの便利な関数。

「表示する?」の設定

選択されているバッファの行番号を非表示にする場合。

(set-local-window-flags (selected-buffer) *window-flag-line-number* nil)

flags (window.l 参照)

*window-flag-line-number*行番号
*window-flag-ruler*ルーラ
*window-flag-newline*改行
*window-flag-tab*タブ
*window-flag-zenkaku-space*全角スペース
*window-flag-mode-line*モード行
*window-flag-vscroll-bar*垂直スクロールバー
*window-flag-hscroll-bar*水平スクロールバー
*window-flag-eof*EOF
*window-flag-fold-line*折り返しライン
*window-flag-cursor-line*行カーソル
*window-flag-fold-mark*折り返し
*window-flag-half-width-space*半角スペース
*window-flag-full-width-space*全角スペース
*window-flag-just-inverse*???
*window-flag-alternate-vscroll-bar*???
*window-flag-scrolling*???

「テキストの折り返し」の設定

;折り返さない
(set-buffer-fold-type-none)

;指定位置で折り返す
(set-buffer-fold-type-column)

;ウィンドウ幅で折り返す
(set-buffer-fold-type-window)

「表示色」の設定

(set-buffer-colors #(#x000000 #xd7d7d7 #x008080 #xffffff #x808000 ...))

左から、文字色, 背景色, 制御文字, 選択文字, 選択背景... の順 (「共通設定」→「フォント」→「表示色」の順)で設定する。 すべてを指定する必要はないが、間に設定したくない項目がある場合は、 0 を指定しておくと良いみたい。


バッファ

スクラッチバッファーを消したりつくったり

*scratch* バッファを削除できるようにするには、*kill-buffer-kills-scratch* 変数をさわればいいらしい。

(setq *kill-buffer-kills-scratch* t)

しかしいつも消せてしまうのがナニという場合は、こんな感じでいいらしい。

;; *scratch* バッファを消す
(defun kill-scratch-buffer ()
  (interactive)
  (let ((*kill-buffer-kills-scratch* t))
    (switch-to-buffer "*scratch*")
    (delete-buffer (selected-buffer))))

;; *scratch* バッファをつくる
(defun make-scratch-buffer ()
  (interactive)
  (set-buffer (switch-to-buffer "*scratch*"))
  (execute-extended-command 'lisp-interaction-mode)
  (setq need-not-save t))

;; *scratch* バッファ表示切替え
(defun toggle-scratch-buffer ()
  (interactive)
  (let ((r nil))
    (dolist (buf (buffer-list))
      (when (string= (buffer-name buf) "*scratch*")
        (setq r t)))
    (if r (kill-scratch-buffer)
      (make-scratch-buffer))))
[2002/12/23]
消したり、切替えたりするあたりを追加した。

一時作業用のバッファもこんな感じで作成している。終了時に保存を確認しないのでうるさくない。

(global-set-key #\M-t
                #'(lambda ()(interactive)
                    (set-buffer (create-new-buffer "*tmp*"))
                    (setq need-not-save t)))
[2002/12/03]
一時作業用のバッファは、create-new-buffer でないと、1個しか開かないではないか。。。

*grep*, *Help*, ... バッファがあったら削除&ウィンドウが分割されていたら元に戻す

xyzzy Part4 400 を参考に。

(defun cleanup-window ()
  (interactive)
  (dolist (buf (buffer-list))
    (let ((name (buffer-name buf)))
      (when (member-if
             #'(lambda (str) (string= name str))
             '("*Abbrevs*"
               "*buf2html: HTML*"
               "*Buffer List*"
               "*calc*"
               "*Calendar*"
               "*clsearch*"
               "*Command Output*"
               "*compilation*"
               "*CSV: Convert*"
               "*CSV: View*"
               "*dictionary*"
               "*grep*"
               "*Fileout.csv*"
               "*FTP LOG*"
               "*Help*"
               "*md5*"
               "*My Batch*"
               "*My Ruby*"
               "*output*"
               "*PickupPatternShow*"
               "*Reference*"
               "*Run Script*"
               "*Shell output*"
               "*Syntax Check*"
               "*Trace Output*"
               "*Translate*"
               ))
        (switch-to-buffer buf)
        (delete-buffer buf))))
  (if (and (not (member
                 (ed::pseudo-frame-name (selected-pseudo-frame))
                 '("2ch" "KaMail" "RSS" "NetInst")
                 :test #'equal))
           (> (count-windows t) 2))
      (delete-window)))
[2003/06/04]
・特定のフレームではウィンドウを閉じないようにした。
[2003/06/01]
・構造を見直した。
・新しい csv-mode 対応など。

バッファ名に親ディレクトリ名を足す

[2004/10/12]
・不具合発覚のため,更新しつつ note2 に移動した。

バッファ一覧とかをポップアップ表示

いろいろと。こんなのもありかも。


ウィンドウ

xyzzy ウィンドウの最大化/元のサイズに戻す

xyzzy Part7 566 より。 switch-bar といっしょに使うと結構いい感じ。 でもこれってトグルできるといいのになあ。

(require "wip/winapi")
(c:define-dll-entry winapi:BOOL ShowWindow (winapi:HWND c:int) "user32")
;最大化
(defun maximize-xyzzy ()
  (interactive)
  (ShowWindow (get-window-handle) 3))
;元のサイズに戻す
(defun restore-xyzzy ()
  (interactive)
  (ShowWindow (get-window-handle) 9))

トグルもつくって頂けたもよう。xyzzy Part7 622 より。

;トグル
(c:define-dll-entry winapi:BOOL IsZoomed (winapi:HWND) "user32")
(defun toggle-maximize-xyzzy ()
  (interactive)
  (if (/= 0 (IsZoomed (get-window-handle)))
      (restore-xyzzy)
    (maximize-xyzzy)))

これで switch-bar 本体をさわらなくても使えるようになった。 (でも、普段最大化して使っている人は、困ったことになるので注意。)

;; switch-barでトグルする機能の一覧
(setq *switch-function*'(;toggle-ruler
                  toggle-mode-line
                         toggle-function-bar
                         toggle-line-number
                         toggle-maximize-xyzzy
                         ))

xyzzy ウィンドウのサイズを変更/元のサイズに戻す

xyzzy Part6 212 あたりからを参考に。

(require "wip/winapi")
(unless (fboundp 'GetWindowRect)
  (c:*define-dll-entry winapi:BOOL GetWindowRect
    (winapi:HWND (winapi:RECT *))
    "user32"))
(unless (fboundp 'SetWindowPos)
  (c:*define-dll-entry winapi:BOOL SetWindowPos
    (winapi:HWND winapi:HWND winapi:INT winapi:INT winapi:INT winapi:INT winapi:UINT)
    "user32"))
(defvar *old-size* nil)
;サイズを変更
(defun xyzzy-resize ()
  (interactive)
  (when (not *old-size*)
    (setq *old-size* (winapi:make-RECT))
    (GetWindowRect (get-window-handle) *old-size*)
    ;位置/サイズを指定
    (SetWindowPos (get-window-handle) 0
                          80  ;X座標
                   50  ;Y座標
                   700 ;ウィンドウ幅
                   500 ;ウィンドウ高さ
                   0)))
;元のサイズに戻す
(defun xyzzy-size-restore ()
  (interactive)
  (when (and *old-size* (winapi:RECT-p *old-size*))
    (SetWindowPos (get-window-handle) 0
                          (winapi::RECT-left *old-size*)     ;X座標
                   (winapi::RECT-top *old-size*)      ;Y座標
                   (- (winapi::RECT-right *old-size*) ;ウィンドウ幅
                      (winapi::RECT-left *old-size*))
                          (- (winapi::RECT-bottom *old-size*);ウィンドウ高さ
                      (winapi::RECT-top *old-size*))
                          0)
    (setq *old-size* nil)))
;トグル
(defun toggle-xyzzy-size ()
  (interactive)
  (if *old-size*
      (xyzzy-size-restore)
    (xyzzy-resize)))

xyzzy ウィンドウのキャプションをトグル

ウィンドウのキャプション表示をトグルしてくれます。 さのさんちの wiki より。 api.l は、2003/03/25 版以降のものが必要らしい。

(require "api")
(in-package "win-user")
(defvar *show-caption* t)
(defun toggle-caption (&optional (arg nil sv))
  (ed:interactive)
  (if sv
      (setq *show-caption* arg)
    (setq *show-caption* (not *show-caption*)))
  (SetWindowLong
   (ed:get-window-handle)
   GWL_STYLE
   (-
    (logior
     (GetWindowLong
      (ed:get-window-handle)
      GWL_STYLE)
     WS_CAPTION)
    (if *show-caption* 0 WS_CAPTION)))
  (SetWindowPos
   (ed:get-window-handle) 0 0 0 0 0
   (+ SWP_NOMOVE
      SWP_NOSIZE
      SWP_NOZORDER
      SWP_FRAMECHANGED))
  *show-caption*)
(in-package "user")

他ウィンドウを高速スクロール

[2004/09/28]
・更新しつつ,note2 に移動した。

フレーム

新しくファイルを開く場合は、"Frame 1"で

この設定をしてしまうと、 diary.l, rd-memo.l などの"Frame 1"以外で find-file する(?)ライブラリなどの動作がおかしくなるようです。

ファイルを開く場合に使用するフレームを指定する。2ch-mode などを使ってる状態で、 xyzzycil とかからファイルを開いても悲しい思いをしなくて済む。

xyzzy Part3 811 より。

(defvar *my-default-frame* "Frame 1")
(add-hook '*before-find-file-hook*
          #'(lambda (filename)
              (unless (find-pseudo-frame *my-default-frame*)
                (new-pseudo-frame *my-default-frame*))
              (select-pseudo-frame (find-pseudo-frame *my-default-frame*))))
[2003/03/09]
・注意書きを追加した。

フレーム毎に buffer-bar の 表示/非表示 を切替え

xyzzy Part7 925 より。以下の場合は、"2ch", "KaMail", "WWW", "*tterm*", "RSS", "NetInst" フレームでは、 buffer-bar を非表示に。その他のフレームでは表示する。

xyzzy 終了時には、buffer-bar を復元するように、 また、switch-bar を使用しているときは、効かないようにした。

;非表示にするフレームのリスト
(defvar *hframe-name-list* '("2ch" "KaMail" "WWW" "*tterm*" "RSS" "NetInst"))
(defvar *hide-or-show-buffer-bar* nil)
(defun hide-or-show-buffer-bar ()
  (unless *switch-bar*
    (cond ((member
            (ed::pseudo-frame-name (selected-pseudo-frame)) *hframe-name-list*
            :test #'equal)
           (hide-command-bar 'buffer-bar)
           (setq *hide-or-show-buffer-bar* t))
          (t (show-command-bar 'buffer-bar)
             (setq *hide-or-show-buffer-bar* nil)))))
(add-hook '*select-pseudo-frame-hook* #'hide-or-show-buffer-bar)

;終了時に buffer-bar を復元
(defun restore-buffer-bar ()
  (ignore-errors
   (when *hide-or-show-buffer-bar*
     (show-command-bar 'buffer-bar)))
  t)
(add-hook '*kill-xyzzy-hook* #'restore-buffer-bar)

いろいろ

新しいフレームを作成し,所定のウィンドウに所定のファイルを配置

会社では,スケジュール一覧,よく使う電話帳,ToDo List をウィンドウを分割して表示している。 こんな感じ。

┌──────┬───┐
│ Schedule   │ Tel  │
├──────┴───┤
│ ToDo               │
└──────────┘

M-x task-open で開き,M-x task-close で閉じる。

(defun task-open ()
  (interactive)
  (let* ((frame "Task")
         (fa "S:/home/hie_m/task/schedule.txt")
         (fb "S:/home/hie_m/task/tel.txt")
         (fc "S:/home/hie_m/task/todo.txt")
         (bl (list (file-namestring fa)
                   (file-namestring fb)
                   (file-namestring fc))))
    (new-pseudo-frame frame)
    (split-window 12 nil) (find-file fa)
    (split-window -50 t) (find-file fb)
    (other-window 1) (find-file fc)
    (other-window 1)
    (defun task-close ()
      (interactive)
      (let ((pf (find-pseudo-frame frame)))
        (when pf
          (delete-pseudo-frame pf)
          (dolist (buf bl)
            (when (find-buffer buf)
              (kill-buffer buf))))))))