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

33. テキスト編集のためのモード/機能 (2007/12/26)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=text%20mode"
"MeadowMemo/テキスト編集のためのモード/機能"へのコメント(無し)


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



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

33.1 テキストの編集 ― text-mode (2003/11/07)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=text-mode"
"MeadowMemo/テキストの編集―text-mode"へのコメント(無し)

テキストの編集というと, text-mode でしょう.これは,M-x text-modeとします.

わざわざ書くほどの機能もありませんが,注意すべきことを書いておきます.

段落区切り

text-mode での段落区切りは空行 (改行だけの行) になります.

1 個目の段落です.

2 個目の段落です.
 行頭にペースがあっても段落にはなりません.

したがって, 2 個目の段落の青色のところ (スの場所) でM-q(M-x fill-paragraph) をしても,

1 個目の段落です.

2 個目の段落です. 行頭にスペースがあっても段落にはなりません.

となります.

タブの挿入

たとえ

 
(setq-default tab-width 4)

と設定していて,TABとしても 4 文字分のタブが挿入されるとは限りません.この理 由を少し詳しく説明します.

タブに関連した設定は「 tab-width 」と「 tab-stop-list 」があります.

まず,「 tab-width 」は既にある「タブ」をどのように表示するかの設定です.例えば,

 
(setq-default tab-width 8)

とあれば,タブの部分が 8 文字分のスペースとして表示されます.ただし,これはあくま で表示上の問題なので,テキストは変更されません.

一方,「 tab-stop-list 」はタブキーの入力時の動作を設定します.

で,その前に,大前提の知識として, Emacs ではTAB キーを押すことは「タブを入 力すること」ではありません.タブを入力したければ,C-q TABとする必要があり ます.

では,タブとは何なのか.それは,「 tab-stop-list 」で設定された文字までカーソルを 移動することを意味します.

