スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

hiwin-modeの機能改修

過去に書いた「非アクティブなバッファ背景色を変更する」がtomoya氏の目に留まったらしくマイナーモード化されてたり,バグを改修してくれているそうです.(アクティブな window を可視化する hiwin-mode。 - 日々、とんは語る。

実を言うと,ローカルでこっそり実装を書き換えていたりして,微妙にtomoya氏がアップロードしてくれているものと差分があります.主な修正点は以下のとおり.

  • 関数名の変更
    機能が分かるような名称に関数名を以下のように見直し.
    • ovarlay生成関数
      hiwin-init() -> hiwin-create-ol()に変更
    • overlay削除関数
      hiwin-unload() -> hiwin-delete-ol()に変更
    • overlay描画関数
      hiwin-load() -> hiwin-draw-ol()に変更
    • 画面再描画関数
      hiwin-highlight-window() -> hiwin-refresh-win()に変更
    hiwin-refresh-winは overlayの描画の要否を判断,hiwin-draw-olは実際の描画を行う.hiwin-create-olと hiwin-delete-olはその名のとおり,overlayの生成・削除を行う.
     
  • readonlyなアクティブwindowの背景色設定を機能追加
    読み込み専用のアクティブwindowと書き込み可能なアクティブwindowで背景色を変えられるように機能追加.これは自分の設定でファイルの読み込み直後は常に readonlyにしているので,それを判別できるようにと個人的欲求から実装.切り替えのトリガには'pre-command-hookと 'post-command-hookに hiwin-refresh-win()を登録することで実現.
     
  • その他
    tomoya氏と masutaka氏にて追加いただいた機能(マイナーモード化,バグ対応)を実装

tomoya氏がgithubにリポジトリを用意してくださっているようなので,そこに登録すべきとは思うのですが,関数名とか変数名とか変えてしまっているので差分が多くて,pullにすべきなのかブランチ作るべきなのか良く分からなくて困ってます….こんなことならローカルで作成したバージョンをWebで公開しておくべきでした…

;;; hiwin.el --- Visible active window mode.

;; Copyright (C) 2009 ksugita
;;               2010 tomoya <tomoya.ton@gmail.com>
;;               2010 ksugita <ksugita0510@gmail.com>

;; Author: ksugita
;; Keywords: faces, editing, emulating
;; Version: 1.01

;; 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-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 (eq win hiwin-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 ()
  (let ( (win (selected-window)) )
    ;; ミニバッファ以外を選択している場合
    (unless (eq win (minibuffer-window))
      ;; 現在のウィンドウがアクティブウィンドウの場合
      ;; かつ,現在のバッファがカレントバッファの場合
      (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 ()
  (interactive)
  (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 recenter
  (around hiwin-recenter activate)
  ad-do-it
  (if hiwin-ol (hiwin-draw-ol)))

(provide 'hiwin)

スポンサーサイト

テーマ : UNIX/Linux
ジャンル : コンピュータ

コメントの投稿

非公開コメント

リンク
最新コメント
カテゴリー
最近の記事
月別アーカイブ
ブログ内検索
最新トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。