1

私は現在、次のものを持っています:

(defun my-hide-code ()                                                                                                                         
  (interactive)                                                                                                                                
  (set-selective-display 2))                                                                                                                   

(defvar my-keys-minor-mode-map (make-keymap) "my-keys-minor-mode keymap.")                                                                     
(define-key my-keys-minor-mode-map (kbd "<f2>") 'my-hide-code)                                                                                 
(define-minor-mode my-keys-minor-mode                                                                                                          
  "use"                                                                                                                                        
  t " my-keys" 'my-keys-minor-mode-map)                                                                                                        
(my-keys-minor-mode 1)    

ここで、(set-selective-display 2) と (set-selective-display 'nil) を切り替えたい

さて、私がスキームにいる場合、クロージャーとして作成するだけで、クロージャーは状態変数を格納します。これにより、自分がどの状態にあり、どのように切り替えるかを知ることができます。

しかし、Elisp はどうやら変数と関数のスコープが異なる Lisp-2 です。これを考えると、クロージャーを作成するにはどうすればよいですか/トグルキーにする必要がありますか?

4

3 に答える 3

3

Emacs 24は字句バインディングをサポートしているので、実際のクロージャーを書くことができます。

参照: Emacs 24の変数スコープの新しいルールは何ですか?

動的バインディングはEmacsを非常にカスタマイズ可能にするものの非常にdefvar大きな部分であることに注意してください。他の人に役立つ可能性のあるものを作成する場合は、レキシカルバインディングを慎重に使用してください。オーバーライドする人(もちろん、自分に当てはまらない潜在的なユースケースをすべて考えてください!:)

Emacs <24については、以下を参照してください。

于 2012-04-16T06:10:43.057 に答える
2

selective-displayそれ自体は、チェックする必要がある状態を含む変数なので、次のように書くことができます

(defun my-toggle-selective-display ()
  (interactive)
  (if selective-display
      (set-selective-display nil)
    (set-selective-display 2)))

一般的なクロージャーに関しては、私はずっと前にプロジェクトでそれらを必要としており、グローバル変数を回避するためにバッククォート置換を使用してインターンされていないシンボルを関数定義に挿入することに頼っていました。例えば

(fset 'toggler
      (let ((toggle-var (make-symbol "toggle")))
        (set toggle-var nil)
        `(lambda () (interactive)
           (cond (,toggle-var
                  (setq ,toggle-var nil))
                 (t
                  (setq ,toggle-var t)))
           (message "toggle is %s" ,toggle-var))))

実行時に生成される

M-x toggler
toggle is t
M-x toggler
toggle is nil
M-x toggler
toggle is t
M-: (boundp 'toggle)
nil

これはクラッジの資格があると思いますが、Emacs-Lisp でクロージャーのようなものを取得する他の方法を知りません。

于 2012-04-16T03:24:57.027 に答える
0

Elispで本物の(偽物ではない)クロージャーを作成する方法について、私が他の場所で提供した回答へのリンクを次に示します。

https://stackoverflow.com/a/14088107/1857114

defun****というマクロを使用します。Emacs 24.2.1 で動作しますが、以前のどのバージョンで動作するかはわかりません。おそらく **defunスペシャル フォームは将来的にアップグレードされ、マクロは不要になるでしょう。

于 2012-12-30T04:01:43.983 に答える