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)
该函数打算在该点处将文本与“(”上面的行后面的字符对齐。
除非连续两次调用该函数,否则一切似乎都能正常工作。在这种情况下,该点之前的文本与上次完全相同。
似乎第二次没有设置变量。
有谁知道如何解决这个问题?
非常感谢!
答案 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。