[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35. テキストの強調表示・アウトライン (2005/04/15)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=text%20visible"
"MeadowMemo/テキストの強調表示・アウトライン"へのコメント(無し)
検索全文Elisp


この章で紹介していること

通常のテキストを編集する時に,章のタイトルだけを表示したいとか,特定の単語だけを 強調表示したいということがあります.

そこで,ここでは,テキストの強調表示や一部を隠す機能などを紹介します.

テキストを編集するためのモードなどは 33. テキスト編集のためのモード/機能 (2007/12/26) にあります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.1 構造的な文書を書く − アウトラインモード (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=outline"
"MeadowMemo/構造的な文書を書く−アウトラインモード"へのコメント(2007/12/28)
検索全文Elisp
要約

章の名前だけを一覧表示することで,文章のアウトラインを掴むことができる.

情報源

Meadow Memo Wiki の何でもアウトラインモード がとても詳しいので,そちらも参考にどうぞ.

何が問題なのか?

何章にも及ぶような,長い文章を書いていると,そのままでは全体の中で今の章がどうい う位置付けにあるか分かりません.

また,全体を見渡しにくいために,前後との関係も見えにくいものです.

何ができるのか?

このページは texinfo という形式で書いて,そのファイルを HTML に変換して作成して います.

通常は,スクリーンショット のように表示されています.これでは どのような章分けになっていて,今どこを書いているのかが分かりません.

しかし,アウトラインモードでは スクリーンショット のように章 のタイトルだけが表示されるため,全体を見渡すことができます.

2 種類のアウトラインモード

Emacs には 2 種類のアウトラインモードがあります. 1 つはメジャーモードとして動く 「 outline-mode 」で,もう一つはマイナーモードとして動く「 outline-minor-mode 」 です.

使い分けとしては,単純なテキストを書く場合には「 outline-mode 」,他のメジャーモー ドと組み合わせて使う場合には「 outline-minor-mode 」となります.

アウトラインモードの動作概要

アウトラインモードの機能を知るためにも,どのような流れで機能が実現されているかを 知っておくと,とても便利です.

2 種類とも基本的な動作は同じで,単純なので,ここで紹介しておきます.

決して難しいことではないので,ざっと概要を把握してください.

インストール方法

両方とも標準機能ですので,特にインストールや設定等は不要です.

outline-mode の使い方

まずは,メジャーモードとして機能する outline-mode の使い方を説明します.

この機能を使うためには,M-x outline-mode とします.

後は普通にテキストを入力します.ただし,

* 1 章 SKK
.....本文
** 1-1 SKK について
*** 1-1-1 SKK の歴史

のように行頭に * がある行は章とみなされます.

M-x outline-mode とすると,メニューには Show と Hide というメニューが追加さ れるので,上のように書いて適当に触ってみると,どんな動作をするか分かってくると思 います.

outline-minor-mode の使い方

次にマイナーモードとして機能するアウトラインモードを紹介します.

この機能を使うためには,M-x outline-minor-mode とします.他は基本的に, 「 outline-mode 」と同じです.

ただし,「*」を章の目印とみなすかどうかはモードにより異なります.これは, 「 outline-regexp 」で定義されてますので,各モードで M-x help-for-help v outline-regexp として確認してください.

キーバインドの変更

デフォルトのキーバインドは C-c @ C-a のように正気とは思えないキーバインド になっています.この C-c @ の部分は

 
(setq outline-minor-mode-prefix "\M-")

のようにメタキーなどに変更できるので,適当に変更するのがお勧めです.

カスタマイズ

しかし, outline は慣れてないせいか非常に使いにくい.文章を隠そうと思ってもキー が出てこない.そんな私は texinfo-mode で

 
(defun texinfo-return-key (arg)
  (interactive "P")
  (let (pos)
    (setq pos (point))
    (beginning-of-line)
    (if (re-search-forward
         "^\\(@node\\|@chapter\\|@[sub]*section\\)"
         (line-end-position) t)
        (if (= (line-end-position)
               (next-overlay-change (point)))
            (if arg
                (show-all)
              (show-entry))
          (if arg
              (hide-body)
            (hide-entry))
          (beginning-of-line))
      (goto-char pos)
      (newline-and-indent)
      )))

(define-key texinfo-mode-map
  "\C-m" 'texinfo-return-key)

のように,タイトル部分で RET を入力すると,本文を開いたり閉じたりして,通常 時には改行を入力するようにしています.C-u があれば,すべての本文を開いたり, 閉じたりしてくれます.

ただし,本文を閉じているか開いているかは overlay の開始位置を見ているだけなので, overlay を用いて改行などを表示させていると誤動作します.

35.1.1 階層を正常に判断させる方法 (2005/03/25)  
35.1.2 階層を任意に判断させる ― outline-level (2005/03/25)  
35.1.3 アウトラインモードの表示・非表示を切り替え (2005/03/25)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.1.1 階層を正常に判断させる方法 (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=outline%20detail"
"MeadowMemo/階層を正常に判断させる方法"へのコメント(無し)
検索全文Elisp

概要

アウトラインモードでは全体の概要を表示させることができます.そのために,指定され た条件から,各章のレベルを判断しています.

基本

outline の基本は

* 1. Meadow の歴史
** 1.1 Emacs
*** 1.1.1 動作条件

という構造でした.つまり,章や節は「*」で始まり,「*」の数がその深さを表わしてい ます.

上の例なら,「* 1. Meadow の歴史」がレベル 1 の深さ,「** 1.1 Emacs 」がレベル 2 の深さで,深さ 1 の下にあるということです.

で,この考え方は,他のモードでも継承されています.つまり,章,節を表わす文字は下 層に行くほど長くなる必要があるのです.

この章や節を探している変数は「 outline-regexp 」です.デフォルトは「 [*\^L]+ 」で すが,普通はモードにより上書きされています.このため,自分で設定する場合には各モー ドのフックに設定する必要があります.

ただし,先程説明したように,下層ほど長くなる必要があります.そのため, HTML で使 うために,

 
(add-hook 'yahtml-mode-hook
          '(lambda ()
             (setq outline-regexp "<h[1-6]>")
             (outline-minor-mode t)))

としても,「<h1>」も「<h2>」も同じ長さですから,全部同じ階層と見なされます.とい うことで,少し工夫して

 
(add-hook 'yahtml-mode-hook
          '(lambda ()
             (setq outline-regexp "<\\(h1\\|h2>\\|h3>.\\|h4>..\\|h5>...\\|h6>....\\)")
             (outline-minor-mode t)))

などとする必要があります.

これをきちんとやって階層を認識できるようにしておくと,アウトラインモードだけでな く ee を使う時などに非常に便利になります.

もちろん,outline-level の関数を自作するという方法もあります.しかし,これは関数 を書く必要があるため,少し難しいでしょう.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.1.2 階層を任意に判断させる ― outline-level (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=outline%20level"
"MeadowMemo/階層を任意に判断させる―outline-level"へのコメント(無し)
検索全文Elisp
要約

関数を書く必要がありますが,アウトラインの階層を自分好みに判断させることができる.

何が問題なのか?

デフォルトでは,アウトラインの階層は,一致した箇所の文字の長さで判断されます.し かし,その得られた結果が必ずしも適当とは限りません.

何ができるのか?

自分の好みに合わせた階層になるように,Emacs に正しく判断させることができます.

詳しい使い方

アウトラインの階層は, outline-level という関数で定義します.

例えば, outline-mode では

 
(defun outline-level ()
  "Return the depth to which a statement is nested in the outline.
Point must be at the beginning of a header line.  This is actually
the number of characters that `outline-regexp' matches."
  (save-excursion
    (looking-at outline-regexp)
    (- (match-end 0) (match-beginning 0))))

となっています.これは,一致した文字の長さをそのまま階層のレベルとしています.つ まり, outline-regexp で指定した正規表現に一致した文字数が 1 文字であれば,階層 1 にな りますし, 2 文字であれば階層 2 になるわけです.

で,この階層の数字が小さいものが,一番上の階層になり,数字の大きいものは,下の階 層と見なされます.

outline-level の作り方

さて,詳しいことに入る前に簡単に outline-level の動作を掴んでおきましょう.

outline-level が動く場合,まず outline-regexp で検索を行い,カーソルは階層を表す 文字の付近にあります.

したがって,階層を表す文字を取りたければ

 
(defun outline-level ()
  (interactive)
  (let ((str nil))
    (looking-at outline-regexp)
    (setq str
          (buffer-substring-no-properties
           (match-beginning 0) (match-end 0)))

という風にすることでできます.

後は,この文字に従って,

 
(defun outline-level-html ()
  (interactive)
  (let ((str nil))
    (looking-at outline-regexp)
    (setq str
          (buffer-substring-no-properties
           (match-beginning 0) (match-end 0)))

    (cond
     ((string-match "h1" str)
      ;; 階層 1 を返す
      1)
     ((string-match "h2" str)
      2)
     ((string-match "h3" str)
      3)
     ((string-match "h4" str)
      4)
     (t
     100)
     )))

といった具合に,文字に応じた階層をちゃんと返すように作ってやればいいわけです.

作った outline-level を使う

outline-level は作ったら終わりではありません.使う必要があります. outline-level はモード毎に異なるので, hook を利用します.

そのため,まず使用したい モードの hook を探します.そして,そ の hook を利用して,

 
(add-hook
 'html-mode-hook
 '(lambda ()
    (setq outline-level
          (function
           (lambda ()
             (save-excursion
               (let ((str nil))
                 (looking-at outline-regexp)
                 (setq str
                       (buffer-substring-no-properties
                        (match-beginning 0) (match-end 0)))
                 (cond
                  ((string-match "h1" str)
                   ;; 階層 1 を返す
                   1)
                  ((string-match "h2" str)
                   2)
                  ((string-match "h3" str)
                   3)
                  ((string-match "h4" str)
                   4)
                  ))))))))

という風に指定します.

コメント

うぅむ,分かりにくい...

Wiki の何でもアウトラインモード に様々な設定例がありますので,そちらも参考にするとい いでしょう.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.1.3 アウトラインモードの表示・非表示を切り替え (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=fold-dwim"
"MeadowMemo/アウトラインモードの表示・非表示を切り替え"へのコメント(無し)
検索全文Elisp
要約

アウトラインモードで現在カーソルがある行のノードをワンキーで表示したり,非表示に したりできる.

何が問題なのか?

アウトラインモードでは表示や非表示を切り替えるのに別々のキー入力が必要で混乱して しまいます.

何ができるのか?

1つの関数で,現在カーソルがある部分が表示されている状態であれば非表示に,非表示で あれば表示にすることができます.

設定済みMeadowでは

使用していませんので,インストールが必要です.

インストール方法

fold-dwim.el をダウンロードしてロードパスの通ったところへ置きます.

設定方法

以下を .emacs に追加します.

 
(autoload 'fold-dwim-toggle
  "fold-dwim"
  "try to show any hidden text at the cursor" t)
(autoload 'fold-dwim-hide-all
  "fold-dwim" "hide all folds in the buffer" t)
(autoload 'fold-dwim-show-all
  "fold-dwim" "show all folds in the buffer" t)

詳しい使い方

まず,outline-minor-mode か outline-mode にしておきます.そして,適当なところへカー ソルを移動し,M-x fold-dwim-toggle を実行します.すると,現在位置のノードを 非表示にできます.再度実行すると,隠した部分を表示させることができます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.2 テキストの一部だけを表示 − ナロイング (2005/03/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=narrowing"
"MeadowMemo/テキストの一部だけを表示−ナロイング"へのコメント(無し)
検索全文Elisp
要約

テキストの任意の箇所だけを表示することができる.その結果,その部分だけが,すべて のようになるため,各種のコマンドを実行しても他に影響を及ぼさない.

何が問題なのか?

長い文章などを書いていると,全体を表示していることにあまり意味が無くなります.

それよりはむしろ今編集している部分だけを表示できた方が M-> などでの移動も 便利になります.

何ができるのか?

リージョンで指定した範囲だけを表示できます.

このコマンドを実行すると,その部分だけがバッファの全てであると見なされる.そのた め,何らかのコマンド(置換など)を実行しても,表示されている部分だけを対象とできる.

インストール方法

標準機能ですのでインストールなどは不要です.

詳しい使い方

リージョンで指定した範囲だけを表示するのがナロイングと呼ばれる機能です.

まずリージョンを選択し,C-x n n とします.これで,リージョンの範囲内だけが 表示され,それ以外は表示されなくなります.こうしておくと,ナロイングされた範囲だ けで置換や検索ができますし,見通しもよく編集しやすくなります.

もちろん保存はファイル全体が保存されます.決してデータが消えた訳ではありません.

逆に戻すのは C-x n w でできます.

また,ページ単位でのナロイングもできます.C-x n p です.ページとは, page-delimiter で区切られた範囲であり,デフォルトでは "\C-l"(コントロール +L , C-q C-l で入力できます) です.ただし,モードによっては page-delimiter の値 は変更されます.

さらに, Emacs lisp では C-x n d とすると,今カーソルがある関数 (defun) の みがナロイングされます.

ただし,このコマンドは扱いなれていないと,面喰らうためデフォルトでは無効になって います.そのため,C-x n n としてもナロイングされず,確認を求められます.特 に問題はないので, y と答えてください.

35.2.1 ナロイングを入れ子に使う ― narrow-stack (2005/03/25)  
35.2.2 ページ単位のナロイングを便利に (2005/03/25)  
35.2.3 カーソル移動でページ移動を行う (2005/03/25)  
35.2.4 pages-directory を便利にしよう (2005/03/30)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.2.1 ナロイングを入れ子に使う ― narrow-stack (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=narrow%20stack"
"MeadowMemo/ナロイングを入れ子に使う―narrow-stack"へのコメント(無し)
検索全文Elisp
要約

通常,ナロイングは何回か繰り返しても,一番最初に戻る.これを,順番に戻っていくこ とを可能にする.

何が問題なのか?

ある範囲を選択し,C-x n n でその範囲だけを表示させます.

次に,その表示されている範囲の中でまた,C-x n n とし,ナロイングを実行しま す.さらに,,,と何回かナロイングを実行したとします.

この状態で C-x n w とすると,いきなりすべての範囲が表示されてしまいます.

何ができるのか?

C-x n w で一つ前のナロイングの状態に戻すことができるようになります.

設定済みMeadowでは

インストール済みです.普通にナロイングを使ってみてください.

インストール方法

My Emacs Contributions よりダウン ロードし,ロードパスの通ったところへ置きます.

設定方法

以下を .emacs に追加します.

 
(require 'narrow-stack)
(narrow-stack-mode)

詳しい使い方

何回かナロイングを実行した後で,C-x n w として解除すると,ナロイングの状態 が一つ前に戻るようになります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.2.2 ページ単位のナロイングを便利に (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=page-ext"
"MeadowMemo/ページ単位のナロイングを便利に"へのコメント(無し)
検索全文Elisp
要約

ページ単位のナロイングを拡張し,ページのリストなどを表示できるようにする.

何が問題なのか?

C-x n p でページ単位のナロイングができることを紹介しました.しかし,次のペー ジへ行くためには,一度 C-x n w で解除する必要があり面倒です.

何ができるのか?

次のページや前のページに簡単に移動できるようになります.

また,ページのリストなどを表示できますので,全体を把握できます.

設定済みMeadowでは

設定済みです.

インストール方法

標準で付属していますので,インストールは不要です.

設定方法

以下を .emacs に追加します.

 
(require 'page-ext)

詳しい使い方

以下のような機能が追加されます.

ページの一覧とは

==== Pages Directory: use `C-c C-c' to go to page under cursor. ====
@chapter Meadow の便利な標準機能
@section 関数への引数 - C-u
@section 様々な補完機能
@subsection 定型句の登録 - abbrev-mode
@subsubsection abbrev を補完入力 - abbrev-complete
@subsubsection 勝手に abbrev を展開しないようにする

という風に現在のページの一覧を表示してくれます.そして,カーソルを適当なページに 合わせて C-c C-c とすると,指定したページにジャンプすることができます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.2.3 カーソル移動でページ移動を行う (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=move%20page-ext"
"MeadowMemo/カーソル移動でページ移動を行う"へのコメント(無し)
検索全文Elisp
要約

ページ単位のナロイングをした状態で,バッファの先頭や末尾にカーソルを移動し,上や 下にカーソルを移動するだけで,前後のページに移動できます.

何が問題なのか?

C-x n p でページ単位のナロイングをして,次のページへ行くためには一度解除した り,C-x C-p C-n のようにする必要があり少し面倒です.

何ができるのか?

バッファの末尾にカーソルを移動して,下カーソルキーを2度入力するだけで,次のペー ジに移動できるようになります.

これにより,とても簡単にページ間移動ができるようになります.

設定済みMeadowでは

設定済みですので,そのままで利用できます.

設定方法

以下を .emacs に追加します.

 
(defadvice next-line
  (around next-line-page activate)
  (if (and
       (not (eq major-mode 'Info-mode))
       (= (save-excursion
            (end-of-line)
            (point)) (point-max))
       (not (= (point-max)
               (save-excursion
                 (save-restriction
                   (widen)
                   (point-max))))))
      ;; すぐにページを変えずに, 2 回連続で移動させた時のみ
      ;; ペーシを変える
      (if (eq last-command 'next-line)
          (narrow-to-page 0))
    ad-do-it))

(defadvice previous-line
  (around previous-line-page activate)
  (if (and
       (not (eq major-mode 'Info-mode))
       (= (save-excursion
            (beginning-of-line)
            (point)) (point-min))
       (not (= (point-min)
               (save-excursion
                 (save-restriction
                   (widen)
                   (point-min))))))
      ;; すぐにページを変えずに, 2 回連続で移動させた時のみ
      ;; ペーシを変える
      (if (eq last-command 'previous-line)
          (progn
            (narrow-to-page -1)
            (goto-char (- (point-max) 1))
            ))
    ad-do-it))

詳しい使い方

C-x n p でページ単位のナロイングにして,バッファの末尾にカーソルを移動しま す.そして,下カーソルキーを2度入力すると,次のページに移動できます.

バッファの先頭で上カーソルキーを2度入力すると,前のページに移動できます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.2.4 pages-directory を便利にしよう (2005/03/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=pages-directory"
"MeadowMemo/pages-directoryを便利にしよう"へのコメント(無し)
検索全文Elisp
要約

pages-directory でページの一覧を表示できますが,タイトルだけしか表示されません. そこで,ここでカーソルを移動するだけで,該当ページを表示させることができます.

何が問題なのか?

M-x pages-directory はページの一覧が表示できて,とても便利な機能です.しか し,ページのタイトルだけですので,どのようなページなのか詳細は分かりません.

また,C-x n p としてページ単位で表示していると,他のページの情報は表示され ません.そのため,すべてのページ情報を表示するためには,一度,C-x n w をして から,実行する必要があり不便です.

何ができるのか?

常に全ページの情報を表示するようにできます.

また,カーソル移動だけで,該当ページを別ウィンドウに表示させることができます.

設定済みMeadowでは

設定済みです.

設定方法

常に全ページの情報を表示

以下を .emacs に追加すると,M-x pages-directory を実行した時に常に全ページ の情報を表示できます.

 
(defadvice pages-directory
  (around widen activate)
  (save-restriction
    (widen)
    ad-do-it))

ジャンプした時にウィンドウを消す

以下を .emacs に追加すると,C-c C-c で移動した時に消すことができます.つい でに,RET でもジャンプできるようにしています.

 
(defadvice pages-directory-goto
  (around kill-pages-directory activate)
  (let ((cbuf (current-buffer)))
    ad-do-it
    (kill-buffer cbuf)
    (delete-other-windows)))

(define-key pages-directory-map "\C-m" 'pages-directory-goto)

カーソル移動で該当ページを表示

以下を .emacs に追加すると,pages-directory のバッファでカーソルを移動させるだけ で,該当部分を表示できます.

 
(defun pages-directory-view (&optional next)
  "Go to the corresponding line in the pages buffer."
  (interactive)
  (if (or (not pages-buffer)
          (not (buffer-name pages-buffer)))
      (other-window 1))
  (if next
      (forward-line 1)
    (forward-line -1))
  (if (or (not pages-buffer)
          (not (buffer-name pages-buffer)))
      (progn
        (setq pages-buffer nil
              pages-pos-list nil)
        (error "Buffer in which pages were found is deleted")))
  (beginning-of-line)
  (let* ((pages-number (1- (count-lines (point-min) (point))))
         (pos (nth pages-number pages-pos-list))
         (end-of-directory-p (eobp))
         (narrowing-p  pages-directory-buffer-narrowing-p))
    (pop-to-buffer pages-buffer)
    (widen)
    (if end-of-directory-p
        (goto-char (point-max))
      (goto-char (marker-position pos)))
    (if narrowing-p (narrow-to-page)))
  (if (or (not pages-buffer)
          (not (buffer-name pages-buffer)))
      (other-window 1))
  )

(defun pages-directory-view-next ()
  (interactive)
  (pages-directory-view t))

(define-key pages-directory-map '[up] 'pages-directory-view)
(define-key pages-directory-map '[down] 'pages-directory-view-next)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.3 長すぎる行を強調表示 (2003/11/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=highlight-beyond-fill-column"
"MeadowMemo/長すぎる行を強調表示"へのコメント(無し)
検索全文Elisp
要約

auto-fill-mode では自動的に指定した長さで行を折り返します.しかし,折り返した後で 編集すると,長すぎる行ができてしまいます.この Elisp は指定した長さを超えた部分だ けを強調表示します.

何ができるのか?

(setq highlight-beyond-fill-column-face 'highlight-beyond-fill-column-my-face)

のように auto-fill-mode で指定した長さを超えた部分のみ強調して表示 してくれます.

インストール方法

入手先は http://groups.google.com/groups?selm=Kykh7.6465%24sa.2682126%40news1.rdc1.sfba.home.com&output=gplain ですので,ここからダウンロードして,ロードパスの通ったところへ置きます.

設定方法

以下を参考に設定します.

 
;; フェイスの設定.他にあればそれを使ってもいい
(defface highlight-beyond-fill-column-my-face
  '((((class color)
      (background dark))
     (:foreground "DarkSeaGreen2" :bold t))
    (((class color)
      (background light))
     (:foreground "ForestGreen" :bold t))
    (t
     ()))
  "*Face used by highlight-beyond-fill-column")

(setq highlight-beyond-fill-column-face 'highlight-beyond-fill-column-my-face)
;; highlight-beyond-fill を使うモードを指定
(setq highlight-beyond-fill-column-in-modes
      '("emacs-lisp-mode"
        "texinfo-mode"
        "lisp-interaction-mode"))

(require 'highlight-beyond-fill-column)

詳しい使い方

上記で指定したモードでは自動的にオンになりますので,特に何もしなくても勝手に色が 付きます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.4 特定の文字に色をつける ― highlight-regexp (2005/04/15)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=highlight-regexp"
"MeadowMemo/特定の文字に色をつける―highlight-regexp"へのコメント(無し)
検索全文Elisp
要約

指定した文字に色を付けることで,編集しているテキストを編集しやすいように見せるこ とができる.

何が問題なのか?

モードによっては,フォントロックにより色が付けられます.しかし,それはあらかじめ 決められた限られたキーワードに限られます.この関数だけ強調したいなどといったこと はできません.

何ができるのか?

指定した正規表現に一致する文字のみを強調表示することができます.

インストール方法は?

To emacs or not to emacs から highlight-regexp.el をダウンロードし,ロードパスの通ったところへ置きます.

Meadow 2.00 には同等の機能を持つ hi-lock.el が附属しています.説明は 「35.5 特定の行に色をつける ― hi-lock (2004/03/07)」にあります.

設定方法は?

以下を.emacs に追加します.

 
(require 'highlight-regexp)

詳しい使い方は?

設定をすると,以下のキーバインドが追加されます.

例えば,C-chs カーソルとすると

カーソル

のように表示されます.フェイスは「 secondary-selection 」なので,これを

 
(set-face-foreground 'secondary-selection "black")

という風に変更できます.

35.4.1 isearch で検索中の単語をハイライト (2004/01/14)  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.4.1 isearch で検索中の単語をハイライト (2004/01/14)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=isearch%20hightlight"
"MeadowMemo/isearchで検索中の単語をハイライト"へのコメント(無し)
検索全文Elisp
要約

isearch で検索中の単語を強調表示することができます. isearch を終了しても色は消え ません.

何が問題なのか?

isearch で検索すると,一致する文字がすべて強調表示されます.しかし,その色は isearch を終了すると消えてしまいます.

何ができるのか?

isearch で検索中の単語を強調表示することができます.

設定方法

以下を.emacs に追加します.

 
(require 'hi-lock)

(defun highlight-isearch-word ()
  (interactive)
  (let ((case-fold-search isearch-case-fold-search))
    (isearch-exit)
    (hi-lock-face-buffer-isearch
     (if (and (featurep 'migemo) migemo-isearch-enable-p)
         (migemo-get-pattern isearch-string)
       isearch-string))))

(defun hi-lock-face-buffer-isearch (regexp)
  (interactive)
  (let ((face
         (hi-lock-read-face-name)))
    (or (facep face) (setq face 'rwl-yellow))
    (unless hi-lock-mode (hi-lock-mode))
    (hi-lock-set-pattern
     (list regexp (list 0 (list 'quote face) t)))))

(define-key isearch-mode-map (kbd "C-l") 'highlight-isearch-word)

詳しい使い方

isearch で検索し,この検索語に色をつけておきたいなと思ったら,C-l とします. そうすると,フェイスを聞かれますので,好きなフェイスを選びます.

これで検索中の単語に指定したフェイスにより強調表示されます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.5 特定の行に色をつける ― hi-lock (2004/03/07)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=hi-lock"
"MeadowMemo/特定の行に色をつける―hi-lock"へのコメント(無し)
検索全文Elisp

特定の行を強調して表示したいということがあります.例えば,章名や関数宣言の部分な どです.これらの行の背景色などを変えることができたら便利だと思いませんか?

Meadow にはそんな Elisp が附属しています. hi-lock.el です.

使い方は簡単.まず,M-x hi-lock-modeとします.これで,準備は完了です.

そして,M-x highlight-regexp とし,正規表現を入力します.そうすると,入力 した正規表現に一致する文字を含む行全体のフェイスを変えることができます.

このフェイスはM-x unhighlight-regexpで消すことができます (この時入力する正 規表現は自動的に作成されます) .

これでは,行全体のフェイスが変わってしまいますが,M-x highlight-phraseとす ると,一致した文字だけを変えることもできます.

ただし,ファイルを保存すると,フェイスの変更は消えてしまいます.これは,M-x hi-lock-write-interactive-patterns とすることで,保存することもできます.

サンプルは hi-lock.el になります.これを開くと,

のようになります.

hi-lock.el の設定サンプルは以下.なくても動きます.

 
;; 起動時から hi-lock を有効にする
(hi-lock-mode 1)
(define-key hi-lock-map "\C-z\C-h" 'highlight-lines-matching-regexp)
(define-key hi-lock-map "\C-zi" 'hi-lock-find-patterns)
(define-key hi-lock-map "\C-zh" 'highlight-regexp)
(define-key hi-lock-map "\C-zp" 'highlight-phrase)
(define-key hi-lock-map "\C-zr" 'unhighlight-regexp)
(define-key hi-lock-map "\C-zb" 'hi-lock-write-interactive-patterns))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.6 校正ツール ― 真鵺道 (2003/02/14)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=manued"
"MeadowMemo/校正ツール―真鵺道"へのコメント(無し)
検索全文Elisp

メールやテキストファイルで間違いを指摘する場合,どうしますか? 一つの方法は

第一条 : ロボットは他のロボットに危害を加えてはならない.
                       ^^^^^^^^
                       これは「人間」のはず.

といった風に書くことでしょう.しかし,これは,環境によっては,位置がずれますし,結構面倒 です (emacs にはこんな下線を引くための under.el がありますが,,,) .

そこで,

第一条 : ロボットは他の [ロボット/人間;だよね?] に危害を加えてはならない.

と書けば分かりやすい,というのが真鵺道 (まぬえど) という校正手法であり,その手法を Emacs で簡単に真鵺道による校正を行うことができる Lisp が manued です.

使うためには, 真鵺 道よりダウンロードし,解凍します.そして,ディレクトリ毎, site-lisp 下へコピーし ておきます (manued.el さえ,あれば動きます) .

そして,.emacs に以下を追加します.

 
(autoload 'manued-minor-mode "manued" "manuscript editing mode" t)

これで,利用できます.始めて使う場合には, tutorial/Japanese/manued.tut を開き, M-x manued-minor-modeとします.これで,基本的な操作を学ぶことができます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

35.7 ワープロのように ― enriched-mode (2003/07/15)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=enriched-mode"
"MeadowMemo/ワープロのように―enriched-mode"へのコメント(無し)
検索全文Elisp

問題点

フェイスを変更して,その結果を保存するとエラーになる環境もあるようです.原因はよ く分からない...

何が問題なのか?

Meadow はテキストエディタを核としていますので,基本的には文字色などの情報のないテ キストだけを扱います.

余談ですが, Emacs lisp で色がつくじゃないか,という意見もあるかもしれません.あれ はある条件に当て嵌まる文字を Meadow が強調して表示しているだけで,そういう情報がテ キストファイルに埋め込まれているわけではありません.したがって,別の設定を持つ Meadow で見ると見た目が変わります.

そこで,テキストファイルに任意の色を付けたりしたいということがあります.

何ができるのか?

ワープロのように,テキストに任意の色,フェイス,センタリングなどを指定できます. また,その結果を保存することもできます.

注意事項

これを使ってファイルを編集し,保存すると特殊な形式で保存されます.例えば,

Content-Type: text/enriched
Text-Width: 70

<x-color><param>red</param><center>赤字でセンタリング</center></x-color><center>
</center>

のように保存されます.このファイルを Meadow で見ると

                          赤字でセンタリング

のように見えますが,普通のエディタなどで見ると上の用に見えます.そのため,プログ ラムのソースファイルや Elisp のファイルなどで利用することはできません.

そのため,普通は text-mode と組み合わせて使います.

インストール方法と設定

標準で付属していますので,不要です.設定も必要ありません.

まずは見てみる

Meadow には enriched-mode のサンプルテキストが付属しています. 「 e:/unix/Meadow2/2.00b2/etc/enriched.doc 」にありますので,普通にC-x C-f で開いてみてください.

フォントが太字や斜体になっていたり (フォント設定が正しければ) ,色が変わっていると 思います.

使ってみる

まず適当なファイルを作ります.拡張子が「 txt 」のテキストファイルがいいでしょう. 作ったら,そのファイルを開きます.ファイルを開いて,「 text-mode 」になっていない ようなら,M-x text-modeとして,「 text-mode 」にしておくといいでしょう.

そして,M-x enriched-mode とします.

これで,「エンリッチモード」になりました.これはマイナーモードですので,他のモー ドと組み合わせて使うことができます.

enriched でのメニュー画面

それでは,適当に文字を書いてみてください.そして,それをリージョンで選択します. 次に,Ctrl+ マウスの右ボタン を押すとメニューが出ます.そのメニューの中に 「 Text Properties 」というメニューがありますので,これを選びます.すると,スクリー ンショットのようなメニューが出ます.

ここでは, Foreground Color を選び,「 Other... 」を選択します.そうすると,ミニバッ ファにカーソルが移動しますので,適当な色を選択します.ここでは,「 red 」を選択し ておきます.

すると,リージョン内の文字が赤色に変わります.こんな風に,リージョンで選択して, メニューを選択していくと,色などを変えることができるのです.

同じメニューはメニューの Edit にもありますので,そこから選択することもできます.

他に利用できるメニューは以下の通りです.ついでに,キーボードでの操作も上げておき ます.

いろいろと試してみると,楽しいでしょう.

ソフト改行とハード改行

enriched-mode を試してみると,不思議なことに気付かれたかもしれません.

例えば,

長い文章を書いている時には,リターンキー
を使って,適当に折り返していきます.しかし,再
編集すると右端が揃わ
なくなってしまいます.というこ
とで, M-q を使って,折り返しをやり
なおさせるのですが, enriched-mode ではうまく
折り返しのやり直しができないんです.

という文章があったとします.改行キーで適当に折り返しながら,編集をしたところ右端 が揃わなくなったという,よくある例です.

右端を揃えたいなと思ったら,普通は,M-qとしてやればできますが, enriched-mode では変化しません.

これは, enriched-mode が 2 種類の改行を使い分けているためです. 2 種類の改行とは「ハー ド改行」と「ソフト改行」です.

「ハード改行」とは,空行 (改行だけの行) を含む改行のことです. enriched-mode で見る と,空行なんてないように見えますが,普通のテキストエディタで見ると,RETで 改行したところはすべて空行ができています.例えば,上の例を普通のテキストエディタ で見ると, 1 行おきに文が書いてあることを確認できます.

この「ハード改行」は段落の区切りやリストの項目など,そこで改行することに意味があ る改行として使われます.したがって,M-q としても詰め込まれることがないので す.

つまり,RETC-oを押したということは,「そこで文のまとまりが切れるの で,くっつけたりしては駄目」と言っていることになるのです.

逆に「ソフト改行」は「別に意味はないけど,右端に来たから見易いように改行しておこ う」というものです.M-qで詰め込んだ際にできる改行やM-x auto-fill-modeで挿入される改行など,RETを入力しなくても改行されるものが該 当します.

普通のテキストと違い, 2 種類の改行に少し気をつけていないと,とまどうことになりま す.

ということで, enriched-mode では見た目だけのために改行を入れずに, auto-fill-mode とM-q(fill-paragraph) を活用しましょう.

詰め込みの制御

ソフト改行であれば,M-qで改行をやり直すことができます.しかし,この行だけ は右端まで行っても折り返して欲しくない時があります.

そんな時は,メニューの「 Justification → Unfilled 」を選びます.これで,この行は自 動的に折り返されることはありません.逆に「 Justification → Full 」を選ぶと,折り返 すようになります.


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]