Elisp:旧的变量值似乎坚持下去

时间:2012-01-26 17:07:57

标签: emacs elisp

emacs lisp的初学者问题。

在我的.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)

该函数打算在该点处将文本与“(”上面的行后面的字符对齐。

除非连续两次调用该函数,否则一切似乎都能正常工作。在这种情况下,该点之前的文本与上次完全相同。

似乎第二次没有设置变量。

有谁知道如何解决这个问题?

非常感谢!

3 个答案:

答案 0 :(得分:4)

您计算预期的缩进。但是,无论当前行包含多少空格,都始终插入它。

您可以在插入新空格之前删除当前行上的空格,也可以根据需要尝试计算所需的空格数并插入或删除。

一些提示:

  • 使用setq您正在使用全局变量,请尝试使用let绑定它们。

  • 您可以使用特殊构造save-excursion,而不是在移动它之前记录该点并在之后恢复它。

答案 1 :(得分:1)

我认为变量设置正确(尽管Lindydancer建议let而不是setq)是正确的。如果我在你要“排队”的行上的第一个非空格字符处用点调用它,那么你的函数对我来说很好。我看到的唯一问题是,当你调用它时,函数与任何位置对齐,如果不是第一个非空白字符,则该函数不正确。

您可以在(back-to-indentation) (interactive)之后立即添加line-text-up-with-char-above来解决此问题。实际上,一旦你在save-excursion中包装了所有内容,你就会想要back-to-indentation作为save-excursion形式中的第一个函数。

答案 2 :(得分:1)

Protip:align,特别是align-regexp。