elscreenとの連携 elscreen.elを使っているなら,elscreen-server.elを使うことでファイルを新しいタブで開かせることができる.両者ともにNetinstallerからelscreenをインストールすると入る.使用する場合は.emacsに ;; 新しいタブで開く (require 'elscreen-server) と書いておく.これは大変快適.
gnuclient(emacsclient)が便利って話とESSのこと - もうカツ丼でいいよな
seen from Türkiye

seen from Malaysia
seen from United States
seen from United States
seen from United States
seen from China
seen from China
seen from China
seen from Türkiye
seen from Germany

seen from Switzerland

seen from Switzerland

seen from Switzerland
seen from Switzerland

seen from Switzerland
seen from United States

seen from Switzerland
seen from United States
seen from Netherlands
seen from Canada
elscreenとの連携 elscreen.elを使っているなら,elscreen-server.elを使うことでファイルを新しいタブで開かせることができる.両者ともにNetinstallerからelscreenをインストールすると入る.使用する場合は.emacsに ;; 新しいタブで開く (require 'elscreen-server) と書いておく.これは大変快適.
gnuclient(emacsclient)が便利って話とESSのこと - もうカツ丼でいいよな
Code Reading: ElScreen (4)
モードラインの初期化
mode-line-position
モードラインのうちバッファの割合や行カラム番号を表示する位置
mode-line-buffer-identification
モードラインのうちバッファ名を表示する位置
mode-line-format の mode-line-position の後に
'(elscreen-display-screen-number (" " elscreen-e21-mode-line-string))
のリストを追加している。クォートつき。elscreen-e21-mode-line-string の値を変更してモードラインを変更している。
elscreen-frame-confs を詳しく
フレームが car の連想リスト
cdr は 'screen-property、'screen-history、'modified-inquirer、'screen-to-name-alist-cache が car の連想リスト
(screen-property (1 (window-configuration #<window-configuration> #<marker at 192 in *scratch*>)) (0 (window-configuration #<window-configuration> #<marker at 380 in 2012-07-16.md>))) (screen-history 0 1) (modified-inquirer) (screen-to-name-alist-cache (1 . "*scratch*") (0 . "2012-07-16.md:elscreen.el"))))
'screen-property の cdr は連想リスト
スクリーン番号が car
cdr は (cons 'window-configuration elscreen-window-configuration) だけど elscreen-window-configuration がウィンドウ構成とマーカーのリストなので↑のようになっている
'screen-history の cdr はスクリーン番号のリスト
car が現在のスクリーン番号で cadr がひとつ前の
'modified-inquirer
リスト
elscreen-screen-modified-p と elscreen-set-screen-modified で使う
何度も変更済みと判断しないようにするために使う
ある関数で elscreen-screen-modified-p を呼び出すときに、その関数のシンボルを modified-inquirer に追加することで、同じ関数を再度呼び出したときに elscreen-screen-modified-p が偽になる
'modified-inquirer にシンボルがあるかないかで modified の判定をしている
elscreen-set-screen-modified は 'modified-inquirer をクリアする
elscreen-screen-modified-p が真のときに最終的に elscreen-set-screen-modified を呼び出すことで 'modified-inquirer をクリアしている?
'screen-to-name-alist-cache
elscreen-get-screen-to-name-alist 呼び出しで生成されるキャッシュ
Code Reading: ElScreen (3)
elscreen-frame-confs
'screen-property
car はスクリーン番号→違ってた
'screen-history
car は現在のスクリーン番号
'modified-inquirer
'screen-to-name-alist-cache
elscreen-e21-tab-update
elscreen-e21-tab-format と header-line-format をクリア
選択しているフレームのミニバッファ以外のウィンドウ
さらに条件あり→あとで
+---+--+ +---+--+------------+ |--+ +---+--+ |<->|TS| |[X]|HS|# SL HS NAME| |TS| |[X]|HS|... +---+--+ +---+--+------------+ +--+ +---+--+ or +--+------------+--+---+ |HS|# SL HS NAME|HS|[X]| +--+------------+--+---+
TS: tab separator
face: elscreen-tab-background-face
width: 0.5
HS: half space
with: 0.5
#: スクリーン番号
SL: スクリーンのステータスラベル
"+": 現在のスクリーン
"-": 直前のスクリーン
" ": 上記以外
NAME: スクリーン名
切り詰めてエスケープしたもの
この後で、window-width 分の " " を elscreen-tab-background-face で作って追加して elscreen-e21-tab-format は完成。
結果を header-line-format に設定。
'elscreen-get-screen-to-name-alist`
引数 truncate-length、padding は deprecated ってなっていたので簡単のために削除した。あとで。
まとめ
タブがどのように作成されているかがわかった
タブの更新の制御がわかってない
↑の条件の部分とか
elscreen-screen-update-hook の実行の制御とか
つまり elscreen-notify-screen-modification について
Code Reading: ElScreen (2)
コードリーディングのメモをこうやって残すのは難しい。ある程度読んでからまとめた方がいいんではないかと思ってきた。
ただ同時に、最初にコードリーディングするものとして ElScreen を選んだのは間違いだったかも。XEmacs サポートとかメニューのコードを削除して 1,500 行だけど難しい。jaspace にしておけばよかったか。。。さっそく弱音。
elscreen-start
各フレームに対して (elscreen-make-frame-confs frame 'keep)
プレフィックスキーの設定
elscreen-make-frame-confs
ElScreen で使うウィンドウ構成は (current-window-configuration) の結果と (point-marker) の結果のリスト
→ポイントも復元する
ElScreen で使うフレーム構成は current-frame-configuration のものじゃないっぽい。
'screen-property、'screen-history、'modified-inquirer、'screen-to-name-alist-cache をフレームのプロパティとして保持する連想リスト elscreen-frame-confs
elscreen-make-frame-confs はウィンドウ構成とフレーム構成を作成しておいて、後は elscreen-notify-screen-modification にまかせるかんじ
elscreen-notify-screen-modification
ElScreen の整合性をとる役目。
elscreen-set-screen-modified を呼び出して post-command-hook で elscreen-run-screen-update-hook が実行されるようにするか
'force-immediately オプションつきの場合はその場でも elscreen-run-screen-update-hook を実行する
elscreen-run-screen-update-hook は elscreen-notify-screen-modification-suppress-flag を t に束縛しながら (run-hooks 'elscreen-screen-update-hook) する
→ロード時に add-hook した 'elscreen-e21-mode-line-update や 'elscreen-e21-tab-update が実行される
Code Reading: ElScreen (1)
なるべく簡単にするために XEmacs と Emacs 21 サポートのためのコードは削除して static.el への依存関係をなくした状態。
メニューも普段使わないので、後でその辺りのコードも削除して進める。
ロードするだけで影響がありそうなもの
(make-obsolete-variable 'elscreen-tab-display-create-screen 'elscreen-tab-display-control)
elscreen-tab-display-create-screen を obsolete としてバイトコンパイラに警告させる。make-obsolete-variable は(Emacs 23.2 から?)第 3 引数をとるようになったらしい。elscreen の ChangeLog によるとバージョン 1.4.4 の前に elscreen-tab-display-create-screen から elscreen-tab-display-control にリネームしているので
(make-obsolete-variable 'elscreen-tab-display-create-screen 'elscreen-tab-display-control "1.4.4")
とするとよさそう。それとも Emacs バージョンで切り替えた方がいい?
(if (boundp 'after-make-frame-functions) ;; GNU Emacs 21 (add-hook 'after-make-frame-functions 'elscreen-make-frame-confs)) (if (boundp 'delete-frame-functions) ;; GNU Emacs 22? (add-hook 'delete-frame-functions 'elscreen-delete-frame-confs))
after-make-frame-functions と delete-frame-functions にそれぞれ elscreen-make-frame-confs と elscreen-delete-frame-confs を追加している。
after-make-frame-functions はフレームの作成後に呼ばれる関数の定義。delete-frame-functions はフレームの削除前に呼ばれる関数の定義。でも
Note that functions in this list may be called just before the frame is actually deleted, or some time later (or even both when an earlier function in delete-frame-functions' (indirectly) callsdelete-frame' recursively).
このヘルプによるとフレームが削除されるあたりで呼ばれるというのが正確っぽい。
(elscreen-screen-modified-hook-setup (recenter 'force) (change-major-mode-hook 'force) other-window window-configuration-change-hook window-size-change-functions (handle-switch-frame 'force) ;; GNU Emacs 21 (delete-frame 'force) (Info-find-node-2 'force))
フックまたは advice として elscreen-notify-screen-modification を登録している。シンボルが -(hook|function)s?$ の場合は add-hook、そうでなければ around-advice。
change-major-mode-hook
バッファのメジャーモードの変更前に実行されるフック
kill-all-local-variables によって実行される
window-configuration-change-hook
ウィンドウの設定が変更になったときに実行→あとで
window-size-change-functions
ウィンドウサイズが変更されて再描画される前に実行
handle-switch-frame
swtich-frame イベントを処理する→あとで
delete-frame
フレームを削除する
実際にフレームを削除する前に delete-frame-functions を実行する
Info-find-node-2
ヘルプなし;;
(elscreen-set-mode-to-nickname-alist 'elscreen-mode-to-nickname-alist) (elscreen-set-buffer-to-nickname-alist 'elscreen-buffer-to-nickname-alist)
それぞれ elscreen-mode-to-nickname-alist-internal と elscreen-buffer-to-nickname-alist-internal をセットアップして elscreen-notify-screen-modification を呼び出し→あとで
(elscreen-set-help 'elscreen-help)
elscreen-help-symbol-list の最後に関数 elscreen-help を追加しているだけ。
(let ((point (or ;; GNU Emacs 21.3.50 or later (memq 'mode-line-position mode-line-format) ;; GNU Emacs 21.3.1 (memq 'mode-line-buffer-identification mode-line-format))) (elscreen-mode-line-elm '(elscreen-display-screen-number (" " elscreen-e21-mode-line-string)))) (when (null (member elscreen-mode-line-elm mode-line-format)) (setcdr point (cons elscreen-mode-line-elm (cdr point)))))
モードラインの設定。あとで。
(define-key-after (lookup-key global-map [menu-bar]) [elscreen] (cons "ElScreen" (make-sparse-keymap "ElScreen")) 'buffer)
メニューの設定。あとで。
(add-hook 'elscreen-screen-update-hook 'elscreen-e21-mode-line-update) (add-hook 'elscreen-screen-update-hook 'elscreen-e21-menu-bar-update) (add-hook 'elscreen-screen-update-hook 'elscreen-e21-tab-update)
elscreen-screen-update-hook への登録。あとで。
(make-variable-buffer-local 'elscreen-e21-tab-format)
ヘルプによると大概 make-local-variable を使った方がいいらしい。
(when elscreen-startup-command-line-processing (setq command-switch-alist (append command-switch-alist '(("-elscreen-funcall" . elscreen-command-line-funcall) ("-e" . elscreen-command-line-funcall)))) (defun elscreen-e21-command-line () (when (string-match "\\`-" argi) (error "Unknown option `%s'" argi)) (setq file-count (1+ file-count)) (setq inhibit-startup-buffer-menu t) (let* ((file (expand-file-name (command-line-normalize-file-name orig-argi) dir))) (elscreen-command-line-find-file file file-count line column)) (setq line 0) (setq column 0) t) (add-hook 'after-init-hook (lambda () (add-to-list 'command-line-functions 'elscreen-e21-command-line t))))
elscreen-startup-command-line-processing はデフォルト t。あとで。
http://papaeye.tumblr.com/post/25239123557/emacs-24-elscreen のつづきで、-batch -Q -f batch-byte-compile でバイトコンパイルできない問題。
diff --git a/elscreen.el b/elscreen.el index 9695fa6..2073f05 100644 --- a/elscreen.el +++ b/elscreen.el @@ -27,7 +27,20 @@ (provide 'elscreen) (require 'alist) (eval-when-compile - (require 'static)) + (if (< emacs-major-version 24) + (require 'static) + + (defmacro static-defconst (symbol initvalue &optional docstring) + `(eval-and-compile (defconst ,symbol ,initvalue ,docstring))) + + (defmacro static-when (cond &rest body) + `(eval-and-compile (when ,cond ,@body))) + + (defmacro static-cond (&rest clauses) + `(eval-and-compile (cond ,@clauses))) + + (defmacro static-if (cond then &rest else) + `(eval-and-compile (if ,cond ,then ,@else))))) (static-defconst elscreen-on-xemacs (featurep 'xemacs)) (static-defconst elscreen-on-emacs (and (not elscreen-on-xemacs)
このパッチでバイトコンパイルできるようになった!って喜んだけど、よくよく考えると元のコードと意味が違ってた。
gist いろいろ
gist:2945078 elscreen + color-theme-solarized
elscreen のタブとモードラインのアクティブ/インアクティブの face が揃えばすっきりすると思って、
(copy-face 'mode-line 'elscreen-tab-current-screen-face) (copy-face 'mode-line-inactive 'elscreen-tab-background-face) (copy-face 'mode-line-inactive 'elscreen-tab-control-face) (copy-face 'mode-line-inactive 'elscreen-tab-other-screen-face)
こんなのを .emacs に書いてたけど、dotfiles を github に上げるときにいろいろいじってたら Emacs 23 で反映されなくなってしまった。ので elscreen-color-theme で設定しようと思ったけど elisp が読めなくて諦めて、color-theme-solarized の方にパッチを当てることにした。
emacs-23.4-mac-2.1 + elscreen + color-theme-solarized のスクリーンショット。
gist:2946715 A formula for C/Migemo
以下をひとつにまとめた。
https://github.com/mxcl/homebrew/issues/4113
https://github.com/mxcl/homebrew/issues/7005
https://github.com/mxcl/homebrew/commit/864aae58996f3bc57a0b0be1eb3ed12e8a8f2fa7
gist:2954511 ELPA supported migemo.el
.el ファイルを package-install-file できるように、CVS から migemo.el.in をエクスポートして、ヘッダやフッタを調整した。
gist:2966932 A formula for self-contained emacs-24.1-mac-3.0
self-contained な emacs-24.1-mac-3.0。/Applications に移動すると info がおかしくなるのを http://lists.gnu.org/archive/html/emacs-diffs/2012-05/msg00398.html のパッチを当てて修正。
Emacs 24 で elscreen がバイトコンパイルできない
[Emacs 24 で elscreen](https://github.com/knu/elscreen) がバイトコンパイルできないのは自分だけなのか。。。 In toplevel form: elscreen.el:154:4:Warning: make-obsolete-variable called with 2 arguments, but requires 3-4 In elscreen-get-alist-to-nickname: elscreen.el:624:8:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead In elscreen-get-screen-to-name-alist: elscreen.el:660:21:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead elscreen.el:661:22:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead In elscreen-find-screens: elscreen.el:759:9:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead In elscreen-find-screen-by-major-mode: elscreen.el:816:27:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead In elscreen-kill-others: elscreen.el:915:42:Warning: `interactive-p' is an obsolete function (as of 23.2); use `called-interactively-p' instead. elscreen.el:918:33:Warning: `interactive-p' is an obsolete function (as of 23.2); use `called-interactively-p' instead. elscreen.el:922:10:Warning: `interactive-p' is an obsolete function (as of 23.2); use `called-interactively-p' instead. elscreen.el:920:45:Warning: `interactive-p' is an obsolete function (as of 23.2); use `called-interactively-p' instead. In elscreen-jump: elscreen.el:991:48:Warning: `last-command-char' is an obsolete variable (as of at least 19.34); use `last-command-event' instead. In elscreen-help: elscreen.el:1052:24:Warning: `print-help-return-message' is an obsolete function (as of 23.2); use `help-print-return-message' instead. In elscreen-select-and-goto: elscreen.el:1164:8:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead elscreen.el:1177:43:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead In elscreen-find-and-goto-by-buffer: elscreen.el:1187:11:Warning: `interactive-p' is an obsolete function (as of 23.2); use `called-interactively-p' instead. In elscreen-find-file-read-only: elscreen.el:1213:23:Warning: `toggle-read-only' used from Lisp code That command is designed for interactive use only elscreen.el:1453:34:Warning: attempt to inline `elscreen-e21-tab-create-keymap' before it was defined elscreen.el:1462:32:Error: Symbol's function definition is void: elscreen-e21-tab-create-keymap "Symbol's function definition is void: elscreen-e21-tab-create-keymap" でググっても http://gentwoo.elisp.net/emerges/ajaxerrorlog/195526 しかヒットしない。 APEL 非依存の https://github.com/shosti/elscreen の方も In elscreen-get-screen-to-name-alist: elscreen.el:671:21:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead elscreen.el:672:22:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead In elscreen-find-screens: elscreen.el:770:9:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead elscreen.el:1463:30:Error: Symbol's function definition is void: elscreen--set-alist というエラーでダメだった。こっちは Emacs 23.4 でもバイトコンパイルできなかった。 コマンドは `MacOS/Emacs --batch -Q -f batch-byte-compile elscreen.el`。