2012-01-26 82 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) 

功能打算在「(」在它上面的線

後排隊在點了字符的文本。似乎一切工作都很好,除非連續調用兩次函數,在這種情況下,點前面的文本與上一次完全相同。

看起來像變量未被第二次設置大約

有誰知道如何解決這個問題?

非常感謝!

+0

它看起來像問題的標題已被截斷,請更新它。 – Lindydancer

+0

我無法重現您的問題 - 對Emacs 24.0.91.1 – Tyler

回答

4

您計算了預期的縮進。但是,無論當前行包含多少個空格,都始終插入它。

您可以在插入新空格之前簡單地刪除當前行上的空格,也可以根據需要嘗試計算所需的空格數量並插入或刪除。

一些提示:

  • 使用setq您使用全局變量,可以嘗試使用let約束他們。

  • 您可以使用特殊構造save-excursion來代替在移動它之前記錄點的位置並將其恢復之後。

+0

感謝您的提示。 +1用於保存遊覽。我認爲'讓'會起作用,但它似乎給出了相同的結果。 –

+0

問題不在於變量得到錯誤的值。問題是,總是插入與縮進相對應的空格,而不管該行最初包含多少個空格。實際上,您的代碼使用ADDS X空格而不是對列X進行縮進。 – Lindydancer

+0

@Lindydancer:該函數添加X - (原始列)空格,這是正確的,*如果* point在第一個非空白字符時調用。 – Tyler

1

我認爲變量被設置正確(儘管Lindydancer是正確的建議,而不是letsetq)。而且,如果我使用point來指定想要「排隊」的行上的第一個非空白字符,那麼您的函數對我來說工作得很好。我看到的唯一問題是,當你調用它時,函數與任何點都對齊,如果point不是第一個非空白字符,則這是不正確的。

您可以修復此問題,在(interactive)之後立即加上(back-to-indentation),line-text-up-with-char-above。實際上,一旦將所有內容都包含在save-excursion中,則您需要添加back-to-indentation作爲save-excursion表單中的第一個函數。

1

Protip:align並且特別是align-regexp。