2011-07-12 4 views
2

これは私のコードの単純な間違いであるかどうかはわかりません。しかし、私は問題の原因を突き止めることができないので、指摘してください。ループ内に作成されたときにemacsオーバーレイが自動的にマージされる

aaaaa 

(progn 
    (setq ol-list nil) 
    (dolist (pos '(1 2 3 4)) 
    (let ((ol (make-overlay pos (1+ pos) (current-buffer)))) 
     (overlay-put ol 'display "X") 
     (print ol) 
     (setq ol-list 
      (nconc ol-list (list ol))) 
    );; let 
    ) ;; dolist 
) 


(progn 
    (dolist (ol ol-list) 
    (delete-overlay ol)) 
    (setq ol-list nil)) 

prognセクション上記のコード開始あなた "のLispモード" バッファでスニペット、及び評価(C-X-C e)を置きます。

私のemacsでは、最初のコードセクションは "aaaaa"を "Xa"にします。しかし、結果は "XXXXa"になるはずです。だから問題はどこにあるの?

答えて

5

Emacs Lisp manual, section 38.15.1を参照してください:

表示仕様の交換については、「プロパティを持つテキストは、」自分のdisplayプロパティと同じLispオブジェクトを持つすべての連続した文字を意味します。これらの文字は1つの単位として置き換えられます。

マニュアルでは、必要な操作方法について説明します。オーバーレイごとに異なる文字列を割り当てる必要があります。このような何か:私はまた、あなたのコードはより多くのLispのような作るための提案のカップルを持っている

(overlay-put ol 'display (concat "X")) 

自分の行に閉じ括弧を入れる必要はありません
  • see this answer )。 Emacsは括弧が一致していることを示し、自動インデントを行います。したがって、閉じ括弧をそのままにしておきます。

  • loop facilitymapcarをそれぞれ使用すると、ループがよく見えるようになります。

(require 'cl) 

(setq ol-list 
    (loop for pos from 1 upto 4 
     collect (let ((ol (make-overlay pos (1+ pos)))) 
        (overlay-put ol 'display (concat "X")) 
        ol))) 

(mapcar #'delete-overlay ol-list) 
+0

まあ、答えだけでなく、誠実な提案をありがとう。私は前に "ディスプレイを置き換える"というルールを知らない。これは私を助けます。 – winterTTr

関連する問題