separedit.el: 在单独的缓冲区编辑注释、docstring 或其中的代码块

separedit这个名字本身很好,但是和paredit太像了,第一感觉是“有人觉得paredit不够完美/更新不勤于是又写了个功能类似的separedit”

是有几分相似,但是我能想到的名字都在这了: 20楼 37楼

原先的名字不能“自洽”,这让我感到很难受,而且存在同名的包,改名势在必行。

EDIT: separate-edit / edit-separate 也不算太长,可以考虑。

melpa 审核通过了。

另外刚刚加了一项新功能(暂未合并 https://github.com/twlz0ne/separedit.el/tree/fr3-preserve-string-indent ),保持 string 内容的缩进不变形:

1 个赞

编辑弯的代码块

;;   The following code extract the "hello" from the comment:
;;   ,----
;;   | (parsec-with-input "/* hello */"
;;   |   (parsec-string "/*")
;;   |   (parsec-many-till-as-string (parsec-any-ch)
;;   |                               (parsec-try
;;   |                                (parsec-string "*/"))))
;;   `----

缩进会偏差:

;;   The following code extract the "hello" from the comment:
;;   ,----
;; |   (parsec-with-input "/* hello */"
;; |     (parsec-string "/*")xxx
;; |     (parsec-many-till-as-string (parsec-any-ch)
;; |                                 (parsec-try
;; |                                  (parsec-string "*/"))))
;;   `----

通常,在代码块的上面按一下就直接进入代码的编辑。

你的例子当中 ;;,---- 之间超过一个空格,目前的正则表达式没匹配到。所以你是整个comment 进入一个 fundamental-mode,然后才进入代码块的编辑。提交的时候的时候由于 fundamental 没有注释符号可以补全,所以空给被吃掉了,出现缩进问题。

有两种临时解决方案:

  1. 删除多余的空格
  2. separedit--comment-delimiter-regexp 加个 advice

使原本只能匹配一个空格:

(separedit--comment-delimiter-regexp 'emacs-lisp-mode)
;; => "^ *\\(?:;+\\) ?"

变成不限个数:

(separedit--comment-delimiter-regexp 'emacs-lisp-mode)
;; => "^ *\\(?:;+\\) ? *"

我稍后看看如果改成匹配无限多空格,会不会误中其他目标。

1 个赞

最近积累了不少更新,包括:

  • 合并#62 楼提到的 help-mode 的支持
  • 添加了 helpful-mode 的支持
  • 修复了#66 @xuchunyang 提到的空格问题
  • 修复了进入编辑/提交返回之后光标位置不固定的问题

现在文档落后太多,得抽空补上了。


刚才无意间在 minibuffer 按le 一下 C-c ' 发现竟然对字符串有效,刚觉可以再完善一下,实现对整个 minibuffer 的支持。再也不怕在 minibuffer 写大段内容了:

1 个赞

目前separedit直接调用了edit-indirect。能不能提供一个接口函数?有了这个函数我就可以用separedit自动做一些事,比如fill注释。c-mode的c-fill-paragraph太复杂了,和eglot一起用有问题还改不了。

比如说,(separedit-with #'fill-paragraph)会去掉注释的//然后运行fill-paragraph,然后再加回//,保存到buffer里。

这样应该可以:

(defun separedit-fill ()
  (interactive)
  (let ((separedit-continue-fill-column t))
    (with-current-buffer (separedit)
      (fill-region (point-min) (point-max))
      (execute-kbd-macro (kbd "C-c C-k")))))

UPDATE:

-     (execute-kbd-macro (kbd "C-c C-c")))))
+     (execute-kbd-macro (kbd "C-c C-k")))))
1 个赞
  • 完善对 minibuffer 的支持
  • 支持直接在 edit buffer 中按 C-x C-s 保存修改
  • 修复了一些问题

顺便在 github 上搜了一下,发现大佬 jwiegley 也用这个包了:

5 个赞

提了一个小需求

//! 在 doxygen 中还是挺常见的
1 个赞

已支持 doxygen 风格的 c/c++ 注释

3 个赞

设置sepraedit-default-mode为text-mode时,进入separedit的buffer时,没有”标题栏”,且C-c C-k退出时,总是有个warning的buffer出现,提示”Unknown major-mode: text-mode“。

设置为markdown-mode或默认fund-mode都很正常。

此外还发现了一个问题,当 .dir-locals.el 里存在设置 fill-column 为 100 时,进入 separeditfill-column 不是当前 buffer 的 fill-column 100 - 当前 comment 前缀,而是 80 - 当前 comment 前缀。这里的 80 是我设置的默认 fill-column 的值

应该是 local variable 的问题。编辑窗口 buffer 不属于当前 dir,无法继承 local variable 的值。明天再看了,得先把测试用例写出来。

提了个pr,允许用text-mode。@twlz0ne

感谢。但是这个需求我昨天已经改好了,并且不是加一行那么简单,稍后从我提交的修改和测试中可以看到。

好的,应该是我想简单了。

@Youmu @wsw 最新的代码已经推送到仓库了。

1 个赞

@twlz0ne 请教下,这个插件怎么切换注释的符号呢?比如 Rust 里面的注释符号有 ///, //!, // 这三种,含义还不太一样。

PS:目前我是手动改的 comment-start ,但是这样整个 buffer 就都改了。

我不懂 Rust。

为什么要改呢?含义不同对编辑有何影响?