Emacs Elisp:旧的变量值似乎仍然存在

Emacs Elisp:旧的变量值似乎仍然存在,emacs,elisp,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) (se

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)
该函数旨在使文本在向上点与其上方一行上的字符后面的字符对齐

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

看起来变量不是第二次设置的

有人知道如何解决这个问题吗


非常感谢

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

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

一些提示:

通过使用setq,您使用的是全局变量,请尝试使用let绑定它们

您可以使用特殊的构造“保存偏移”,而不是在移动点之前记录点的位置,然后再进行恢复


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

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

一些提示:

通过使用setq,您使用的是全局变量,请尝试使用let绑定它们

您可以使用特殊的构造“保存偏移”,而不是在移动点之前记录点的位置,然后再进行恢复


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


您可以通过在上面的字符与行内文本交互后立即将其添加回缩进来修复此问题。实际上,一旦您将所有内容包装到save-shiftion中,您将希望将缩进添加回save-shiftion表单中的第一个函数

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


您可以通过在上面的字符与行内文本交互后立即将其添加回缩进来修复此问题。实际上,一旦您将所有内容包装到save-shiftion中,您将希望将缩进添加回save-shiftion表单中的第一个函数

Protip:并特别对齐regexp。

Protip:并特别对齐regexp。

谢谢您的提示+1个用于节省短途旅行。我认为“let”会起作用,但它似乎给出了相同的结果。问题不在于变量得到了错误的值。问题是,无论行最初包含多少空格,您总是插入与缩进对应的空格。实际上,您的代码会添加X空格,而不是缩进到X列。@Lindydancer:如果调用函数时point位于第一个非空白字符处,则该函数会添加X-原始列空格,这是正确的。谢谢提示+1个用于节省短途旅行。我认为“let”会起作用,但它似乎给出了相同的结果。问题不在于变量得到了错误的值。问题是,无论行最初包含多少空格,您总是插入与缩进对应的空格。实际上,您的代码添加了X空格,而不是缩进到X列。@Lindydancer:如果调用函数时point位于第一个非空白字符处,则该函数会添加X-原始列空格,这是正确的。问题的标题似乎已被截断,请更新它。我无法重现您的问题-它在Emacs 24.0.91.1上对我很好。问题的标题似乎已被截断,请更新它。我无法重现您的问题-它在Emacs 24.0.91.1上对我很好