スポンサーサイト

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

「→」が1バイトで表示されてしまう

MigMixフォントに変えて,これまで〓になっていた Unicodeな文字も正しく表示されるようになりました.ただ,これまでの M+とIPAフォントの合成フォントと違い以下の2点が気になります.

  • フォントの高さ(行間)が大きくなった
  • 一部の文字(例えば,→)が1バイトで表示される

最初のフォントの高さについては,M+ OUTLINE FONTS のフォーラムによると,追加されたグリフの関係らしく,慣れの問題と思い,個人的にあきらめの方向で考えています.もうひとつの1バイト表示される件は,見た目のバランスが悪く,慣れではどうにもならないような気がします.

「→」が1バイトで表示されるのは,恐らく(require 'cp5022x)から始まる設定が起因していると思うのですが,そもそもグリフが存在するフォントを使っているとき,この設定って必要なんでしょうか…? とりあえず,自分はしばらくの間,cp5022xの設定を外しておこうと思います.

スポンサーサイト

NTEmacs 23.2.1のビルド手順

既にgnupack Users Guide - ビルド手順で記載していますが,手順の説明を補足したものを再掲します.


ビルド環境の準備

ビルド環境を用意します.コンパイラには MinGW(TDM's GCC/mingw32 Builds),coreutilsや patchなどの UNIX系コマンドには Cygwin/を利用します.今回,環境の構築には,gnupackを使います.gnupackのインストール手順は以下のとおりです.

  1. Sourceforge.jpから最新の gnupack develを取得.(ここでは gnupack_devel-4.05a.exeと仮定)
  2. 取得した gnupack_devel-4.05a.exeを実行し,C:\に展開.
  3. C:\gnupack_devel-4.05a\bash.exeを実行.
  4. Bash上で gcc --versionを実行し,以下のように表示されることを確認.
    [/]# gcc --version
    gcc.exe (tdm-1) 4.5.1
    Copyright (C) 2010 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

ビルド前の準備

作業ディレクトリに移動します.今回は C:\tmpを作成し,そこで作業します.

[/]# # 作業ディレクトリの移動
[/]# mkdir "C:\tmp"
[/]# cd "C:\tmp"
[/c/tmp]#

ソースファイルを取得します.取得には wgetを使わずに,ブラウザからダウンロードしても問題はありません.

[/]# # ソースファイルの取得
[/c/tmp]# wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.2.tar.gz
[/c/tmp]# cksum emacs-23.2.tar.gz
4109369907 46831697 emacs-23.2.tar.gz
[/c/tmp]# tar zxf emacs-23.2.tar.gz

パッチファイルを取得します.取得には wgetを使わずに,ブラウザからダウンロードしても問題はありません.なお,wgetで取得する場合,引数で指定するURLを「'(シングルクォート)」で囲んでください.「'(シングルクォート)」がないと,bashが「&」などを構文解析してしまい,正しくファイルがダウンロードできません.

[/c/tmp]# # Emacs-23.1.92-IME+a.patchの取得
[/c/tmp]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fgnupack%2F46325%2FEmacs-23.1.92-IME%2Ba.patch.gz'
[/c/tmp]# cksum Emacs-23.1.92-IME+a.patch.gz
3263424522 22264 Emacs-23.1.92-IME+a.patch.gz
[/c/tmp]# gzip -d Emacs-23.1.92-IME+a.patch.gz

[/c/tmp]# # Emacs-23.1.92-IME_ReConversion.patchの取得
[/c/tmp]# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fgnupack%2F46325%2FEmacs-23.1.92-IME_ReConversion.patch.gz'
[/c/tmp]# cksum Emacs-23.1.92-IME_ReConversion.patch.gz
24490718 481 Emacs-23.1.92-IME_ReConversion.patch.gz
[/c/tmp]# gzip -d Emacs-23.1.92-IME_ReConversion.patch.gz

パッチファイルを適用します.パッチ適用の成功は,echo $?の実行結果0で確認できます.

[/c/tmp]# cd emacs-23.2
[/c/tmp/emacs-23.2]# # Emacs-23.1.92-IME+a.patchの適用
[/c/tmp/emacs-23.2]# patch -b -p1 < ../Emacs-23.1.92-IME+a.patch
patching file lib-src/makefile.w32-in
patching file lisp/international/w32-ime.el
patching file lisp/loadup.el
patching file nt/configure.bat
patching file src/keyboard.c
patching file src/w32.c
patching file src/w32fns.c
Hunk #10 succeeded at 6401 (offset 4 lines).
Hunk #11 succeeded at 8190 (offset 4 lines).
Hunk #12 succeeded at 8238 (offset 4 lines).
Hunk #13 succeeded at 8297 (offset 4 lines).
Hunk #14 succeeded at 8309 (offset 4 lines).
Hunk #15 succeeded at 8329 (offset 4 lines).
patching file src/w32term.c
patching file src/w32term.h
patching file src/window.c
[/c/tmp/emacs-23.2]# echo $?
0

[/c/tmp]# # Emacs-23.1.92-IME_ReConversion.patchの適用 [/c/tmp/emacs-23.2]# patch -b -p1 < ../Emacs-23.1.92-IME_ReConversion.patch patching file src/w32fns.c Hunk #1 succeeded at 3228 (offset 57 lines). [/c/tmp/emacs-23.2]# echo $? 0

バイナリファイルのアイコンは,emacs-23.2/nt/icons/emacs.icoを置換することで変更することができます.gnupackで配布しているバイナリはhttp://sourceforge.jp/projects/gnupack/downloads/46325/emacs_icon48.gz/で置換しています.


外部DLLの準備

画像フォーマットに対応させる場合,GnuWin32から以下のファイルを入手します。

なお,gnupack develを利用している場合,必要なファイルを以下に格納済みのため,個別にダウンロードする必要はありません.

[/c/tmp/emacs-23.2]# # DLLファイルの格納場所
[/c/tmp/emacs-23.2]# ls -R "C:/gnupack_devel-4.05a/app/gnuwin32/dll"
C:/gnupack_devel-4.05a/app/gnuwin32/dll:
jpeg62.dll*     libtiff3.dll*   xpm4.dll*
libpng12.dll*   libungif4.dll*  zlib1.dll*

[/c/tmp/emacs-23.2]# # ヘッダの格納場所
[/c/tmp/emacs-23.2]# ls -R "C:/gnupack_devel-4.05a/app/gnuwin32/include"
C:/gnupack_devel-4.05a/app/gnuwin32/include:
gif_lib.h       jpeglib.h       simx.h          tiffvers.h
jconfig.h       libpng12/       tiff.h          X11/
jerror.h        png.h           tiffconf.h      zconf.h
jmorecfg.h      pngconf.h       tiffio.h        zlib.h

C:/gnupack_devel-4.05a/app/gnuwin32/include/libpng12:
png.h  pngconf.h

[/c/tmp/emacs-23.2]# # ライブラリの格納場所
[/c/tmp/emacs-23.2]# ls -R "C:/gnupack_devel-4.05a/app/gnuwin32/lib"
C:/gnupack_devel-4.05a/app/gnuwin32/lib:
jpeg.def                libpng-bcc.lib          libXpm.dll.a
jpeg.lib                libtiff.def             libXpm.lib
jpeg-bcc.lib            libtiff.dll.a           libXpm-bcc.lib
libjpeg.dll.a           libtiff.lib             libz.a
libpng.dll.a            libtiff-bcc.lib         libz.dll.a
libpng.la               libungif.def            pkgconfig/
libpng.lib              libungif.dll.a          xpm.def
libpng12.def            libungif.lib            zlib.def
libpng12.dll.a          libungif-bcc.lib        zlib.lib
libpng12.la             libXpm.a                zlib-bcc.lib

C:/gnupack_devel-4.05a/app/gnuwin32/lib/pkgconfig:
libpng.pc  libpng12.pc  xpm.pc

ビルドの実行

まず configure.batを実行し,makefileを生成します.ここでは便宜上,GnuWin32の格納パスと NTEmacsのインストールパスを環境変数に設定しています.このとき,パスの区切り文字に「\(バックスラッシュ)」を指定すると make install時にパスの構文解析が失敗し,インストールが失敗するのでご注意ください.

[/c/tmp/emacs-23.2]# # GnuWin32格納パスの設定
[/c/tmp/emacs-23.2]# gnuwin32="C:/gnupack_devel-4.05a/app/gnuwin32"
[/c/tmp/emacs-23.2]# echo $gnuwin32
C:/gnupack_devel-4.05a/app/gnuwin32

[/c/tmp/emacs-23.2]# # NTEmacsインストールパスの設定
[/c/tmp/emacs-23.2]# prefix="C:/emacs"
[/c/tmp/emacs-23.2]# echo $prefix
C:/emacs

[/c/tmp/emacs-23.2]# cd nt
[/c/tmp/emacs-23.2/nt]# ./configure.bat --prefix $prefix --no-debug --with-gcc --no-cygwin --enable-w32-ime --cflags -O3 --cflags -fno-tree-vectorize --cflags -funsigned-char --cflags -mthreads --cflags -pipe --cflags -DRECONVERSION --cflags -D_UNICODE --cflags -I"$gnuwin32/include" --ldflags -L"$gnuwin32/lib"
Checking for 'cp'...
Checking for 'rm'...
Checking for Windows Version ...
Checking whether W32 API headers are too old...

C:\tmp\emacs-23.2\nt>gcc -O3 -fno-tree-vectorize -funsigned-char -mthreads -pipe -DRECONVERSION -D_UNICODE -IC:\gnupack_devel-4.05a\app\gnuwin32\include -DWINVER=0x0501 -mno-cygwin -c junk.c
Using 'gcc'
Checking for libpng...
...PNG header available, building with PNG support.
Checking for jpeg-6b...
...JPEG header available, building with JPEG support.
Checking for libgif...
...GIF header available, building with GIF support.
Checking for tiff...
...TIFF header available, building with TIFF support.
Checking for libXpm...
...XPM header available, building with XPM support.

<snip>

Emacs successfully configured.
Run `make' to build, then run `make install' to install.

なお,configure.batの結果,「XXX header available, building with XXX support.」にならずに「xxx.h not found, building without XXX support.」と表示された場合,画像関連のライブラリが正しく設定できていないため,画像フォーマット対応のバイナリは作成できませんのでご注意ください.特に simx.hは見逃しがちのようなのでご注意ください(xpm-3.5.1-1-src.zipsrc/xpm/3.5.1/libXpm-3.5.1-src/lib/simx.hにあります)

画像フォーマットのサポートが不要な場合,configure.batを以下のように実行してください.

[/c/tmp/emacs-23.2/nt]# ./configure.bat --prefix $prefix --no-debug --with-gcc --no-cygwin --enable-w32-ime --cflags -O3 --cflags -fno-tree-vectorize --cflags -funsigned-char --cflags -mthreads --cflags -pipe --cflags -DRECONVERSION --cflags -D_UNICODE --without-png --without-jpeg --without-gif --without-tiff --without-xpm

makefaileが作成できたら,makeを実行します.今回,コンパイラに MinGW(TDM's GCC/mingw32 Builds)を使用するので,makeコマンドは mingw32-makeを使います.

なお,makeの際,コンパイルオプションを指定することでビルド環境に最適なバイナリを生成することも可能です.ちなみに,私の環境(Intel Core2Duo 6600/Memory 2GB)で mingw32-make bootstrapは約30分かかりました.

[/c/tmp/emacs-23.2/nt]# mingw32-make ARCH_CFLAGS="-c -march=pentium-m -msse4.1 -mfpmath=sse -pipe" bootstrap

makeが成功したら,make installを実行し,画像関連のDLLを emacs.exeと同じディレクトリにコピーしてビルド終了です.

[/c/tmp/emacs-23.2/nt]# mingw32-make install
[/c/tmp/emacs-23.2/nt]# cp $gnuwin32/dll/* $prefix/bin

ビルドした NTEmacsは C:\emacs\bin\runemacs.exeの実行で起動できます.NTEmacsの起動後に M-: (eval 'image-types)と実行して,「(png gif tiff jpeg xpm xbm pbm)」が表示されれば画像フォーマットのサポートができていることが確認できます.

hiwin-modeで*Completions*表示時にMiniBufの表示が崩れるのを修正

ミニバッファも描画対象になっていたバグを修正しました.
tomoya氏の用意した githubのリポジトリに登録しようと思ったんだけど,イマイチやり方が分からず挫折…
githubもおいおい勉強していこうと思います.

とりあえず,http://sourceforge.jp/projects/gnupack/downloads/48407/hiwin-1.02.el.gz/においてみました.
;;; 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.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 ksugita
;; *Completions*表示時にMiniBufの表示が崩れるのを修正
;; 手動で画面リフレッシュできるようhiwin-refresh-winをinteractive化
;; 個人的な設定だったため,recenterのadviceを削除
;; 
;; 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 6
  "非アクティブwindowのoverlay数")
(defvar hiwin-ol-lines 96
  "非アクティブ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))

      ;; ミニバッファ以外を選択している場合
      (unless (eq win (minibuffer-window))
        ;; 処理対象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 ()
  (interactive)
  (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)))

(provide 'hiwin)

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
ジャンル : コンピュータ

gnupack 1.00aリリース

 gnupack 1.00aの主な変更点は以下のとおりです.
  • NTEmacsを 23.1から pretest 23.1.92にバージョンアップ.
  • それに伴い,IME変換中にAbortするバグを改修(したはず).
  • VL ゴシックフォントファミリーを 20100126にバージョンアップ.
  • 4422byte以上クリップボードに格納すると Bash起動できないバグを改修.

 NTEmacsについてですが,私が使っていた NTEmacs23.1は,IME変換中に Abortが発生することが多々ありました.自分の力量ではソースで問題の切り分けができなかったため,これまでファイルを自動保存するなどの方法で対処していました.
 pretest 23.1.92がリリースされたという話を聞いて,コンパイルしたところ,とりあえず Abortはしなくなったので gnupackにも取り込んでみました.
リンク
最新コメント
カテゴリー
最近の記事
月別アーカイブ
ブログ内検索
最新トラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。