Re: buffer 内の位置を読み込む方法は
;; 難波さんの記事は配送されてきましたよ。:)
>>>>> In <uk6xf45hq.fsf@tonewin.kuciv.kyoto-u.ac.jp>
>>>>> ms@wr.kuciv.kyoto-u.ac.jp wrote:
> (point) は、現在のカーソルの位置を返します。これとは違って、
> つぎのような関数がないでしょうか。
> その関数を実行すると、それ以降キーを監視して、
> * 矢印キー あるいは、C-n, C-p, C-b, C-f だったら、その矢
> 印キーあういは C-n, C-p, C-b, C-f をタイプしたときの通
> 常の動作にしたがってカーソル位置が変更される。
> * それ以外のキーを押したら、そのときのカーソル位置を返す。
> ちょっと自分で書いてみたのですが、不十分です。
[...]
> get-point が、求める関数のつもりですが、つぎの点で不十分です。
> * 矢印キーには対応できていない。read-movement 関数で使用してい
> る read-char ではダメ。
read-event ではいかがでしょうか? C-p => 16, ↑ => up
> * ミニバッファに押したキーに関する情報がエコーされるのが嫌。
(setq p (read-char))
の代わりに
(setq p (let ((echo-keystrokes 0)) (read-event)))
のようにして キーを読むときだけ echo-keystrokes の値を 0 に束縛
するとか。
キーを読んで何かする関数の代わりに、Emacs 流のマイナーモードを書
いてみました。M-x get-point-mode RET で開始、q で終了です。
--8<---------------cut here---------------start------------->8---
(defvar get-point-mode-map nil)
(if get-point-mode-map
nil
(let ((map (make-sparse-keymap))
(commands '(backward-char forward-char next-line previous-line))
command keys key)
(define-key map [t] (lambda nil
(interactive)
(message "%s" (point))))
(define-key map "q" (lambda nil
(interactive)
(call-interactively 'get-point-mode)))
(while commands
(setq command (car commands)
commands (cdr commands)
keys (where-is-internal command global-map))
(while keys
(setq key (car keys)
keys (cdr keys))
(define-key map key command)))
(setq get-point-mode-map map)))
(define-minor-mode get-point-mode
"Show point in the echo area."
nil " Get-Point" get-point-mode-map)
--8<---------------cut here---------------end--------------->8---
define-minor-mode でもって get-point-mode というトグル・コマンド
(関数) を生成させます。そのマイナーモードが ON のとき、通常のキー
マップの代わりに get-point-mode-map が使われます。プログラム中の
(define-key map [t] コマンド)
における [t] というキーは、特にコマンドを割り振っていない全部の
キーを指します。
;; こうして眺めると、過去に先達の皆さんから教わったことの集大成
;; だなあ。:)
--
Katsumi Yamaoka <yamaoka@jpl.org>
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735