[分享] separedit.el (原 comment-edit.el): 在单独的缓冲区编辑注释、docstring 或其中的代码块

这种 documentation comment 在 rust 项目里大量的使用。 如这个例子

这样子,这些代码可以算在 doc test 。又在生成文档时,这些 test 也可以作为示例来显示

1赞

如果不要求ascii的话,或许可以试试org mode导出纯文本里标记代码块的符号。

;;   ┌────
;;   │ (use-package ghelp
;;   │   :config (ghelp-global-minor-mode))
;;   └────

另外screencast图加载不了。

没看懂:thinking::thinking::thinking:

或许可以考虑用

   ┌────
   │ (use-package ghelp
   │   :config (ghelp-global-minor-mode))
   └────

代替

,--- elisp
| (foo \"bar\")
`---

? 虽然第一个没法手打。但是好看不少。

README最下面的screencast加载不了。

代码块的外框不限定,可以自行添加定义。

如果这种外框使用普遍的话,可以考虑内置。

unicode 字符的确好看很多,打字其实不是问题,只要用其他工具,比如 snippet (定义一个 [s 表示方角代码框) 生成一个空白框:

┌────
│ $0
└────

然后由 separedit 打开编辑,就不需要手打 unicode 了。


我还以为是网络问题😅,应该是项目改名然后跟 gif 文件没对应上。干脆删掉得了,这两个 gif 很早录制的,过时了。

1赞

btw这个变量是干啥的

(defcustom separedit-continue-fill-column nil
  "Use the remaining fill with of the source buffer in edit buffer."
  :group 'separedit
  :type 'boolean)

31# 楼的需求,我在后边有说明其用法。

1赞

哦哦,那应该是“fill width”?

命名的确不太合适。

另,现在已经加了对上边提到的 unicode 代码框的支持:

https://github.com/twlz0ne/separedit.el/blob/61d3c1b4a09f37fead7dd0c63ba2223926dc5bb3/separedit.el#L250-#L252

不过刚发现一个问题,就是代码框 <language> 的名字不支持连词和特殊符号,下次统一再改了。

1赞

我是指docstring,里面写的是fill with

1赞

之前在 @xuchunyang 这篇 《 添加个删除 Advice 函数的按钮 》下边提供过一个删除 remove-hook-at-point 函数,但是功能有限。后来也试过 helpful 的编辑功能,也不甚满意,因为直接在 minibuffer 编辑,窗口太小施展不开,遇到 lambda 或者括号多几层就懵了,而且 minibuffer 是一个很容易被覆盖的窗口。

昨天给 separedit 做了点扩展,把变量(包括 hook 和 variable)值提取出来编辑,并且区分 global 和 local:

Screenshot_2020-03-05_at_4.43.20_PM_separedit-help-buffer-variable

考虑到需要新增一个入口函数,所以目前还未正式加入“全家桶”。

1赞

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-c")))))
1赞
  • 完善对 minibuffer 的支持
  • 支持直接在 edit buffer 中按 C-x C-s 保存修改
  • 修复了一些问题

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

3赞