This repository has been archived by the owner on Nov 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
/
hiwin.el
231 lines (208 loc) · 8.44 KB
/
hiwin.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
;;; hiwin.el --- Visible active window mode.
;; Copyright (C) 2009 ksugita
;; 2010 tomoya <[email protected]>
;; 2010 ksugita <[email protected]>
;; 2010 myuhe <[email protected]>
;; Author: ksugita
;; Keywords: faces, editing, emulating
;; Version: 1.02
;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Usage
;; put followings your .emacs
;; (require 'hiwin)
;;
;; if you visible active window, type M-x hiwin-mode.
;;; Changes
;; 2010-08-13 tomoya
;; myuhe さんと ksugita さんの修正をマージ
;;
;; 2010-08-13 ksugita
;; *Completions*表示時にMiniBufの表示が崩れるのを修正
;; 手動で画面リフレッシュできるようhiwin-refresh-winをinteractive化
;; 個人的な設定だったため,recenterのadviceを削除
;;
;; 2010-08-11 myuhe
;; anything関連の関数を実行した時にミニバッファが非アクティブウィンドウとして扱われる問題を修正
;; anything起動時にanythingバッファ以外のバッファが非アクティブウィンドウとなったまま戻らない問題を修正
;;
;; 2010-07-04 ksugita
;; ローカルで再スクラッチしたファイルに tomoya氏,masutaka氏の修正を反映
;; readonlyなアクティブwindowの背景色を設定できるように機能変更
;;
;; 2010-06-07 tomoya
;; マイナーモード化
;;
;; 2009-09-13 ksugita
;; ブログで公開
;; http://ksugita.blog62.fc2.com/blog-entry-8.html
;;; Code:
(defvar hiwin-deactive-color "gray30"
"非アクティブwindowの背景色")
(defvar hiwin-readonly-color "#000030"
"読み取り専用windowの背景色")
(defvar hiwin-normal-color (background-color-at-point)
"書き込み可能windowの背景色")
(defvar hiwin-ignore-buffer
'(" *Minibuf-1*" "+draft/1" "+draft/2" "+draft/3")
"ハイライト対象外buffer")
(defvar hiwin-ol-count 8
"非アクティブwindowのoverlay数")
(defvar hiwin-ol-lines 128
"非アクティブwindowの行数")
(defvar hiwin-temp-buf "*hiwin-temp*"
"作業用バッファ")
(defvar hiwin-face nil
"非アクティブwindow用face")
(defvar hiwin-ol nil
"非アクティブwindow用overlay")
(defvar hiwin-window nil
"アクティブwindowのwindow")
(defvar hiwin-buffer nil
"アクティブwindowのbuffer")
(define-minor-mode hiwin-mode
"Visible active window."
:global t
:lighter " hiwin"
:group 'hiwin
(hiwin))
(defun hiwin-create-ol ()
;; 非アクティブwindow用faceを作成
(make-face 'hiwin-face)
;; 非アクティブwindow用faceの背景色を設定
(set-face-background 'hiwin-face hiwin-deactive-color)
(let ((num 0) ;; カウンタ
(buf nil)) ;; 作業用バッファ
;; 作業用バッファを作成
(setq buf (get-buffer-create hiwin-temp-buf))
;; 作成するoverlay分を処理(ループ開始)
(while (< num hiwin-ol-count)
;; 非アクティブwindow用overlayを作成
(setq hiwin-ol (cons (make-overlay 1 1 buf nil t) hiwin-ol))
;; 非アクティブwindow用overlayの本文のfaceを設定
(overlay-put (nth 0 hiwin-ol) 'face 'hiwin-face)
;; 非アクティブwindow用overlayのEOFのfaceを設定
(overlay-put (nth 0 hiwin-ol) 'after-string
(propertize (make-string hiwin-ol-lines ?\n) 'face 'hiwin-face))
;; カウンタアップ
(setq num (1+ num))
) ;; (ループ終了)
;; 作業用バッファを削除
(kill-buffer buf)))
(defun hiwin-draw-ol ()
;; アクティブwindowのwindowを取得
(setq hiwin-window (selected-window))
;; アクティブwindowのbufferを取得
(setq hiwin-buffer (current-buffer))
(let ((num 0) ;; カウンタ
(win nil) ;; 処理対象window
(lst (window-list))) ;; 表示windowのリスト
;; 表示winndowのすべてを処理(ループ開始)
(while lst
;; 処理対象windowを取得
(setq win (car lst))
;; 処理対象windowをリストから削除
(setq lst (cdr lst))
;; 処理対象windowとアクティブwindowが一致する場合
(if (or (eq win hiwin-window) (eq win (minibuffer-window)))
(progn
;; EOB一つ前の場合,一文字進む
(if (and (eq (point) (1- (point-max)))
(> (point-max) 1))
(forward-char 1))
;; 読み取り専用か否かで背景色を変更
(if buffer-read-only
(set-background-color hiwin-readonly-color)
(set-background-color hiwin-normal-color)))
;; 処理対象windowとアクティブwindowが一致しない場合
(progn
(let ((buf (window-buffer win)))
(if (member buf hiwin-ignore-buffer)
()
;; 処理対象windowをアクティブ化
(select-window win)
;; EOBの場合,一文字戻る
(if (and (eq (point) (point-max))
(> (point-max) 1))
(backward-char 1))
;; 処理対象windowにoverlayを設定
(move-overlay (nth num hiwin-ol)
(point-min) (point-max) (current-buffer))
(overlay-put (nth num hiwin-ol) 'window win)
;; カウンタアップ
(setq num (1+ num))
))))) ;; (ループ終了)
;; アクティブwindowをアクティブ化
(select-window hiwin-window)))
(defun hiwin-delete-ol ()
(let ((num 0)) ;; カウンタ
;; 作成されたoverlay分を処理(ループ開始)
(while (< num hiwin-ol-count)
;; 非アクティブwindow用overlayを削除
(delete-overlay (nth num hiwin-ol))
;; カウンタアップ
(setq num (1+ num))
)) ;; (ループ終了)
;; 非アクティブwindow用overlayの変数を初期化
(setq hiwin-ol nil))
(defun hiwin-refresh-win ()
(interactive)
(let ((win (selected-window)) )
;; ミニバッファかanythingバッファ以外を選択している場合
(unless (or (eq win (minibuffer-window))
(eq 1 (string-match "anything" (buffer-name (window-buffer win)))))
;; 現在のウィンドウがアクティブウィンドウの場合
;; かつ,現在のバッファがカレントバッファの場合
(if (and (eq hiwin-window win) (eq hiwin-buffer (current-buffer)))
;; 読み取り専用か否かで背景色を変更
(if buffer-read-only
(set-background-color hiwin-readonly-color)
(set-background-color hiwin-normal-color)
)
;; 描画を実行
(hiwin-draw-ol)
))))
(defun hiwin ()
(if (null hiwin-ol)
(progn (hiwin-create-ol)
(add-hook 'pre-command-hook 'hiwin-refresh-win)
(add-hook 'post-command-hook 'hiwin-refresh-win)
(add-hook 'window-configuration-change-hook 'hiwin-refresh-win)
(hiwin-refresh-win)
)
(progn (hiwin-delete-ol)
(remove-hook 'pre-command-hook 'hiwin-refresh-win)
(remove-hook 'post-command-hook 'hiwin-refresh-win)
(remove-hook 'window-configuration-change-hook 'hiwin-refresh-win)
)))
(defadvice split-window-vertically
(around hiwin-split-window-vertically activate)
ad-do-it
(if hiwin-ol (hiwin-draw-ol)))
(defadvice split-window-horizontally
(around hiwin-split-window-horizontally activate)
ad-do-it
(if hiwin-ol (hiwin-draw-ol)))
(defadvice delete-window
(around hiwin-delete-window activate)
ad-do-it
(when hiwin-ol (hiwin) (hiwin)))
(defadvice other-window
(around hiwin-other-window activate)
ad-do-it
(if hiwin-ol (hiwin-draw-ol)))
(defadvice twittering-edit-close
(around hiwin-twittering-edit-close activate)
ad-do-it
(when hiwin-ol (hiwin)(hiwin)))
(provide 'hiwin)