🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.editor.emacs
Article #539

Re: buffer 内の位置を読み込む方法は

#539
From: Katsumi Yamaoka
Date: Thu, 08 Jul 2004 04:06
83 lines
3837 bytes
;; 難波さんの記事は配送されてきましたよ。:)

>>>>> 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>
Technical Details
Message-ID: <b9yisczgn1n.fsf@jpl.org>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!fu-berlin.de!uni-berlin.de!not-for-mail
References: <uk6xf45hq.fsf@tonewin.kuciv.kyoto-u.ac.jp>

Show Full Headers
Complete Article Headers
X-Google-Thread: ff358,3295602bb33cd8af
X-Google-Attributes: gidff358,public
X-Google-Language: Japanese,JIS
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!fu-berlin.de!uni-berlin.de!not-for-mail
From: Katsumi Yamaoka <yamaoka@jpl.org>
Newsgroups: fj.editor.emacs
Subject: Re: buffer 内の位置を読み込む方法は
Date: Thu, 08 Jul 2004 13:06:44 +0900
Organization: Emacsen advocacy group
Lines: 83
Message-ID: <b9yisczgn1n.fsf@jpl.org>
References: <uk6xf45hq.fsf@tonewin.kuciv.kyoto-u.ac.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
X-Trace: news.uni-berlin.de n1aG2wBQluZKvwJFydZa0g79YkrWQatvIhtrXYfz2KrAehhwI=
X-Face: #kKnN,xUnmKia.'[pp`;Omh}odZK)?7wQSl"4o04=EixTF+V[""w~iNbM9ZL+.b*_CxUmFk
 B#Fu[*?MZZH@IkN:!"\w%I_zt>[$nm7nQosZ<3eu;B:$Q_:p!',P.c0-_Cy[dz4oIpw0ESA^D*1Lw=
 L&i*6&(
User-Agent: Gnus/5.110003 (No Gnus v0.3) Emacs/21.3.50 (gnu/linux)
Cancel-Lock: sha1:mpo0/f/q4kpevtqB8bni7wo1Lhs=