自定义切换器?

时间:2012-09-07 18:00:31

标签: emacs elisp state

我想要toggler,它会添加/删除“..”(有一个空格 - 但我不能让它更明显)字符串在上面的每一行(点)之前。这是我最好的选择:

(defun rst-comment-above (Point)
  (interactive "d")
  (save-excursion
    (goto-char 1)
    (cond

     ((numberp (get this-command 'state))
      ((replace-regexp "^\\.\\. " "" nil (point) (get this-command 'state)))
      (put this-command 'state ""))

     (t
     (replace-regexp "^" ".. " nil (point) Point)
     (put this-command 'state Point))
)))

它第一次起作用,但是第二次它说:

(invalid-function
 (replace-regexp "^\\.\\. " "" nil (point) (get this-command (quote state))))

修改

@ user4815162342:

所以我评论上面的内容:

I comment the thing above

然后我插入新行:

I insert new lines

然后我想取消注释,我得到:

upon uncommenting the thing, and I get

但可能它并不那么重要。我通常不会在评论区域输入任何内容。我只是注意到这个问题。更重要的是 - 在会话中存储给定文件的'state。难以实施吗?

2 个答案:

答案 0 :(得分:1)

错误来自您调用replace-regexp的行上的一组额外括号。该行应该是:

(replace-regexp "^\\.\\. " "" nil (point) (get this-command 'state))

您的代码还有其他一些问题。

  1. 存储点的当前值无法正常工作,因为您添加了 缓冲区中的字符,这使得该点向前移动。这使得 (一旦修复了上述语法错误),该函数会错过最后几个 “......”的实例。
    • 修复方法是存储点标记。
  2. 您应该使用(point-min)而不是对缓冲区进行硬编码 从缓冲区缩小开始,或者您的代码将无法工作 效果。
  3. 最后,正如其文档所述,replace-regexp并非如此 从Lisp程序调用。
  4. 以下是您的功能的修订版本:

    (defun rst-comment-above ()
      (interactive)
      (let ((pm (point-marker))
            (prev-marker (get this-command 'rst-prev-marker)))
        (save-excursion
          (goto-char (point-min))
          (cond ((null prev-marker)
                 (while (< (point) pm)
                   (insert "..")
                   (forward-line 1))
                 (put this-command 'rst-prev-marker pm))
                (t
                 (while (< (point) prev-marker)
                   (when (looking-at "^\\.\\.")
                     (replace-match ""))
                   (forward-line 1))
                 (put this-command 'rst-prev-marker nil))))))
    

答案 1 :(得分:0)

您在M-;中未使用rst-mode的任何原因?