[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-x C-bで表示されるバッファリストとC-x b時にバッファを切り替えるための Elisp です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
デフォルトではC-x C-b(list-buffers) で以下のようなバッファリストが表示され ます.カーソルは移動しません.
MR Buffer Size Mode File -- ------ ---- ---- ---- . *scratch* 0 Lisp Interaction * *Messages* 4873 Fundamental *Compile-Log* 0 Fundamental
このバッファリストはシンプルでいいのですが,いちいち C-x o でカーソルを移動 する必要があったりと,使い勝手はあまりよくありません.
そこで,このバッファリストをカスタマイズする方法について紹介します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
デフォルトのバッファリストは項目の追加や削除などを行うことは困難です.
そこで,カスタマイズが可能なバッファリストがあります.これなら,多少のカスタマイ ズは可能です.
まず,http://www.splode.com/~friedman/software/emacs-lisp/より, listbuf.el をダウンロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(autoload 'listbuf "listbuf" nil t)
|
これで,M-x listbufで新しいバッファリストを使うことができます.
デフォルトでは,以下のような画面になります.これは, listbuf-field-alist を変更 することでカスタマイズが可能です.また, listbuf-ignore-buffer-name-regexp-list でバッファリストに表示しないバッファも指定できます.
MR Buffer Rev Proc Size Mode File -- ------ --- ---- ---- ---- ---- .* window.texiCVS:1.2 19264 Texi ~/www/soft/window.texi listbuf.el 29959 Elisp ~/mylisp/listbuf.el test.el 35 Elisp ~/www/soft/test.el
多少は派手になりましたね.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow には C-x C-b で利用できる list-buffers の他にも,バッファ リストを表示するコマンドが用意されています.
そこで,ここではバッファリストを表示するための標準コマンドを紹介します.
まずは, electric-buffer-list です.これは,見た目は list-buffers と同 じですが,バッファの選択をRETだけでなく,SPCでも行うことが できます.たったこれだけのことですが,随分と使い勝手がいいです.
以下のように設定しておくと,C-x eで使うことができるようになりま す.
(global-set-key "\C-xe" 'electric-buffer-list) |
C-x eは通常キーボードマクロの実行に割り当てられていますが,,,
buffer-menu というのもあります.これも list-buffers とほぼ同じものです. ただ,バッファの一覧がカレントバッファになるため,毎回 C-x o で 移動する必要はありません.
(global-set-key "\C-x\C-b" 'buffer-menu) |
好みに応じて選択するといいでしょう.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
標準のバッファリストと同じような見た目でありながら,大幅にカスタマイズ 可能なバッファリストです.
標準のバッファリストは使いにくいですし,あまりカスタマイズもできません.
MR Buffer Size Mode File -- ------ ---- ---- ---- . buf-list.texi48710 Texi d:/home/www/soft/buf-list.texi buffer.texi 14130 Texi d:/home/www/soft/buffer.texi basic.texi 34381 Texi d:/home/www/soft/basic.texi dired.texi 69476 Texi d:/home/www/soft/dired.texi texi2html.pl 156629 CPerl d:/home/www/soft/texi2html.pl
のようなバッファリストが表示できます.また,表示する項目などは自由にカ スタマイズできます.
標準で附属していますので,インストールは不要です.
不要です.
必要なら以下のようにキーバインドを割り当てます.
(global-set-key [?\C-,] 'bs-cycle-next)
(global-set-key [?\C-.] 'bs-cycle-previous)
(global-set-key "\C-x\C-b" 'bs-show)
|
M-x bs-showでバッファリストを表示できます.また,M-x bs-cycle-next,M-x bs-cycle-previous で次/前のバッファに次々と 切り替えることができます.
また,M-x bs-show でバッファリストを表示し,C とすると,あ らかじめ設定されたカテゴリを選ぶことができます.デフォルトでは「 files 」などが登録されてます.例えば, files を選択すると,ファイルに関連し たバッファだけが表示されます.
Sでソート方法を変えることができます.
bs ではバッファリストで C とすると,表示するバッファを制限するこ とができます.これは, bs-configurations という変数で設定されています.
この変数の設定例を以下に書いておきます.基本的には正規表現を設定するだ けでも,ある程度の設定は可能です.それ以上のことをしたければ,適当な関 数 (以下の例では,my-must-show-func と my-dont-show-func) を書く必要が あります.
関数は buffer を引数に取り,そのバッファが表示する必要があるかどうかを t/nil で返します.
以下の「 soft 」の例だと,関数でファイルバッファは表示しない (my-dont-show-func) が変更したバッファは表示 (my-must-show-func) する 設定になっています.
(setq bs-configurations '(;; 名前 ;; 表示しなければならないバッファの正規表現 ;; 表示しなければならないバッファの関数 ;; (この関数の戻り値が t なら表示する) ;; 表示しないバッファの正規表現 ;; 表示しないバッファの関数 ;; (この関数の戻り値が t なら表示しない) ;; 整列関数 (引数は B1 B2) ("soft" "^\\*scratch\\*$" my-must-show-func nil my-dont-show-func nil) ("all" nil nil nil nil nil) ("files" nil nil nil bs-visits-non-file bs-sort-buffer-interns-are-last) ("files-and-scratch" "^\\*scratch\\*$" nil nil bs-visits-non-file bs-sort-buffer-interns-are-last) ("all-intern-last" nil nil nil nil bs-sort-buffer-interns-are-last))) (defun my-must-show-func (buffer) (if (buffer-modified-p buffer) t nil)) (defun my-dont-show-func (buffer) (if (buffer-file-name buffer) t nil)) |
書式は bs-attributes-list で定義されています.表示したい情報 (例えば文 字コード) があれば,追加します.バッファリストでは上から順番に左詰めで 表示されますので,表示したい場所に追加します.
追加する項目は左から順番に, 1 行目の文字 (例では Coding) ,最小の長さ, 最長の長さ,文字の配置,関数名 (情報を返す) を指定します.
また,指定した名前の関数は別途用意する必要があります.
(setq bs-attributes-list '( ;; (HEADER MINIMUM-LENGTH MAXIMUM-LENGTH ALIGNMENT FUN-OR-STRING) ("" 1 1 left bs--get-marked-string) ("M" 1 1 left bs--get-modified-string) ("R" 2 2 left bs--get-readonly-string) ("Coding" 15 15 left bs--get-coding-string) ("Buffer" bs--get-name-length 10 left bs--get-name) ("" 1 1 left " ") ("Size" 8 8 right bs--get-size-string) ("" 1 1 left " ") ("Mode" 12 12 right bs--get-mode-name) ("" 2 2 left " ") ("File" 12 12 left bs--get-file-name) ("" 2 2 left " "))) (defun bs--get-coding-string (start-buffer all-buffers) (if (coding-system-get buffer-file-coding-system 'mime-charset) (format " %s" (coding-system-get buffer-file-coding-system 'mime-charset)) " undefined")) |
S での並び替えもカスタマイズできます.デフォルトでは以下のように 定義されてます. bs--sort-by-size を参考にすれば,簡単に自分好みの並び 換え方法を追加できます.
(defun bs--sort-by-size (b1 b2) "Compare buffers B1 and B2 by buffer size." (save-excursion (< (progn (set-buffer b1) (buffer-size)) (progn (set-buffer b2) (buffer-size))))) (setq bs-sort-functions '(("by name" bs--sort-by-name "Buffer" region) ("by size" bs--sort-by-size "Size" region) ("by mode" bs--sort-by-mode "Mode" region) ("by filename" bs--sort-by-filename "File" region) ("by nothing" nil nil nil))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
e:/unix/Meadow2/site-lisp/emacs-goodies-el/ibuffer.el というファイルを開くと,バッ ファリストにはその情報が表示されます.しかし,ディレクトリ名が長いために,見にく いバッファリストになってしまいます.
基本的にはバッファリストと同じなのですが,様々なカスタマイズが可能で非常に便利で す.
カスタマイズだけでなく,バッファリストでC-x dやC-x C-fとすると,その 行のファイルがあるフォルダがデフォルトになり,使い勝手もいいです.
インストールは,ibuffer.elをダ ウンロードし (これは,作者のページよ り辿って探したものです) ,ロードパスの通ったところへ置きます.
.emacs に以下を追加します
(require 'ibuffer) |
M-x ibufferとすると使うことができます.
このバッファリストは様々にカスタマイズが可能です.
主要なオプションを説明します.
バッファリストの並び換えを変更できます.'recency なら最近,表示したものが上にな りますし,'alphabetic ならアルファベット順,'size ならサイズ順,'major-mode なら メジャーモード順になります.
私は,以下のように設定しています.こうしておくと,デフォルトのように縦のラインが 揃わないということがなくなります.
(setq ibuffer-formats '((mark modified read-only " " (name 30 30) " " (size 6 -1) " " (mode 16 16) " " filename) (mark " " (name 30 -1) " " filename))) |
(setq ibuffer-never-show-regexps '("\\.el" "messages")) |
これで,拡張子が「 el 」のファイルと「 messages 」という文字を含むバッファ (*Messages*など) を表示しないようにできる.
(setq ibuffer-directory-abbrev-alist '(("e:/unix/Meadow2/site-lisp/" . "meadow"))) |
のように設定しておくと, e:/unix/Meadow2/site-lisp/emacs-goodies-el/ibuffer.el と表示されるところが, meadow/emacs-goodies-el/ibuffer.el と短くなります.
ibuffer でmによりマークをつけます.そして,Oとすると,
1 lines matching "setq" in buffer .dictio.el 18 :(setq lookup-init-file "~/mylisp/.lookup") 3 lines matching "setq" in buffer .my-load.el 8 : (setq file (concat file ".el"))) 9 : (setq file (file-installed-p file)) 10 : (setq compiled-file-name (byte-compile-dest-file file))
という風に, occur により複数のバッファを検索できます.ただし,この occur は非常に使 い難いです.
その他にも,バッファリストに表示されるバッファを制限したりもできます.メニューも 表示されますので,いろいろと試してみましょう.
28.1.4.1 ibuffer に情報を追加する (2007/11/03) 28.1.4.2 ibuffer でバッファを表示させたい (2007/11/10) 28.1.4.3 ibuffer で文字コードを指定して保存 (2007/11/06)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ibuffer のバッファリストに文字コードの情報を追加します.
ibuffer はカスタマイズを自由に行うことができます.例えば,バッファリストに自分で 定義した情報を追加することもできます.
しかし,設定方法は少し分かりにくいので,ここでは簡単に説明します.
この設定で以下のように文字コードの欄を追加することができます.
MR coding Name Size Mode Filename -- ------ ---- ---- ---- -------- euc-jisx0213 abbrev.texi30301 Texi ~/www/soft/abbrev.texi euc-jisx0213 admini.texi 22671 Texi ~/www/soft/admini.texi euc-jisx0213 apel.texi 5534 Texi ~/www/soft/apel.texi euc-jisx0213 basic.texi 29697 Texi ~/www/soft/basic.texi
上で出したバッファリストを見ると,追加すべき部分は 2 つあることが分かります.一つ は,一行目の「 coding 」の部分で,もう一つは実際に文字コードが入る部分です.
さて, ibuffer ではこのバッファリストの書式は「 ibuffer-formats 」という変数で定義さ れています.これに
(setq ibuffer-formats '((mark modified read-only (coding 15 15) " " (name 30 30) " " (size 6 -1) " " (mode 16 16) " " filename) (mark (coding 15 15) " " (name 30 -1) " " filename))) |
のように追加できれば,文字コードを追加できそうです.しかし,これでは「 coding 」が何を 表示していいのか分かりません.そこで,この「 coding 」と定義します.
関数さえ書くことができれば,後は簡単でしょう.
(define-ibuffer-column ;; ibuffer-formats に追加した文字 coding ;; 一行目の文字 (:name " coding ") ;; 以下に文字コードを返す関数を書く (if (coding-system-get buffer-file-coding-system 'mime-charset) (format " %s" (coding-system-get buffer-file-coding-system 'mime-charset)) " undefined" )) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バッファの数が多くなってくると,バッファリストから,ファイルの内容を表示できると 便利です.もちろん,表示は,C-oでできます.
しかし,スクロールはできませんので,結局C-x oしてウィンドウを移動し,スク ロールさせる必要があります.
ibuffer でSPCを押すと,その行のバッファを別ウィンドウに表示できます.さら に,SPCでスクロールできます.bで逆方向にスクロールできます.
以下を.emacs に追加します.
(defun ibuffer-visit-buffer-other-window-scroll (&optional down) (interactive) (let ((buf (ibuffer-current-buffer))) (when (and buf (buffer-live-p buf)) (if (string= (buffer-name (window-buffer (next-window))) (buffer-name buf)) (if down (scroll-other-window-down nil) (scroll-other-window)) (ibuffer-visit-buffer-other-window-noselect)) (if (eq major-mode 'ibuffer-mode) () (setq buf (current-buffer)) (switch-to-buffer (get-buffer "*Ibuffer*")) )))) (defun ibuffer-visit-buffer-other-window-scroll-down () (interactive) (ibuffer-visit-buffer-other-window-scroll t)) (define-key ibuffer-mode-map " " 'ibuffer-visit-buffer-other-window-scroll) (define-key ibuffer-mode-map "b" 'ibuffer-visit-buffer-other-window-scroll-down) ;; n, p で次 (前) のバッファの内容を表示する (defadvice ibuffer-forward-line (after ibuffer-scroll-page activate) (ibuffer-visit-buffer-other-window-scroll)) (defadvice ibuffer-backward-line (after ibuffer-scroll-page-down activate) (ibuffer-visit-buffer-other-window-scroll-down)) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ibuffer でマークをしたバッファをすべて指定した文字コードで保存できます.
時々文字コードを指定してファイルを保存したい時があります.バッファが 1 つや 2 つなら 問題ないですが,多くなると 1 個 1 個文字コードを指定するのも大変です.
ibuffer でmによりマークをつけたバッファを指定した文字コードで保存できます.
以下を.emacs に追加します.
(require 'ibuffer) (define-key ibuffer-mode-map "T" 'ibuffer-do-convert-coding-system) (defun ibuffer-do-convert-coding-system (coding-system &optional arg) "Convert file (s) in specified coding system." (interactive (list (let ((default (or (and (boundp 'dired-default-file-coding-system) dired-default-file-coding-system) buffer-file-coding-system))) (read-coding-system (format "Coding system for converting file (s) (default, %s): " default) default)) current-prefix-arg)) (if (= (ibuffer-count-marked-lines) 0) (message "No buffers marked; use 'm' to mark a buffer") (let ((ibuffer-do-bufs nil)) (ibuffer-map-marked-lines #'(lambda (buf mark) (push buf ibuffer-do-bufs))) (ibuffer-unmark-all 62) (while ibuffer-do-bufs (set-buffer (car ibuffer-do-bufs)) (set-buffer-file-coding-system coding-system arg) (if (buffer-file-name) (let ((coding-system-for-write coding-system)) (save-buffer arg))) (setq ibuffer-do-bufs (cdr ibuffer-do-bufs)))))) |
ibuffer でmによりマークをつけます.その後,T を入力すると文字コードを 聞かれますので,入力します.
すると,入力した文字コードでマークをつけたバッファを保存してくれます.ファイルバッ ファでない場合は文字コードの変換だけを行います.
ファイルを保存する時,なぜか文字コードをうまく判別できずに文字コードの入力を求め られることがあります.このページはたまに 60 ページを一度に保存する必要があるので, でっちあげました.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元:2 ちゃんねる
多くのファイルを開いた状態でバッファリストを出しても,バッファが多くて非常に不便 です.
バッファリストを表示した後で,バッファ名を対象に検索することができます.そして, 一致したバッファのみが,新たなバッファリストに表示されます.
このため,バッファリストが絞り込まれ,非常に便利です.
buffer-menu や ibuffer では動作します.使用するバッファリストによっては動かない こともあります.
以下を.emacs に追加します.
(defun Buffer-menu-grep (str) (interactive "sregexp:") (goto-char (point-min)) (let (lines) (forward-line 2) (setq lines (buffer-substring (point-min) (point))) (while (re-search-forward str nil t) (let ((bol (progn (beginning-of-line) (point))) (eol (progn (forward-line) (point)))) (setq lines (concat lines (buffer-substring bol eol))))) (let ((buffer-read-only nil)) (erase-buffer) (insert lines)))) (define-key Buffer-menu-mode-map "G" 'Buffer-menu-grep) |
まず,バッファリストを表示します.そして,G とすると,バッファリストを検索 し,一致したバッファ名のみが,表示されます.
指定した拡張子のみやファイル名のみを表示したりすることができ,非常に便利です.元 に戻すのは g でできます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
grep などで,たくさんのファイルが開かれることがあります.しかし,これを一個一個 kill-buffer するのも大変です.
かといって,バッファリストでマークを付けていくのも面倒です.
バッファリストで検索を行い,一致したバッファに削除マークをつけることができます. これにより,多くのバッファを簡単に削除できます.
以下を.emacs に追加します.
(defun Buffer-menu-grep-delete (str) (interactive "sregexp:") (save-excursion (goto-char (point-min)) (forward-line 2) (while (re-search-forward str nil t) (Buffer-menu-delete)))) (define-key Buffer-menu-mode-map "R" 'Buffer-menu-grep-delete) |
以下を.emacs に追加します.
(defun Buffer-menu-grep-delete (str) (interactive "sregexp:") (save-excursion (goto-char (point-min)) (forward-line 2) (while (re-search-forward str nil t) (save-excursion (ibuffer-mark-for-delete nil) ) (end-of-line)))) (define-key ibuffer-mode-map "R" 'Buffer-menu-grep-delete) |
バッファリスト表示後にRとし,検索します.すると,一致したバッファに削除マー クが付きます.
ここで, x を押すと,そのバッファは削除されます. dired や grep の結果を表 示していて,バッファが多くなってしまった時に便利です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
あるファイルを編集している時,バッファリストで出て欲しいのはある拡張子をのファイ ルだけということがあります.
例えば, C のプログラムを書いている時のバッファリストで Elisp が候補に出てきても,あ まり意味はないでしょう.それよりは寧ろ, C に関連したもののみが表示されて欲しいと いう時もあるのではないでしょうか.
特に,多数ファイルを開いた状態では,バッファリストを表示しても,大量のリストとなっ てしまい,肝心のファイルが埋もれてしまいます.
編集中のバッファによってバッファリストを変更できます.
例えば,拡張子が「 el 」のファイルを編集しているなら,バッファリストも拡張子が 「 el 」のファイルだけにする,といったことができます.
簡単な設定サンプルは mode-buflist.el (ibuffer 用は mode-ibuffer.el) です..emacs に追加して使ってください.
この例のように「 my-buffer-menu-list 」で対象にしたいモード名と実行したい関数名 を指定します.この例では,「 Buffer-menu-grep-texi 」や「 Buffer-menu-grep-2ch 」のように検索により絞り込むものと,「 Buffer-menu-grep-default 」のように指定し た文字に一致する行を除外する設定を行っています.
この例のように設定すると,カレントバッファの名前によって以下のようにバッファリス トが変化します.
拡張子が texi のファイルのみがバッファリストに表示される
「 2ch 」という文字を含むバッファのみが表示される
バッファ名やディレクトリに「 texi 」と「 2ch 」を含まないバッファのみが表示され る
このようにモードによってバッファの絞り込みが行われるので,多数のバッファを開いて いてもバッファリストが多すぎて選びにくいということはなく,便利です.また, C-u C-x C-b とすると,通常のバッファリストになります.
ibuffer を表示した後で,cとするとあらかじめ設定しておいた条件で再表示をして くれます.
方法は,上記の ibuffer 用の設定に続けて,以下を参考に.emacs に追加します.
この例だと,aで全バッファを表示,sや2,eであらかじめ設定 しておいた条件で絞り込んで表示,mで指定した語で絞り込んで表示できます.
(defun Buffer-menu-grep-ext () (let ((str (format "%s" (read-minibuffer "Input ext: ")))) (Buffer-menu-grep-match str))) (defun ibuffer-category () (interactive) (message "S) oft 2) ch A) ll E) lisp M) atch ...") (let ((c (downcase (char-to-string (read-char)))) (co)) (cond ((string-match "s" c) (Buffer-menu-grep-texi)) ((string-match "2" c) (Buffer-menu-grep-2ch)) ((string-match "a" c) (ibuffer)) ((string-match "e" c) (Buffer-menu-grep-el)) ((string-match "m" c) (Buffer-menu-grep-ext)) (t (ibuffer-category))))) (define-key ibuffer-mode-map "c" 'ibuffer-category) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: Petit emacs lisp tips
バッファを切り替えていると,いつのまにやらバッファリストの順番が無茶苦茶になりま す.これを名前で並び換えることができます.
(defun my-sort-buffer-by (cbuf slst) ;; bury-buffer を使って、カレントバッファが先頭に来るようにソートする (cond ((eq slst '()) '()) ((eq cbuf (car slst)) (my-sort-buffer-by cbuf (reverse (cdr slst)))) (t (bury-buffer (car slst)) (my-sort-buffer-by cbuf (cdr slst))))) (defun my-sort-buffer-by-name (x y) (if (or (buffer-file-name y) (buffer-file-name x)) ;; どちらか特殊バッファならば buffer-name でソートする (string< (buffer-file-name y) (buffer-file-name x)) (string< (buffer-name y) (buffer-name x)))) (defun my-sort-buffer () "Sort buffer list by name" (interactive) (let* ((cbuf (current-buffer)) (blst (copy-sequence (buffer-list))) (slst (sort blst 'my-sort-buffer-by-name))) (my-sort-buffer-by cbuf slst))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
デフォルトではC-x bでバッファの切り替えができますが,これをもっと便利にす る方法を紹介します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
上で紹介したように C-x b でバッファを切り替えることができます.しかし,こ れは最初の文字から順番にすべて入力していく必要があり,かなり使いにくいです.そこ で, iswitchb がお勧めです.
iswitchb では,以下のようにバッファの一覧がミニバッファに出ます.
iswitch {occur.texi,*scratch*,grep.texi,*Messages*,screen.texi}
これにより,バッファを次の*scratch*, grep.texi と順番に切り替えていくことができます.
さらに,ここで例えば「 sc 」と入力します.すると,
iswitch sc{*scratch*,screen.texi}
のように,「 sc が含まれるバッファ」のみに絞られます.このため,少ないキー入力で目 的のバッファの切り替えることができます.
標準で附属してますので,特に作業は不要です.
.emacs に以下を追加します.
(iswitchb-mode 1) |
これで, C-x b とすると,バッファの一覧がミニバッファに表示されるようにな ります.
C-s,C-r でバッファの選択を切り替えていくことができます.
さらに,そのまま文字を入力すると isearch になりますので,適当に含まれている文字 を入れるだけでも選択できます.検索候補がないようなら,C-x C-f で find-file へ移行できます.
私はさらに,下のような設定を入れてキーバインドを変更しています.こうしておくと, 左右のカーソルキーやSPC でもバッファを切り替えることができます.
(add-hook 'iswitchb-define-mode-map-hook 'iswitchb-my-keys) (defun iswitchb-my-keys () "Add my keybindings for iswitchb." (define-key iswitchb-mode-map [right] 'iswitchb-next-match) (define-key iswitchb-mode-map [left] 'iswitchb-prev-match) (define-key iswitchb-mode-map "\C-f" 'iswitchb-next-match) (define-key iswitchb-mode-map " " 'iswitchb-next-match) (define-key iswitchb-mode-map "\C-b" 'iswitchb-prev-match) ) |
私はさらに,以下のようにして一部の関数を変更しました.これで, iswitchb に候補が なければ find-file になります.さらに,C-u C-x b で通常の C-x b と同 じ動作になります.
(defun iswitchb-possible-new-buffer (buf) "Possibly create and visit a new buffer called BUF." (interactive) (message (format "No buffer matching `%s', " buf)) (sit-for 1) (call-interactively 'find-file buf)) (defun iswitchb-buffer (arg) "Switch to another buffer. The buffer name is selected interactively by typing a substring. The buffer is displayed according to `iswitchb-default-method' -- the default is to show it in the same window, unless it is already visible in another frame. For details of keybindings, do `\\[describe-function] iswitchb'." (interactive "P") (if arg (call-interactively 'switch-to-buffer) (setq iswitchb-method iswitchb-default-method) (iswitchb))) |
ユーザに確認を求めるタイプもあります.作りはしたものの,いちいち答えるのが面倒な ので,上のように,問答無用で find-file になるようにしてしまいました.どうせキャ ンセルは C-g でやるし,バッファを作る機会なんてそうはないし...
(defun iswitchb-possible-new-buffer (buf) "Possibly create and visit a new buffer called BUF." (interactive) (message (format "No buffer matching `%s', [C]reate? [F]ind file? [N]o?" buf)) (let ((newbufcreated) (c (char-to-string (read-char)))) (if iswitchb-newbuffer (cond ((string-match "c" c) ;; then create a new buffer (progn (setq newbufcreated (get-buffer-create buf)) (if (fboundp 'set-buffer-major-mode) (set-buffer-major-mode newbufcreated)) (iswitchb-visit-buffer newbufcreated))) ((string-match "f" c) (call-interactively 'find-file buf) ) ((string-match "n" c) (message (format "no buffer matching `%s'" buf))) ) ;; else wont create new buffer (message (format "no buffer matching `%s'" buf))))) |
28.2.1.1 iswitchb で選択中の内容を表示 (2004/06/27) 28.2.1.2 iswitchb でバッファの情報を表示 (2003/09/18) 28.2.1.3 iswitchb で migemo を使う (2005/03/01)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元:2ch
iswitchb は非常に便利ですが,バッファ名だけでは少し分かりにくいです.
そこで,バッファ選択時にウィンドウに選択中のバッファの内容を表示させる設定を紹介します.
これにより,名前だけでは分かりにくファイルでも,バッファにファイルの内容が表示さ れるので,簡単に識別できます.
以下を.emacs に追加します.
(defadvice iswitchb-exhibit (after iswitchb-exhibit-with-display-buffer activate) "選択している buffer を window に表示してみる。" (when (and (eq iswitchb-method iswitchb-default-method) iswitchb-matches) (select-window (get-buffer-window (cadr (buffer-list)))) (let ((iswitchb-method 'samewindow)) (iswitchb-visit-buffer (get-buffer (car iswitchb-matches)))) (select-window (minibuffer-window)))) |
普通にC-x bとするだけです.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バッファを切り替えていくと,ミニバッファにバッファのモードなどが表示されます.
以下を.emacs に追加します.
dired-directory 関連のエラーが出るようなら,最初の方のコメントをはずしてください.
;;iswitchb を便利にしてみる。 ;; うざいだけかもしれんが。 ;;(defvar dired-directory nil) (defadvice iswitchb-completions (after iswitchb-completions-with-file-name activate) "選択してるときにファイル名とかを出してみる。" (when iswitchb-matches (save-excursion (set-buffer (car iswitchb-matches)) (setq ad-return-value (concat ad-return-value "\n" (cond ((buffer-file-name) (concat "file: " (expand-file-name (buffer-file-name)))) ((eq major-mode 'dired-mode) (concat "directory: " (expand-file-name dired-directory))) (t (concat "mode: " mode-name " Mode")))))))) |
C-x bをするだけです.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
iswitchb で migemo を利用し,日本語のバッファ名もローマ字入力のままで切り替える ことができる.
【叩かれて】Emacs Lisp道場【強くなれ】
iswitchb でバッファ切り替えはとても簡単になりますが,それでも日本語のバッファ名 があると面倒です.
migemo を利用して,ローマ字入力のままで日本語のバッファに切り替えることができま す.
cmigemo で設定してあります.
migemo のインストールが必要です.
以下を .emacs に追加します.
(setq iswitchb-regexp t) (setq iswitchb-use-migemo-p t) (defadvice iswitchb-get-matched-buffers (before iswitchb-use-migemo activate) "iswitchb で migemo を使ってみる。" (when iswitchb-use-migemo-p (ad-set-arg 0 (migemo-get-pattern (ad-get-arg 0))))) |
C-x b でそのままローマ字入力してみてください。日本語のバッファ名にも一致す るようになります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
たくさんバッファができた状態で次々と切り替えていく方法を紹介します.
最新の Meadow では標準で同等の機能が付けられました.C-x right (M-x next-buffer) と C-x left (M-x prev-buffer) です.
一番単純なもの.バッファを順番に切り替えていくだけの機能しかない.だけど,単純で 使いやすいので,よく使ってました.
上記を少し改造したもの.移動しないバッファを指定できる.
バッファの切り替えのみ.28.2.2.1 バッファを次々と切り替える (2003/09/18)と同じ.
バッファの切り替えのみ.ミニバッファに次に移動できるバッファが表示される点が異な る.最近は,これを愛用してます.
bsで紹介した bs-cycle-next も同じような機能があります.
バッファの切り替え.それに加えて,カーソル位置の保存を行い,順番に保存したカーソ ル位置へ移動できる.
上記とは別にカーソル巡回用としてあると便利.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: Petit emacs lisp tips
以下を.emacs に追加します. そうすると, C-,, C-.でバッファをどんどん 切り替えていくことができます.
(defun my-select-visible (blst n) (let ((buf (nth n blst))) (cond ((= n (- (length blst) 1)) (other-buffer)) ((not (= (aref (buffer-name buf) 0) ? )) buf) (t (my-select-visible blst (+ n 1)))))) (defun my-grub-buffer () (interactive) (switch-to-buffer (my-select-visible (reverse (cdr (assq 'buffer-list (frame-parameters)))) 0))) (global-set-key [?\C-,] 'my-grub-buffer) (global-set-key [?\C-.] 'bury-buffer) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元: Petit emacs lisp tips
前記のものの改良版.移動しないバッファを指定できる.
(setq my-ignore-buffer-list '("*Help*" "*Compile-Log*" "*Mew completions*" "*Completions*" "*Shell Command Output*" "*Apropos*" "*Buffer List*")) (defun my-visible-buffer (blst) (let ((bufn (buffer-name (car blst)))) (if (or (= (aref bufn 0) ? ) (member bufn my-ignore-buffer-list)) (my-visible-buffer (cdr blst)) (car blst)))) (defun my-grub-buffer () (interactive) (switch-to-buffer (my-visible-buffer (reverse (buffer-list))))) (defun my-bury-buffer () (interactive) (bury-buffer) (switch-to-buffer (my-visible-buffer (buffer-list)))) (global-set-key [?\C-,] 'my-grub-buffer) (global-set-key [?\C-.] 'my-bury-buffer) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バッファを巡回する方法です.
cyclebuffer.elをダウン ロードし,ロードパスの通ったところへ置きます.
そして,以下を.emacs に追加します.
(autoload `cyclebuffer-forward "cyclebuffer" "cycle forward" t) (autoload `cyclebuffer-backward "cyclebuffer" "cycle backward" t) (global-set-key [?\C-,] 'cyclebuffer-forward) (global-set-key [?\C-.] 'cyclebuffer-backward) |
これで,C-,とC-.でバッファの巡回ができます.
ほぼ同じようなものとして, cycle-buffer.elがあります.
使い方は同じでcycle-buffer.el をダウンロードしてロードパスの通ったところへ置き,以下を.emacs に追加します.
(autoload 'cycle-buffer "cycle-buffer" "Cycle forward." t) (autoload 'cycle-buffer-backward "cycle-buffer" "Cycle backward." t) (autoload 'cycle-buffer-permissive "cycle-buffer" "Cycle forward allowing *buffers*." t) (autoload 'cycle-buffer-backward-permissive "cycle-buffer" "Cycle backward allowing *buffers*." t) (autoload 'cycle-buffer-toggle-interesting "cycle-buffer" "Toggle if this buffer will be considered." t) (global-set-key [(f9)] 'cycle-buffer-backward) (global-set-key [(f10)] 'cycle-buffer) (global-set-key [(shift f9)] 'cycle-buffer-backward-permissive) (global-set-key [(shift f10)] 'cycle-buffer-permissive) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Windows ではソフトの切り替えがAlt-TABで可能です. これと同じような操作を実 現するのが pc-bufsw.el で す. http://www.fi.uib.no/~boukanov/emacs/index.htmlからダウンロードできま す. ダウンロードしたら, ロードパスの通ったところに置き, 以下を.emacs に追加しま す
(require 'pc-bufsw) (pc-bufsw::bind-keys (quote [C-tab]) (quote [C-S-tab])) |
あるいは
(global-set-key [?\C-,] 'pc-bufsw::lru) (global-set-key [?\C-.] 'pc-bufsw::previous) |
といった風に設定してもいい.
これでC-TabやC-Shift-Tabでバッファの一覧がミニバッファに表示され, C-Tabを何度も押すと任意のバッファが選択できるようになります.
使い勝手は上で紹介したものと同じです.違いは,
pc-bufsw.elbuf-list.texi > admini.texi
という風に,現在選択しているバッファと前後のバッファがミニバッファに表示される点 です.
ほぼ同じことをするものに, swbuff というものがあります.違いは,ミニバッファではな く,新しいバッファができ,そこに次以降に移動するバッファがずらっと表示されること です.
http://sourceforge.net/projects/emhacks/からダウンロードし,解凍します. そして,ファイルをロードパスの通ったところへ置きます.
以下を.emacs に追加します
(require 'swbuff) |
Ctrl+F6とShift+Ctrl+F6で前後のバッファへ移動できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バッファを次々と切り換える機能に加えて,カーソル位置を各グループ別に記憶させるこ とができる
ただし,いちいち登録する必要があります.
他で紹介した設定により,バッファを次々と切り替えることができます.しかし,この方 法は以下の点で不便です.
これを使うと,バッファの切り替えだけではなく,カーソル位置の記憶と記憶されたカー ソル位置を巡回することができます.
また,カーソル位置は好きな名前でグループ化できます.そのため,あるプロジェクトの ファイルは「 myproject 」として,カーソル位置を記憶させていけば,そのプロジェクト のファイルのみを巡回できます.
XEmacs: Lisp Code - MTorusからダウロードして,ロードパスの通ったところへ移動します.
以下を.emacs に追加します
(require 'mtorus) ;; 終了時に mtorus の情報をファイルに保存する時は t にする (setq mtorus-save-on-exit t) ;; mtorus のファイルを保存する場所 (setq mtorus-dirname "~/") (defalias 'mtorus-make-extent 'make-overlay) (defalias 'mtorus-set-extent-property 'overlay-put) (defalias 'mtorus-delete-extent 'delete-overlay) (defun display-message (label message &optional frame stdout-p) (message message)) (defun mtorus-default-directory () ;; mtorus のファイルを保存する場所 mtorus-dirname) (mtorus-init) (mtorus-install-suggested-bindings) ;; 起動時に mtorus のファイルを読み込む ;; 不要ならコメントにすること (mtorus-read-torus) |
デフォルトでは「 all-buffers 」というグループになっています.ここで,Shift-右カー ソルとShift-左カーソルでバッファを切り替えることができます.
これだけなら,普通のバッファ切り替えです.
そこで,f11とし,適当な名前を入れます.ここでは,「 elisp 」とでもしておきま す.これで,「 elisp 」というグループが作成されました.作成時に現在のカーソル位置 が登録されているはずなので,適当なバッファに移動し,Shift-右カーソルとして みてください.
グループ作成時の場所にカーソルが移動したはずです.
主なキーは以下の通りです.
いちいちカーソル位置を設定しないといけないのが不便ですが,そこそこ使えます.
カーソル位置が保存できますが,ファイルを開いていないと意味がありません.というか, 開いておいても駄目なの? カーソル位置の保存と読み込み関連がうまく動いていないよう に思います.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
2 つのバッファを比較したり,参照したりしながら文章を書いていると, 2 つのバッファを 頻繁に切り替える必要があります.
しかし,そのたびに C-x bで切り替えるのも面倒です.
1 コマンドで直前のバッファに切り替えることができます.
toggle-buffer.elをダウンロー ドし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(require 'toggle-buffer) |
M-x joc-toggle-buffer で直前のバッファに切り替わります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow には Buffers というメニューがあります.ここには,バッファの一覧が表示されま す.
→
左がデフォルトの Buffers メニューです. 50 個ぐらいファイルを開いている状態ですが, 表示されるのは,最近表示した 10 個程度のみになります.
そこで, msb.el を使います.これを使うと,右側のようにメニューが各階層に分かれ,分 かりやすくなります,
Meadow に附属しています.
不要です.
使い方は簡単で,M-x msb-mode とするだけです.そうすると, Buffers メニューが 変化し,モード別に分けてくれるようになります (ただし,設定されているモードのみで す) .
また,*Files by directory*というメニューを選択すると,モードではなく,ディレクト リ別にバッファリストを作ってくれるので,従来のものよりもずっと選択しやすくなりま す.
これを常に使いたい場合には,.emacs に以下を追加します.
(msb-mode 1) |
他の設定は msb.el を参照してください.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
同様のものの機能などは https://bookshelf.jp/pukiwiki/pukiwiki.php?%A5%BF%A5%D6%A4%C7%A5%D0%A5%C3%A5%D5%A5%A1%A4%F2%C0%DA%A4%EA%C2%D8%A4%A8%A4%EB Wiki にまとめられています.
のようなタブでバッファを切り替えることができます.
http://sourceforge.net/projects/emhacks/から, tabbar をダウンロードし,解 凍します.
そして,できたファイルをロードパスの通ったところへ置きます.
以下を.emacs に追加します
(require 'tabbar) |
M-x tabbar-modeでタブが表示されます.また,M-x tabbar-forwardと M-x tabbar-backwardで前後のバッファへ移動できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
入力した文字を含むバッファの一覧を表示し,そのバッファに切り替えることができる.
Elisp ML
普通はバッファの名前でバッファを切り替えますが,ある語を含むバッファに切り替えた い時もあるかもしれません.
入力した語を含むバッファを一覧表示し,そのバッファに切り替えることができます.
インストールしてません.
contentswitch.el からダウンロードしてロードパスの通ったところに置きます.
下記を .emacs に追加します.
(require 'contentswitch) |
M-x contentswitch と入力します.すると,バッファの一覧が表示され,ミニバッ ファには
string:
と表示されます.ここで,文字を入力します.すると,バッファの一覧画面が下の画像の ように表示されます.
ここで,上下キーを使って,カーソルを移動させて RET を入力すると,そのバッ ファに切り替わります.
今開いているバッファだけでなく,過去に開いたファイルも検索してくれます.
必要か? と言われるといらないかなぁとも思うけど,機能としては面白いです.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バッファの切り替えやファイルを開く時に,入力した文字に対応する候補をリアルタイム で表示してくれます
EmacsWiki
普通,バッファを切り替える時やファイルを開く時には,TAB を押すと補完候補が 表示されますが,TAB を入力しないと表示してくれず,後どれくらい入力すればい いのか分かりません.
入力した文字に対応するバッファやファイルの一覧をリアルタイムで表示してくれます. 文字を追加すると,どんどん絞り込まれていきます.
インストールしていません.
EmacsWiki(lusty-explorer.el) からダウンロードしてロードパスの通ったところへ置きます.
以下を .emacsに追加します
(require 'lusty-explorer) |
M-x lusty-file-explorer と入力します.すると,ミニバッファに普通のファイル を開くのと同じような入力と,別バッファには現在入力した文字に一致するファイルの一 覧が表示されます.文字を入力すると,どんどん絞られていきます.
M-x lusty-buffer-explorer でバッファ切り替えが利用できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
現在,カーソルがあるバッファ以外のバッファの背景色を変えることで,今,どのバッファ にカーソルがあるかを明確にします
アクティブな window を可視化する hiwin-mode。CommentsAdd Star
一つのバッファだけで作業しているなら問題ありませんが,ウィンドウを3つや4つに分割 していると,今どこにカーソルがあるかがぱっと見て分からなくなります
今,カーソルがあるバッファ以外のバッファの背景色を変えます.
これにより,今,どこにカーソルがあるのかが明確になります.
設定済みですが,デフォルトではオフとしています.
以下を .emacs に追加することで,有効になります
(setq meadow-use-hiwin-mode t) |
本家のファイルは http://ksugita.blog62.fc2.com/blog-entry-8.html にありま すが,マイナーモード化した http://github.com/tomoya/hiwin-mode/blob/master/hiwin.el の方が使いやすい と思います.
サイトからコピーして,hiwin.el として,ロードパスの通ったところに保存します.
下記を.emacsに追加します
(require 'hiwin) (hiwin-mode) |
特に使い方はなく,ウィンドウを分割すると,自動的に動きます.下図のようにカーソル が無いバッファの色が変わります.
現在,使っている背景色によっては,カーソルのないバッファの背景色がいまいちかもし れません.
その場合は,下記の変数を変更することで,背景色を変更できます.
(setq hiwin-color "gray30") |
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |