🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fj.editor.xemacs
6 messages
6 total messages Started by Atushi Shinmura Tue, 14 Aug 2001 13:59
[Q] c,c++ font-lock on XEmacs
#264
Author: Atushi Shinmura
Date: Tue, 14 Aug 2001 13:59
66 lines
3474 bytes
新村です。

XEmacs 21.4.3 on Linux(RedHat 7.0 base MLD-5 Kernel 2.4.0) Gateway2000 
Pentinum 200Mhz)で使っております。

標記のように、C,C++のソース編集が多いのですが、cc-mode と、font-lockに
よる色付けで躓いております。

例えば、

void funk(int foo){
    int count, //カウンタ
        var1,  //変数1
        var2; //変数2
.......................
}
という具合にコーディングし、各パラメータを色分けしたいのですが、count
以下の、var1,var2が色分けされません。www.xemacs.orgでサンプルのスク
リーンショットを見ると、上記コーディングで、ちゃんと色分けされており、
何を指示すれば、そうなるのか判りません。

尚、コメント部分やC++のクラス宣言以下の着色についても、予約語だけと言
う感じで、上記サンプルのスクリーンショットのように、メンバまで色分けさ
れていません。

Webで参考になりそうなポインタを探しましたが見つけられませんでした。
ずっと以前にXEmacs20.4 の頃に、人様の.emacsの設定を頂いてきて使ってい
たのですが、システムそのものを何度もバージョンアップしている間に、その
頃の.emacsを失ってしまいました。

「ここが参考になるよ」というポインタだけでも構いませんし、お使いになっ
ている設定で「充分使えているよ」の設定例でも構いません。

何とか、C,C++ で、XEmacsらしい、使い勝手にカスタマイズする方法をご教示
頂けませんでしょうか。よろしくお願い致します。

尚、現在の Cモードの設定です。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; C及びC++ソースの編集に関する設定                                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'cc-mode)
;; Kernighan & Ritchie スタイルにする
(setq c-default-style "k&r")
;; BackSpace キーを「賢く」し,インデント幅は4桁,タブはスペースに展開
(add-hook 'c-mode-common-hook
     	  '(lambda ()
             (progn
               (c-toggle-hungry-state 1)
               (setq c-basic-offset 4 indent-tabs-mode nil))))

;; .hpp と .h を C++ の拡張子とする(.h の方は余計かも)
(setq auto-mode-alist
      (append
       '(("\\.hpp$" . c++-mode)
         ("\\.h$"   . c++-mode)
         ) auto-mode-alist))
