epojava logo

『epojava』その他


現状見つかっている不具合について

インデント(字下げ)問題(共通)

  emacs19以前では public/protected/private が付いたメソッドをうまくインデントしてくれません (仕様がemacs20以降とで変わっており、対処困難なため未サポートです)。
  また、 emacs20以降では標準で java2 の新機能、 public AAA = new ActionListener() {};には 対応しておらず、epojava 独自のインデントスタイル設定を行っています (cc-mode の c-vesion 5.25 及び 5.27 で動作確認)。
  これに対する影響等御座いましたら 連絡等くださいますようよろしくお願いします。

epo のランチャ起動の件(Meadow + bash)

  epjava は ant を起動する場合、 Windows 版では ANT_HOME に設定された、 D:\Java\Ant\jakarta-ant-1.4.1 というフォルダ名+\bin\ant.bat を起動するよう設定してあるのですが、そうすると bash の場合\ マークが消されてしまい、 D:JavaAntjakarta-ant-1.4.1ant.bat を起動しようとしエラーとなる模様です。
  epojava ではこの件を対処するため、 Windows 系の場合は epo のランチャ起動時にのみ cmodproxy を起動するように強制変更するようにしました。
  その設定がどうしても嫌な場合は、 epocclib-explicit-shell-file-nameepocclib-shell-file-nameepocclib-shell-command-switch が強制設定変更時の対象変数となっていますので、 ~/.emacs へ好みの設定を追加してください。
  また、shell の設定がそもそもされていない方は、 以下を ~/.emacs へ追加すると、 うまく起動するようになるかもしれません (この設定は Meadow の場合のみです)。