つまり,「 tab-stop-list 」のデフォルトは

 
(defcustom tab-stop-list
  '(8   96 104 112 120)

となっていますので,TAB を何回か押すと, 8 , 16 , 24 文字目へとカーソルが移動 するのです.

これが,

 
(setq tab-stop-list
  '(2 4 6 8))

となっていると, 2 , 4 , 6 , 8 文字目にカーソルが移動します.

ちなみに, text-mode では直前の行に

This program is free software; you can redistribute it and/or modify

のような文章があれば,スペースの位置が「 tab-stop-list 」に設定されます.



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

33.2 字下げ型テキストモード (2003/07/25)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=paragraph-indent-text-mode"
"MeadowMemo/字下げ型テキストモード"へのコメント(無し)

text-mode では段落の区切りを認識させるために,空行を入れる必要があります.しかし, 行頭を字下げして段落の区切りとしたいこともあります.

そんな時には,M-x paragraph-indent-text-modeを text-mode のかわりに使うと便 利です.

これなら,行頭に paragraph-start で設定されている文字があれば,それは段落として認 識されます.

日本語であれば,

 
(setq paragraph-start '"^\\([  ・○<\t\n\f]\\|(?[0-9a-zA-Z]+)\\)")

のように全角スペースなども設定しておくと便利です.



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

33.3 テキスト編集あれこれ (2003/07/25)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=text-mode%20misc"
"MeadowMemo/テキスト編集あれこれ"へのコメント(無し)

単純なテキストにまつわるいろいろなアイデアや使い方などのメモです.

navi.el を使う

○ 1 章 Meadow って何

Meadow とは...

という具合に行頭に「○」や「・」を付けて章を表すことがあります.しかし,文章が長 くなってくると,どの章がどこにあるのか訳がわからなくなってしまいます.

そこで,navi.elを使います.インストールされていれば, M-x call-naviで章の一覧が表示されますが,デフォルトでは,

1. Meadow とは

という書式にしか対応してません.

これを,

 
(setq navi-search-exp-text
      "^\\([ \t]*[・●○]+.*\\)$")

と変えると,「○ Meadow とは」に対応できます.他の書式を使う場合には,「 [・● ○]+ 」の「 [] 」の中の部分を変更します.



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

33.4 文字数,行数を数える (2004/01/20)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=wordcount"
"MeadowMemo/文字数,行数を数える"へのコメント(無し)

文章を書く時には,文字数や単語数,行数を知りたい時があります.そのための機能などを紹介します.

33.4.1 文字数,行数を数える標準機能 (2004/01/20)   
33.4.2 文字数,行数を数えるコマンド (2004/01/20)   
33.4.3 文字数を数える ― word-count (2003/06/27)   



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

33.4.1 文字数,行数を数える標準機能 (2004/01/20)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=how-many"
"MeadowMemo/文字数,行数を数える標準機能"へのコメント(無し)

お勧め度:★☆☆☆☆.少し使い難いかな.

文字数や行数を数えるための標準機能として, how-many と count-lines-region があります.

まず,M-x how-manyは指定した正規表現に一致したものの数を数える機能です.そのため,正規表現を正しく指定すれば,希望する文字の数だけを数えることができます.

正規表現については,以下のような正規表現が役に立ちます.

次に,行数については,M-=(あるいはM-x count-lines-region) で数えるこ とができます.これは,リージョンで選択し,そのリージョン間の行数を数えてくれます. ただし,改行だけの行も 1 行になります.



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

33.4.2 文字数,行数を数えるコマンド (2004/01/20)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=count%20command"
"MeadowMemo/文字数,行数を数えるコマンド"へのコメント(無し)

お勧め度:普段,あまり使わない機能.たまに使うのは,一番最後のもの.理由はなんと なく...

ネタ元:Meadow users ML

文字数や行数を数えるためのコマンドがあります.これらは,すべて範囲をリージョンで 指定して,実行します.そのため,編集しては,リージョンを指定し,と少し面倒です.

まずは,リージョン間の文字数を数えるコマンド.

 
(defun my-mojisuu (beg end) ;リージョンを指定して、 M-x my-mojisuu とする。
  (interactive "r")    ;リージョンの最初と最後の位置が beg と end に入る。
  (save-excursion
    (save-restriction
      (narrow-to-region beg end) ;編集可能領域をリージョンに制限する。
      (let (ch ch-id (ch-count 0))
        (goto-char (point-min))         ;バッファの先頭へ
        (while (not (eobp))             ;バッファの最後でない間、
          (setq ch (following-char))    ;現在位置の文字を ch に代入
          (setq ch-id (nth 0 (split-char ch))) ;その文字の leading-charcter
          (if (eq 'japanese-jisx0208 ch-id) ;その文字が JIS x 0208 ならば
              (setq ch-count (1+ ch-count))) ;カウンタ ch-count に 1 を足す。
          (if (eq 'katakana-jisx0201 ch-id) ;その文字が半角仮名でも
              (setq ch-count (1+ ch-count))) ;カウンタ ch-count に 1 を足す。
          (forward-char 1))             ;次の文字へ進む。
        (message "文字数は%d" ch-count) ;結果表示。
        ))))

次のは,リージョン間の行数と文字数を数えるコマンドです.

 
(defun wc-region (start end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (let ((c 0) (l 0) (w 0) (in-word nil) c-after)
        (goto-char start)
        (while (< (point) end)
          (setq c-after (char-after (point))) ; no need (point) if emacs 20
          (if (= c-after ?\n)
              (setq l (1+ l)))
          (if (or (= c-after ?\n) (= c-after ? ) (= c-after ?\C-i))
              (if in-word
                  (setq w (1+ w) in-word nil))
            (setq c (1+ c) in-word t))
          (forward-char))
        (message (format "%d lines, %d words, %d characters" l w c))))))

これも行数と文字数を数えるコマンドです.

 
(defun my-count-lines-region (start end)
  (interactive "r")
  (save-excursion ;;これと
    (save-restriction ;;これは オマジナイ。 (ちゃんと調べましょう (爆))
      (let ((lf-num 0)) ;;改行文字の個数用、初期化している。
        (goto-char start) ;;指定領域の先頭に行く。
        (while (re-search-forward "[\n\C-m]" end t) ;;改行文字のカウント
          (setq lf-num (+ 1 lf-num))) ;;(つまり、 search できる度に 1 足す)
        (message "指定領域には%d 文字 (除改行文字) 、%d 行、%d 文字 (含改行文字) ある。"
                 (- end start lf-num) (count-lines start end) (- end start))))))



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

33.4.3 文字数を数える ― word-count (2003/06/27)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=taiyaki%20wordcount"
"MeadowMemo/文字数を数える―word-count"へのコメント(無し)

お勧め度:★★★☆☆.文字数が気になる人へ.これもたまに使ってます.さっきの関数 とは違って,リージョンを使用していない点が使いやすい.

http://www.taiyaki.org/elisp/word-count/src/word-count.el

21.7.1 文書整形 (機種依存文字の削除) ― text-adjust (2003/06/27)と同じ作者による elisp. M-+を押したところからカーソルがあ る位置までの文字数などをカウントしてくれます.リージョンを使用していないので,リ アルタイムで文字数などが表示され,便利です.

インストールはロードパスの通ったことろに置いて, 以下の設定を入れるだけです.

 
(autoload 'word-count-mode "word-count"
          "Minor mode to count words." t nil)
(global-set-key "\M-+" 'word-count-mode)

使い方はM-+で, マイナーモードである word-count がオンになります. すると, モードラインに文字数などが表示されます.

ただし, M-+を押した地点と現在カーソルがある地点との間の文字のみが対象になってますので, ご注意を.



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

33.5 選択的取り消し― undo (2003/11/05)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=undo"
"MeadowMemo/選択的取り消し―undo"へのコメント(無し)
要約

Emacs の取り消しはとても便利です.リージョン内のテキストだけを取り消しすることも できるのです.

詳しい使い方

C-/で取り消しができることは Meadow を使っているなら,誰でも知っているでしょ う.しかし,取り消しを使う時は,普通に取り消しをしたい時だけとは限りません.

例えば,長い文章を書いていて, 1 段落目と 2 段落目を編集したとします.ここで, 2 段落目を変更後, 1 段落目の変更を取り消したいと思ったとします.

普通のエディタであれば,どうやってやりますか?

2 段落目を一度別に保存しておき,取り消す必要のないところを延々と取り消し,その後, 1 段落目を変更するといった作業をしたことはありませんか?

これは非常に無駄で馬鹿馬鹿しい作業です.

しかし, Emacs ではリージョンで選択し,C-/とするだけで,選択した範囲内の変 更のみを取り消しできるのです.

うまく動かない

redoは undo を上書きしているので、これを使っているとリージョン内のテキ ストのみ取り消すことはできません。



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

33.6 やり直し ― redo (2003/11/05)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=redo"
"MeadowMemo/やり直し―redo"へのコメント(無し)

undo はC-/できますが, その取り消しはできません. そこで, redo というパッケージが便利です

http://www.wonderworks.com/download/redo.elから, ダウンロードしてロードパ スの通ったところに置き, 以下を.emacs に追加します

キーバインドは適当に変更してください. M-/がわかりやすいと思ったんだけど, これは dabbrev が使ってるんですよねぇ. . .

 
(require 'redo)
(global-set-key meadow_text,"\C-]" 'redo)



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

33.7 kill-line で直前の行を削除 (2003/11/07)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=kill-previous-line"
"MeadowMemo/kill-lineで直前の行を削除"へのコメント(無し)
要約

kill-line をバッファ端で実行すると直前の行を削除できます.

何が問題なのか?

kill-line をバッファの最後で実行してもメッセージがでるだけで何も起こりません.

何ができるのか?

バッファの最後で kill-line を実行すると,直前の行を削除できます.

設定方法

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

 
(defadvice kill-line
  (around beg-of-line-before-kill-line activate)
  (save-restriction
    (widen)
    (if (= (point) (point-max))
        (if (= (point) (line-beginning-position))
            (progn (previous-line 1) (recenter))
          (beginning-of-line)))
    ad-do-it))

詳しい使い方

普通にC-kとするだけです.これで,現在行を削除できなくなると,直前の行を削 除するようになります.



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

33.8 ある時点まで戻す ― undo-group (2003/08/02)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=undo%20group"
"MeadowMemo/ある時点まで戻す―undo-group"へのコメント(無し)

何が問題なのか?

たくさんの編集を行った後で,あの時点まで戻したいという時, undo を何度も行う必要が あり,かなり面倒です.

何ができるのか?

編集が一区切りとなった時点で,その時点を記憶させておくことができます.これで,そ の後で,編集を行ってもすぐに記憶させた時点に戻ることができます.

インストール方法

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

設定方法

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

 
(require 'undo-group)

詳しい使い方

M-x undo-group-boundaryで現時点を記憶させることができます.そして, M-x undo-groupで undo ができます.

M-x undo-group-boundaryを何度か行うと,今記憶したものは 1 番目, 1 つ前のもの は 2 番目の状態という風にどんどん記録されていきます.

これで, 2 グループ分の undo をしたいなと思ったら,C-u 2 M-x undo-groupで戻す ことができます.

うまく動かない

undo の状態を保存しているのは「 buffer-undo-list 」という変数です.この Elisp はこ れをうまく用いています.

「 buffer-undo-list 」は通常の編集を行うと変更され,その情報をもとに通常の undo も 行われています.

そのため,適当なところでM-x undo-group-boundaryにより,記録しておいても, 場合によっては意図したように戻らないこともあります.

ある時点で自動的に記録

何かの関数が実行された時点で,記録するようにするには以下のようにします.関数 「 find-file-noselect 」の部分を適当なものに変えると,便利になるかもしれません.

 
(defadvice find-file-noselect
  (after advice-by-undo-group activate)
  (if buffer-undo-list
      ()
    (undo-group-boundary)))



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

33.9 テキストを縦書きにする ― tategaki (2003/09/21)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=tategaki"
"MeadowMemo/テキストを縦書きにする―tategaki"へのコメント(無し)

何ができるのか?

テキストを

西
?
`

のように縦書きに変換できます.

インストール方法

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

設定方法

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

 
(require 'tategaki)

詳しい使い方

テキストをリージョンで選択し,M-x tategaki-regionとすると,縦書きになりま す.M-x tategaki-region-htmlで縦書きの HTML を出力できます.

コメント

作者様のページは消えてしまっているようです.



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

33.10 連続する同じ行を 1 行に― uniq (2003/10/08)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=uniq"
"MeadowMemo/連続する同じ行を1行に―uniq"へのコメント(無し)

要約

重複する行を削除できる Elisp の紹介.

何ができるのか?

重複する行を削除することができます.無駄に入っている空行などを削除できます.

インストール方法

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

設定方法

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

 
(load "uniq")

詳しい使い方

適当な例ですが.

コメント
コメント


これは,重複する行を削除する Elisp です.
コメント

となっている部分を,リージョンで選択して,M-x uniq-regionとすると,

コメント

これは,重複する行を削除する Elisp です.
コメント

となります.M-x uniq-remove-dup-linesとすると,

コメント

これは,重複する行を削除する Elisp です.

となります.



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

33.11 フォントロックのフェイスで動作を変える ― tmmofl (2004/01/25)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=tmmofl"
"MeadowMemo/フォントロックのフェイスで動作を変える―tmmofl"へのコメント(2007/12/28)

要約

フェイスにより,動作を変える Elisp の紹介.

何が問題なのか?

CSS や HTML など, Meadow にはそのファイルの編集に適したモードが多数用意されてい ます.そして,これらのモードは関数やコメントなどを分かりやすく色付けしてくれます.

しかし,色をつけてくれるだけで,コメント部分だろうと,通常の関数部分だろうと動作 は変わりません.

そのため,コメントは右端で自動的に折り返して欲しいけど,プログラムは勝手に折り返 して欲しくないと思ってもそのようなことはできません.

何ができるのか?

カーソル位置のフェイスに応じて,設定を実行することができます.

これにより,コメント部分でのみ右端で折り返すといったことが可能になります.

インストール方法

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

設定方法

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

 
(require 'tmmofl)

詳しい使い方

M-x tmmofl-mode でオンにします.デフォルトではコメントで auto-fill をオン, それ以外でオフになっています.

試すためには,コメントの記号を書き,適当に日本語を入力してみてください.右端で折 り返されるはずです.

うまく動かない

試してみても折り返されなければ,カーソル位置のフェイスを確認してください.カーソ ル位置がコメントのフェイスの上になければいけません.行末にカーソルがあると,コメ ントフェイスにならず,動作しないことがあります.

「フェイスの上にカーソルがある状態」にするというのに,多少戸惑うかもしれませんが, 慣れれば非常に便利だと思います.

カスタマイズ

デフォルトでは以下のようになっています.

 
(setq tmmofl-default-actions
      '(
        ;; コメントフェイスの時
        (font-lock-comment-face
         (lambda()
           (auto-fill-mode 1)
           )
         ;; コメントフェイスでない時
         (lambda()
           (auto-fill-mode 0)))))

これを編集すれば,変更できます.構造は

 
(setq tmmofl-default-actions
      '(
        (font-lock-comment-face ;; ここにフェイス名
         ;; lambda の中に実行したい設定を書く
         ;; 最初にあるのが,指定したフェイスの時の設定
         (lambda()
           (auto-fill-mode 1)
           )
         ;; 後にあるのが,指定したフェイスでない時の設定
         (lambda()
           (auto-fill-mode 0)))
        ;; ここまでが一固まり

        ;; 他のフェイスでも設定したい時には,
        ;; 同じように書いていくだけでいい
        (font-lock-doc-face
         (lambda()
           (auto-fill-mode 1)
           )
         (lambda()
           (auto-fill-mode 0)))
        ;; ここまでが一固まり
        ))

となっています.フェイス名については15.3.2 フェイス - 文字の色, 背景色, イタリック属性等の設定 (2004/01/15)が参考になります.

モード毎に設定したい場合は,以下のように「 tmmofl-モード名 (major-mode の値)- actions 」という変数に定義します.これがあると,デフォルトの方は無視され,こちら が使われます.

 
(setq tmmofl-emacs-lisp-mode-actions
  '(
    (font-lock-comment-face
     ;; コメントフェイスの時
     (lambda()
       (progn
         (auto-fill-mode 1)))
     ;; コメントフェイスでない時
     (lambda()
       (progn
         (auto-fill-mode 0))))

    (font-lock-string-face
     ;; 文字列のフェイスの時
     (lambda()
       (abbrev-mode 0))
     ;; 文字列のフェイスでない時
     (lambda()
       (abbrev-mode 1)))))

この時指定する関数はトグルする関数ではなく,オン/オフする関数でなければいけませ ん.というのも,トグルするような関数だと,編集中にカーソルを移動するたびにオン/ オフを繰り返してしまうからです.



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

33.12 文字の変換関連 (2004/12/08)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=convert%20string"
"MeadowMemo/文字の変換関連"へのコメント(無し)

ある文字をある文字に変換するものを紹介します.

33.12.1 テキストを rot13 などで変換 (2004/01/20)   
33.12.2 文字の整形 (2004/12/08)   



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

33.12.1 テキストを rot13 などで変換 (2004/01/20)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=msgcodes"
"MeadowMemo/テキストをrot13などで変換"へのコメント(無し)
要約

テキストを rot13 などで変換できます.

インストール方法

からコピーして, msgcodes.el としてロードパスの通ったところへ置きます.

設定方法

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

 
(require 'msgcodes)
;; キーバインドを追加
(msgcode-init-keys)

詳しい使い方

リージョンを選択後,以下のキーを入力することで変換を行うことができます.参考に emacs を変換した例を各関数の最後に書いておきます.



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

33.12.2 文字の整形 (2004/12/08)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=case%20string"
"MeadowMemo/文字の整形"へのコメント(無し)

要約

英単語の1文字目を大文字にするなどの処理を簡単に行うことができます.

情報源

Emacs Lisp リファレンスマニュアル

何ができるのか?
設定済みMeadowでは

Meadowの標準機能ですので,通常のMeadowで利用できます.もちろん設定済みMeadowでも 利用できます.

設定方法

不要です.

詳しい使い方

以下,画面例は

GNU Emacs is "free software".

を変換した時の例です.