[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:04100] Re: Japanese characters count



In message "[debian-users:04084] Japanese characters count"
    on 98/02/03, Ryuichi Arafune <arafune@xxxxxxxxxxxxxxxxxxxxxxxxx> writes:

> XEMACS または Muleで文字数をカウントするコマンドは存在するのか?

標準でありそうに思えたのですが、みあたらないですね。

> できれば,XEMACS(Mule) を用いて範囲を指定してその後にその範囲に含まれる文字数を
> 日本語と英語で区別して表示してくれるのが良いんですけど.

多分、誰かが作っていると思うのですが、書いてみました。改行も
わけてカウントするようになっています。

(defun count-characters-region (beginning end)
  "Count characters in region."
  (interactive "r")
  (let (c (single-byte 0) (multibyte 0) (newline 0))
    (message "Counting characters in region ...")
    (save-excursion
      (goto-char beginning)
      (while (< (point) end)
        (setq c (following-char))
        (cond ((> c 255)
               (setq multibyte (1+ multibyte)))
              ((= c ?\n)
               (setq newline (1+ newline)))
              (t
               (setq single-byte (1+ single-byte))))
        (forward-char)))
    (message "single-byte: %d, multibyte: %d, newline: %d"
             single-byte multibyte newline)))

> もっといえばTeX のコマンドを無視して数えてくれればいうことがありません.

これは、完璧を期そうとすると大変なので、外部コマンドに頼るの
がいいと思います。dselectで見たら、それらしいものとしてuntex
がありました。これは、LaTeXのコマンドを完全に削除してしまう
のではなく、(2個の?)空白に置き換えているようです。完全に削除
してくれた方がこの場合はいいと思うのですが、そういうツールは
ないのでしょうか。まあ、untexをいじるのも簡単でしょうけど。

で、こちらは次のような関数でいいと思います。untexに渡すオプ
ションを可変にした方がいいかもしれません。

(defun count-characters-region-untex (beginning end)
  "Remove LaTeX commands and count characters in region."
  (interactive "r")
  (let ((buf (get-buffer-create " *count-characters-region*")))
    (save-excursion
      (set-buffer buf)
      (erase-buffer))
    (call-process-region beginning end "untex" nil buf nil "-ea" "-")
    (save-excursion
      (set-buffer buf)
      (count-characters-region (point-min) (point-max)))))

-- 
川村 尚生 / 鳥取大学 工学部 知能情報工学科