(require 'mw32script)
(mw32script-init)

拡張子問題(Windows 系全部)

  windows系のmule/XEmacs/Meadowで、 hogehoge.h から [prefix] ghogehoge.C(Cは大文字)を開こうとすると、 hogehoge.c(cは小文字)ファイルを開こうとしてしまいます。
  これはemacs-lispの標準関数 file-exists-p がwindows系機種の場合どちらに対しても tを返すことに起因する問題で、 現在、積極的な対処法は判明しておりません。
  一応消極的な手段として、サーチパスから .c を削除し、
(setq eponcc-src-extension '(".C" ".cc" ".ic" ".cpp" ".cxx" ".c++"))
  とすることで、hogeohge.C (Cは大文字) というファイルを開くことはできます(その場合、 hogehoge.c(cは小文字) というファイルがあると問題がでてきます)。
  尚、この種の問題は unix では発生いたしません。

[prefix] C-r を利用したファイル間ジャンプ(Windows 系全部)

   Windows には標準で fgrep -l がないため、Meadow 等で EPO をデフォルトのまま起動すると EPO の基本機能、関連ジャンプ([prefix] C-r) が効かないという現象が発生しています。

  これを回避するには、 下記のような手法のいづれかを取ります。 どれを用いても問題ないです。
  1. vector 等から grep.exe をダウンロードする。
    http://www.vector.co.jp/soft/dos/util/se008484.html?l
  2. cygwinをインストールし grep を使えるようにする。
  3. Virtually Unix (UNIX エミュレータ)を利用する。
    http://virtunix.itribe.net/
  また、上記のどの手段を用いても .emacs に以下のような設定が必要です。
(setq epo:fgrep-l "起動するgrepのexe名絶対指定 -l")
  具体例
(setq epo:fgrep-l "c:\\bin\\fgrep.exe -l")



ソースコード美文化

  醜いソースコード、 見るに耐えない汚いソースコードを受け取ったことはないですか?

  epojava では、 それら汚れたソースコードをある程度レベルまで美文化することもできます (まぁ世界には手の施しようがないほど醜悪なものも中には存在しますが……)。
  以下、epojava でソースコードをK&Rスタイルを用いて 美文化する場合の変更規則を掲載します。
  尚、この機能はepojava 画面上で M-Q を押したときに実行されます。
  1. 規則:行先頭から最初にスペース以外の文字 が現れるまでに存在する tab 文字を全てスペースに変換します。
      これは、ソースコードを印刷する場合に 極めて有効な機能です。
  2. 規則:ソースコード中に存在する tab 文字を すべてスペースに変換します。
      これは、vi で作成されたソースコードを 叩きなおすのに極めて有効な機能です。
      尚、epocclib-delete-alltabnil にすると削除しません。 デフォルトは t です。
  3. 規則:#endif/#else の最後に文字列があって、 #ifdef と対応させるのは、ANSI 標準でないので、削除する。
      また、#endif/#else の後ろにドキュメントで #ifdef と対応させるのは、同じく ANSI の意思に反するので削除する。
      尚、epocclib-erase-illegal-documentnil にすると削除しません。 デフォルトは t です。
    from
       #ifdef _HOGE_H_
           ....
       #endif _HOGE_H_ // file hoge.h is end 
    to
       #ifdef _HOGE_H_
           ....
       #endif
  4. 規則:while 等の後にある閉じ括弧に /* while */ とか書いた分かりきったドキュメントが書かれている コードは、同じく ANSI の意義を踏みにじっているので削除する。
      尚、epocclib-erase-illegal-documentnil にすると削除しません。 デフォルトは t です。
    from
       while(...) {
           ....
       } /* while */
    to
       while() {
       }
      私的には、関数前のドキュメントに、 自分のクラス/関数名を書くとか、 ソースの先頭にファイル名や含まれるクラス/関数名を書くとかするのは 保守の点からいって非常によろしくないと思ってます。
      ソフトウェアは更新/保守されるものです。 そのドキュメントを更新し忘れればいとも簡単に 「とても信用できないドキュメント(&ソースコード)」 ができあがります。 そして動作に関係ないドキュメント部の更新は人間工学的に忘れがちです。
      もしそれをどうしてもやる必要がある (カスタマが設定したソースコード製造基準で決められている/等)ならば、 計算機が関数名を張りつけるべきで、 手作業で行うことはやらない方が良いかと思います。
  5. 規則: 下記のようなソースを更正する。
      尚、epocclib-erase-illegal-documentnil にすると削除しません。 デフォルトは t です。
    from
       }
       else /* ここはelse */
       }
    to
       } else {
  6. 規則: 予約語(if等)で括弧がすぐ横にこないと 検索等で非常に面倒になることがあるので (ドキュメント生成のためリバースエンジニアリングをかけようとしたとき等) 予約語後のスペースを殺す。
      尚、epocclib-keyword-to-spacet にすると逆に1スペース入れます。 デフォルトは nil です。
    from
       if (...
    to
       if(...
  7. 規則: else if 形式で else のすぐ横に if がないようなソースを修正する。
    from
       else
       if(...
    to
       else if(...
  8. 規則: else が入り括弧の横にないようなソースは正す。
    from
       }
       else
    to
       } else
  9. 規則: K&Rスタイルに基づき入り括弧を if / else / finaly / try の横に置く。
    from
       if(...)
       {
    to
       if(...) {
    
    from
       else
       {
    to
       else {
    
  10. 規則: ただしそれがクラスまたは関数の場合(Java の場合にはクラスのみ)には、 真下に置き直す。
      尚、epocclib-function-checknil にするとこの処理は行いません。 デフォルトは t です。
    from
       void foo(...) {
    to
       void foo(...)
       {
  11. 先頭から最後までインデントを調整する。

補足:その他の設定

  epojava を使用したところ、 色が付かなくなったなどの症状がでた場合は、 次を調べてください。

色付け

  色付けの設定です。まだ色付けができていない、 というかたは ~/.emacsに以下をつけてみてください。   下記の色付け設定はちょっとの改造で、 perl や emacs-lisp、info などにも付けられます。
  詳しくは emacs の入門書を参考にしてくださいませ。
;;; font 設定
(if (not window-system)
    nil
  (set-cursor-color "black")
  (set-mouse-color "black")
  (set-background-color "white")
  (load-library "font-lock")      
  (copy-face           'default            'function-name-face)
  (set-face-foreground 'function-name-face "blue")
  (setq font-lock-function-name-face       'function-name-face)
  (copy-face           'default            'keyword-face)
  (set-face-foreground 'keyword-face       "magenta")
  (setq font-lock-keyword-face             'keyword-face)
  (copy-face           'default            'string-face)
  (set-face-foreground 'string-face        "maroon")
  (setq font-lock-string-face              'string-face)
  (copy-face           'default            'comment-face)
  (set-face-foreground 'comment-face       "blueviolet")
  (setq font-lock-comment-face             'comment-face)
  (copy-face           'default            'type-face)
  (set-face-foreground 'type-face          "firebrick")
  (setq font-lock-type-face                'type-face)
  (if (>= (string-to-int emacs-version) 20)
      (progn
	(setq c-font-lock-keywords c-font-lock-keywords-3)
	(setq c++-font-lock-keywords c++-font-lock-keywords-3)
	(setq java-font-lock-keywords java-font-lock-keywords-3)
	(add-hook 'java-mode-hook '(lambda () (font-lock-mode 1))))
    (setq c-font-lock-keywords c-font-lock-keywords-2)
    (setq c++-font-lock-keywords c++-font-lock-keywords-2))
  (add-hook 'c-mode-hook '(lambda () (font-lock-mode 1)))
  (add-hook 'c++-mode-hook '(lambda () (font-lock-mode 1))))

ando@park.ruru.ne.jp