バッファやウィンドウの状態を変更するあたりの便利な関数。
「表示する?」の設定
選択されているバッファの行番号を非表示にする場合。
(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))))
一時作業用のバッファもこんな感じで作成している。終了時に保存を確認しないのでうるさくない。
(global-set-key #\M-t #'(lambda ()(interactive) (set-buffer (create-new-buffer "*tmp*")) (setq need-not-save t)))
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)))
いろいろと。こんなのもありかも。
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 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)))
ウィンドウのキャプション表示をトグルしてくれます。 さのさんちの 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")
この設定をしてしまうと、 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*))))
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))))))))