;
; 色付きのモードにします。
;
(cond (window-system
	(require 'font-lock)))

以上よろしくお願い致します。

-- 
Atushi Shinmura mailto:atushi.shinmura@nifty.ne.jp
Re: [Q] c,c++ font-lock on XEmacs
#265
Author: Katsumi Yamaoka
Date: Wed, 15 Aug 2001 01:52
55 lines
4193 bytes
こんにちは山岡と申します。C や C++ はほとんどわかりません。

>>>>> In <9lbar7$h5g$1@news511.nifty.com>
>>>>>	Atushi Shinmura <atushi.shinmura@nifty.ne.jp> wrote:

新村さん> XEmacs 21.4.3 on Linux(RedHat 7.0 base MLD-5 Kernel 2.4.0)
新村さん> Gateway2000 Pentinum 200Mhz)で使っております。標記のように、
新村さん> C,C++のソース編集が多いのですが、cc-mode と、font-lockによる
新村さん> 色付けで躓いております。例えば、

新村さん> void funk(int foo){
新村さん>     int count, //カウンタ
新村さん>         var1,  //変数1
新村さん>         var2; //変数2
新村さん> .......................
新村さん> }
新村さん> という具合にコーディングし、各パラメータを色分けしたいのです
新村さん> が、count以下の、var1,var2が色分けされません。www.xemacs.org
新村さん> でサンプルのスクリーンショットを見ると、上記コーディングで、
新村さん> ちゃんと色分けされており、何を指示すれば、そうなるのか判りま
新村さん> せん。

すみませんが、具体的な絵の URL とどの部分なのかを教えていただけ
ませんか?
最近 font-lock の着色ルールを拡張する用があって font-lock.el を
読み下したのですが、C や Lisp などのメジャーなモードで使うルール
はかなりの労作であることがわかりました。font-lock に関することで
比較的簡単にカスタマイズできるのはあらかじめ用意されている face
の色 (*1) と着色の度合い (*2) くらいで、着色のルールに踏み込むに
は font-lock をかなり深く理解する必要があります。

(*1) 例えば `font-lock-type-face' の色は M-x edit-faces とか
     M-x customize-face を使ったり、.emacs に何か書くことで変え
     ることができます。

(*2) `font-lock-maximum-decoration' というオプションで指定します。
     C や C++ では 3 段階用意されており、例えば

     (setq font-lock-maximum-decoration
	   '((c++-mode . 2) (c-mode . 1) (t . t)))

     とすると c++-mode ではレベル 2、c-mode ではレベル 1 になり、
     数が大きいほど派手になります。レベル t は最大を意味し、C や
     C++ では 3 と同義です。なお `font-lock-maximum-decoration'
     のデフォルト値は単なる t で、すべてのモードで最大レベルの着
     色をします。この設定を変えた後で手っ取り早く確認するには
     M-x font-lock-mode を 2 回実行すれば良いでしょう。

さて、新村さんの個人設定で font-lock の動作に影響するものは無い
ので、現在見えるものが普通の動作なのではないでしょうか。
font-lock は xemacs.org の絵が作られた後でいろいろ変わっているで
しょうし、もしかすると KarlHeg さんなどは特別なことをやっている
のかもしれないので、直接尋ねてみるのも手かもしれませんね。
-- 
Katsumi Yamaoka <yamaoka@jpl.org>
Re: [Q] c,c++ font-lock on XEmacs
#266
Author: Atushi Shinmura
Date: Wed, 15 Aug 2001 07:31
65 lines
4373 bytes
新村です。お世話になります。

Katsumi Yamaokaさんの<yosu3d6u6qdn.fsf@jpl.org>から

>すみませんが、具体的な絵の URL とどの部分なのかを教えていただけ
>ませんか?

申し訳ありません。Cモードでの変数を複数行で着色したもののURLがわからな
くなりました。C++については、xemacs.orgから辿る、
http://my.gnus.org/mig.php?pageType=folder&currDir=./XEmacs
にあります。ここにも、Cモードのスクリーンショットがありますが、別物で
す。但し、C,C++モードともに、コメントの着色、クラス宣言部分の色分けな
どができています。C++モードは、スクリーンショットの通りにできれば十分
なのですが、Cモードの方は、件の複数行にわたる変数の記述を何とかしたい
のです。(ここに、コメントを書きますので・・・ 全く同じパターンのスク
リーンショットがあったのに・・・)

>比較的簡単にカスタマイズできるのはあらかじめ用意されている face
>の色 (*1) と着色の度合い (*2) くらいで、着色のルールに踏み込むに
>は font-lock をかなり深く理解する必要があります。

はい。関連ページを検索していまして、いずれのサンプルにあっても、相当複
雑な指定をしていましたので、往生しています。cc-modeのinfo程度を見てい
るだけでは理解不能なものばかりですね。まして、font-lockですから。

>(*1) 例えば `font-lock-type-face' の色は M-x edit-faces とか
>     M-x customize-face を使ったり、.emacs に何か書くことで変え
>     ることができます。
>
>(*2) `font-lock-maximum-decoration' というオプションで指定します。
>     C や C++ では 3 段階用意されており、例えば
>
>     (setq font-lock-maximum-decoration
>	   '((c++-mode . 2) (c-mode . 1) (t . t)))
>
>     とすると c++-mode ではレベル 2、c-mode ではレベル 1 になり、
>     数が大きいほど派手になります。レベル t は最大を意味し、C や
>     C++ では 3 と同義です。なお `font-lock-maximum-decoration'
>     のデフォルト値は単なる t で、すべてのモードで最大レベルの着
>     色をします。この設定を変えた後で手っ取り早く確認するには
>     M-x font-lock-mode を 2 回実行すれば良いでしょう。

了解しました。幸い、サンプルになりそうな .emacs がありましたので試行錯
誤してみます。

>さて、新村さんの個人設定で font-lock の動作に影響するものは無い
>ので、現在見えるものが普通の動作なのではないでしょうか。

ええ。プレーンな状態に戻しました(というか、あちこちのサンプルを継ぎ接
ぎして自分でも訳がわからなくなってしまいましたので)。

>font-lock は xemacs.org の絵が作られた後でいろいろ変わっているで
>しょうし、もしかすると KarlHeg さんなどは特別なことをやっている
>のかもしれないので、直接尋ねてみるのも手かもしれませんね。

Gnusの方に傾斜なさっているようで、ページの方には、一応上記 C,C++のサン
プルスクリーンショットを置いてあるのですけど、設定例とかは置いてないよ
うです。どう考えても、彼のページで C モードの目的の例を見たように思う
のですが、見当たらない・・・

うーーん。メジャーモードで且つ、誰でも使うコーディングスタイルだと思う
のですけれど・・・

-- 
Atushi Shinmura mailto:atushi.shinmura@nifty.ne.jp
Re: [Q] c,c++ font-lock on XEmacs
#267
Author: Katsumi Yamaoka
Date: Wed, 15 Aug 2001 12:37
56 lines
4023 bytes
;; 新村さん、私信で詳しく説明して下さってありがとうございました。

>>>>> In <9ld8fs$t6i$1@news512.nifty.com>
>>>>>	Atushi Shinmura <atushi.shinmura@nifty.ne.jp> wrote:

山岡> すみませんが、具体的な絵の URL とどの部分なのかを教えていただけ
山岡> ませんか?

新村さん> 申し訳ありません。Cモードでの変数を複数行で着色したもののURL
新村さん> がわからなくなりました。C++については、xemacs.orgから辿る、
新村さん> http://my.gnus.org/mig.php?pageType=folder&currDir=./XEmacs
新村さん> にあります。ここにも、Cモードのスクリーンショットがあります
新村さん> が、別物です。但し、C,C++モードともに、コメントの着色、クラ
新村さん> ス宣言部分の色分けなどができています。C++モードは、スクリー
新村さん> ンショットの通りにできれば十分なのですが、Cモードの方は、件
新村さん> の複数行にわたる変数の記述を何とかしたいのです。(ここに、コ
新村さん> メントを書きますので・・・ 全く同じパターンのスクリーンショッ
新村さん> トがあったのに・・・)

http://my.gnus.org/mig.php?currDir=./XEmacs&pageType=image&image=c%2B%2B.gif

これは font-lock のデフォルトとは違うみたいですね。新村さんが以
前に使っていらっしゃった設定もかなり凝ったものだったのではないで
しょうか。と言うのは、font-lock.el を読み直してみると、やはり

int foo,
    bar;

のような場合、二行目は fontify の対象にならないようなのです。
これは XEmacs に限らず Emacs 20 や 21 も同じでした。でもお気持ち
はよくわかるので、何とかならないか考えてみました。

(defadvice font-lock-match-c++-style-declaration-item-and-skip-to-next
  (before work-with-the-next-line activate)
  "Advised to work with the next line."
  (if (and (= (point) (ad-get-arg 0)) (eolp))
      (progn
	(end-of-line 2)
	(ad-set-arg 0 (point))
	(beginning-of-line))))

これを例えば .emacs に書いておくと、目的の半分は達成できます。
半分と言う意味は、find-file した直後には効くのですが、on the fly
でコードを書いている最中には効果が無いことです。その場合でも
M-x font-lock-mode を 2 回実行して fontify し直せば着色されるの
ですが。

これの元の関数は、"int foo," を着色した後で、さらに残りの対象を
探すためのものです。でも残りを探す範囲が行末までなので、それを次
の行末まで拡張してみたわけですが、その逸脱がうまくいかない原因な
のかもしれません。とりあえず今日のところはここまでです。

;; fj.editor.emacs に引き続いて、再び塚本さんがズバリと切り込ん
;; でくれると嬉しいなあ。:-p
-- 
Katsumi Yamaoka <yamaoka@jpl.org>
Re: [Q] c,c++ font-lock on XEmacs
#268
Author: Atushi Shinmura
Date: Wed, 15 Aug 2001 21:36
67 lines
4428 bytes
新村です。 フォロー有難うございます。

Katsumi Yamaokaさんの<yosud75x8pns.fsf@jpl.org>から

>http://my.gnus.org/mig.php?currDir=./XEmacs&pageType=image&image=c%2B%2B.gif
>
>これは font-lock のデフォルトとは違うみたいですね。新村さんが以
>前に使っていらっしゃった設定もかなり凝ったものだったのではないで
>しょうか。と言うのは、font-lock.el を読み直してみると、やはり
>
>int foo,
>    bar;
>
>のような場合、二行目は fontify の対象にならないようなのです。

はい。確か、100行前後にもなる力作だったと思います。作者本人が現在お
りませんので、確かめる術もないのですが、米国のサイトから貰って来た物を
手直ししただけだということです。 mule,XEmacs20.X で同様に動作しており
ました。文句のつけようのない出来映えだったので、中身を調べることもなし
に頼っておりました。

>これは XEmacs に限らず Emacs 20 や 21 も同じでした。でもお気持ち
>はよくわかるので、何とかならないか考えてみました。
>
>(defadvice font-lock-match-c++-style-declaration-item-and-skip-to-next
>  (before work-with-the-next-line activate)
>  "Advised to work with the next line."
>  (if (and (= (point) (ad-get-arg 0)) (eolp))
>      (progn
>	(end-of-line 2)
>	(ad-set-arg 0 (point))
>	(beginning-of-line))))
>
>これを例えば .emacs に書いておくと、目的の半分は達成できます。
>半分と言う意味は、find-file した直後には効くのですが、on the fly
>でコードを書いている最中には効果が無いことです。その場合でも
>M-x font-lock-mode を 2 回実行して fontify し直せば着色されるの
>ですが。

うーーん。すぐさま試してみたのですが、コードを読みこみ、着色のプログレ
スバーが画面下側に出てきて、90%ぐらいまで進むのですが、そこから先に
いかずに、ずっと処理中になってしまいました。単純に、付けたしてみたり、
自前の部分の、font-lockの起動部分をはずしてみたりしたのですが、変わり
ませんでした。何故だろう?入れ方がまずかったかな。

>これの元の関数は、"int foo," を着色した後で、さらに残りの対象を
>探すためのものです。でも残りを探す範囲が行末までなので、それを次
>の行末まで拡張してみたわけですが、その逸脱がうまくいかない原因な
>のかもしれません。とりあえず今日のところはここまでです。

お手間取らせて申し訳ありません。でも、山岡さんの書かれた設定を見てい
て、何だか基本的な考え方というのが少し見えて来ました。そうか。次行を調
べもって作業を進めるわけですね。

もう一度、これをヒントに、調べてみます。有難うございました。

PS:私信にて、ご送付したC++のコードは、Linuxでは、ncrsesでしたね。
#include<curses.h>を#include<ncruses.h>に、コンパイルは、
g++ sample.C -lncurses -o sample でお願い致します。ついでに、
void EditBox::inschar(int e) の最後、
move(home_y, home_x);は
move(home_y, home_x + col); が正しいです。勘違いしてました。ソースの
冒頭で、キー定義してあるのですが、Linuxでは入力とCtr-u のリフレッシュ
とCtr-q の終了処理だけが効いてますね。悩みが増えた^^;

-- 
Atushi Shinmura mailto:atushi.shinmura@nifty.ne.jp
Re: [Q] c,c++ font-lock on XEmacs
#269
Author: Katsumi Yamaoka
Date: Thu, 16 Aug 2001 13:12
75 lines
4387 bytes
>>>>> In <9leq0g$15s$1@news512.nifty.com>
>>>>>	Atushi Shinmura <atushi.shinmura@nifty.ne.jp> wrote:

新村さん> うーーん。すぐさま試してみたのですが、コードを読みこみ、着色
新村さん> のプログレスバーが画面下側に出てきて、90%ぐらいまで進むの
新村さん> ですが、そこから先にいかずに、ずっと処理中になってしまいまし
新村さん> た。

ごめんなさい無限ループが起きていました。これなら大丈夫だと思うの
ですが、いかがでしょうか。

(defadvice font-lock-match-c++-style-declaration-item-and-skip-to-next
  (around work-with-the-next-line activate)
  "Advised to work with the next line."
  (if (<= (point) (ad-get-arg 0))
      (let ((opoint (if (and (= (point) (ad-get-arg 0))
			     (eolp)
			     (not (eobp)))
			(prog1
			    (point)
			  (while (and (zerop (forward-line 1))
				      (looking-at "[\t ]*$")))
			  (end-of-line)
			  (ad-set-arg 0 (point))
			  (beginning-of-line)))))
	ad-do-it
	(if (and (not ad-return-value) opoint)
	    (goto-char opoint)))
    (goto-char (ad-get-arg 0))
    (setq ad-return-value nil)))

ただしこれはまだ、

山岡> find-file した直後には効くのですが、on the fly でコードを書いて
山岡> いる最中には効果が無いことです。

この問題を解決していません。
font-lock は行単位の動作が主のようで、以下の 2 行目が改変された
場合はその行を fontify し直すかどうかを調べるのですが、

int foo,
    bar;

font-lock-keywords にはその行だけにマッチするキーが無いので着色
が解除されてしまいます。それは、着色が解除された後で 1 行目を書
き換えると色が復活することからもわかります。そういうわけで、

新村さん> 確か、100行前後にもなる力作だったと思います。作者本人が現
新村さん> 在おりませんので、確かめる術もないのですが、米国のサイトから
新村さん> 貰って来た物を手直ししただけだということです。 

それはかなりすごいものなのだと思えてきました。たぶんぼくのアプロー
チとは違って keywords そのものを書き換えてしまうタイプではないか
と思うのですが、オリジナルの font-lock では

(match-beginning 13)

などというすさまじい正規表現が使われているので、一朝一夕にできる
ものではないでしょう。ぼくは、また折を見て挑戦しようと思いますが。

ところで、新村さんは font-lock を素のままで使っていらっしゃいま
すよね(?)。よろしければ XEmacs に付属している lazy-shot を併用す
るのはいかがでしょうか。たぶん

(add-hook 'font-lock-mode-hook 'turn-on-lazy-shot)

これだけで良いと思います。
これは人によっては気持ち悪いかもしれませんが、ともかく起動が速く
なります。etc/sample.init.el で紹介されている lazy-lock の方が見
え方がずっと綺麗なのですが、残念ながら致命的なバグがあります。

;; http://list-archive.xemacs.org/xemacs-beta/200106/msg00314.html
;; だれも相手してくれなかったのは変な英語のせいかしら。(^^;;)
-- 
Katsumi Yamaoka <yamaoka@jpl.org>
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads