我是指docstring,里面写的是fill with
之前在 @xuchunyang 这篇 《 添加个删除 Advice 函数的按钮 - #11,来自 twlz0ne 》下边提供过一个删除 remove-hook-at-point
函数,但是功能有限。后来也试过 helpful 的编辑功能,也不甚满意,因为直接在 minibuffer 编辑,窗口太小施展不开,遇到 lambda 或者括号多几层就懵了,而且 minibuffer 是一个很容易被覆盖的窗口。
昨天给 separedit 做了点扩展,把变量(包括 hook 和 variable)值提取出来编辑,并且区分 global 和 local:
考虑到需要新增一个入口函数,所以目前还未正式加入“全家桶”。
separedit这个名字本身很好,但是和paredit太像了,第一感觉是“有人觉得paredit不够完美/更新不勤于是又写了个功能类似的separedit”
原先的名字不能“自洽”,这让我感到很难受,而且存在同名的包,改名势在必行。
EDIT: separate-edit / edit-separate 也不算太长,可以考虑。
melpa 审核通过了。
另外刚刚加了一项新功能(暂未合并 https://github.com/twlz0ne/separedit.el/tree/fr3-preserve-string-indent ),保持 string 内容的缩进不变形:
编辑弯的代码块
;; 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 没有注释符号可以补全,所以空给被吃掉了,出现缩进问题。
有两种临时解决方案:
- 删除多余的空格
- 给
separedit--comment-delimiter-regexp
加个 advice
使原本只能匹配一个空格:
(separedit--comment-delimiter-regexp 'emacs-lisp-mode)
;; => "^ *\\(?:;+\\) ?"
变成不限个数:
(separedit--comment-delimiter-regexp 'emacs-lisp-mode)
;; => "^ *\\(?:;+\\) ? *"
我稍后看看如果改成匹配无限多空格,会不会误中其他目标。
最近积累了不少更新,包括:
- 合并#62 楼提到的
help-mode
的支持 - 添加了
helpful-mode
的支持 - 修复了#66 @xuchunyang 提到的空格问题
- 修复了进入编辑/提交返回之后光标位置不固定的问题
现在文档落后太多,得抽空补上了。
刚才无意间在 minibuffer 按le 一下 C-c '
发现竟然对字符串有效,刚觉可以再完善一下,实现对整个 minibuffer 的支持。再也不怕在 minibuffer 写大段内容了:
目前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")))))
- 完善对 minibuffer 的支持
- 支持直接在 edit buffer 中按
C-x C-s
保存修改 - 修复了一些问题
顺便在 github 上搜了一下,发现大佬 jwiegley 也用这个包了:
提了一个小需求
//! 在 doxygen 中还是挺常见的
已支持 doxygen 风格的 c/c++ 注释
设置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 时,进入 separedit
的 fill-column
不是当前 buffer 的 fill-column
100 - 当前 comment 前缀,而是 80 - 当前 comment 前缀。这里的 80 是我设置的默认 fill-column
的值
应该是 local variable 的问题。编辑窗口 buffer 不属于当前 dir,无法继承 local variable 的值。明天再看了,得先把测试用例写出来。
感谢。但是这个需求我昨天已经改好了,并且不是加一行那么简单,稍后从我提交的修改和测试中可以看到。
好的,应该是我想简单了。