2012-01-26 3 views
1

emacs lispの初心者向けの質問です。Elisp:古い変数の値が固まるようです。

私は次のように書かれている私の.emacsで

(defun line-text-up-with-parentheses-above() 
    (interactive) 
    (line-text-up-with-char-above "(")) 

(defun line-text-up-with-char-above(charval) 
    (interactive) 
    (setq now-point (point)) 
    (previous-line) 
    (setq above-point (point)) 
    (forward-char) 
    (search-forward charval (line-end-position) nil) 
    (setq above-paren (point)) 
    (goto-char now-point) 
    (insert (make-string (- above-paren above-point) ?))) 

(global-set-key (kbd "\<C-S-iso-lefttab>") 'line-text-up-with-parentheses-above) 

機能は、「(」、それ以上のライン上の後の文字をポイントでテキストをラインアップする予定

。関数が2回連続して呼び出されない限り、すべてがうまくいくように見えます。この場合、ポイントの前のテキストは前回と同じ量だけ前進します。

変数が2回目に設定されていないようです約

これを修正する方法を知っている人はいますか?

多くの感謝!

+0

質問のタイトルが切り捨てられているようです。更新してください。 – Lindydancer

+0

問題を再現できません - Emacs 24.0.91.1 – Tyler

答えて

4

目的の字下げを計算します。ただし、現在の行に含まれるスペースの数に関係なく、常に挿入します。

新しいスペースを挿入する前に、現在の行のスペースを単に削除するか、必要なスペースの数を計算して挿入または削除することができます。

いくつかのヒント:

  • あなたはグローバル変数を使用しているsetqを使用することにより、letを使用してそれらをバインドしてみてください。

  • ポイントをどこに移動して後で復元するかを記録する代わりに、特殊な構造save-excursionを使用できます。 (Lindydancerがlet代わりのsetqを示唆して正しいですが)

+0

のヒントのおかげでうまく動作します。セーブ・エクスカーションの場合+1。私は 'let'がうまくいくと思ったが、同じ結果を出すようだ。 –

+0

問題は、変数が間違った値を取得するということではありません。問題は、行に元々含まれていたスペースの数にかかわらず、インデントに対応するスペースを常に挿入することです。実際には、あなたのコードは、列Xにインデントするのではなく、スペースXを追加します。 – Lindydancer

+0

@Lindydancer:この関数は、関数があったときに最初の空白以外の文字にあった場合は、X-(元の列)と呼ばれる。 – Tyler

1

私は変数が正しく設定されていると思います。あなたの関数は、あなたが '整列したい'行の最初の非空白文字をポイントして呼び出すと、私のためにうまく機能します。私が見る唯一の問題は、関数がポイントをどこに呼んでいるかということです。ポイントが最初の非空白文字でない場合は正しくありません。

(back-to-indentation)の直後に、(interactive)の直後にline-text-up-with-char-aboveを追加すると修正できます。実際には、save-excursionのすべてをラップしたら、save-excursionフォームの最初の機能としてback-to-indentationを追加します。

1

Protip:align特にalign-regexp。

関連する問題