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

@Lenic @Youmu 获取最新代码试试。

  1. typescript 应该没问题。
  2. web-mode 是照着 web-mode.el - html template editing for emacs 的截图实现了常见 types 和 engines 下的注释编辑,不知道对不对。
  3. c/c++ 宏编辑的时候,因为需要在完成之后重新对齐 \,把 #define 也放入了编辑缓冲。主要功能已实现,还有些小问题:1. 不能在 #define 这行按 C-c '; 2. 进入编辑窗口后的光标位置飘了。
  1. typescript-mode 已经没问题了;
  2. web-mode 我试了下,还是不对,执行报错 Wrong type argument: listp, "/\\*+\\(?:!\\)?"

web-mode 报错的文件如下:

/**
 * abc<光标位置>
 */
const App = () => {
  // ..
};

文件扩展名是什么?web-mode-content-typeweb-mode-engine 是什么?

找到问题所在了。临 push 之前忽然想起要改一个地方,简单得不能再简单了,结果改漏了,没写测试就是不靠谱。

删除本地代码,重新获取,我刚刚强推了。

Excellent work! 虽然格式没有对齐,但是已经非常有用了!大写的赞!

完美 :+1:

缩进变了,还是行尾的 \ 没对齐?

行尾的 \ 不同于每一行开头的的 //,在行首只需插入固定长度,行尾需要对齐到最长的那一行。我用目前的方法是用 c-indent-region,它默认对齐到 72。而且该函数有可能会改变缩进,如果你是手动控制缩进(而不是按 TAB 缩进)就需要注意了。

另外 c-indent-region 需要 (setq c-auto-align-backslashes t),否则它不对齐 \


改为 (align-regexp (point-min) (point-max) "\\(\\s-*\\)\\\\$") 应该就可以避免上述的两个问题。

不过不能简单这样改,还是应该遵循 cc-mode 的设定。默认对齐到 72 (c-backslash-max-column),有超长行时对齐到最长行,如果 c-auto-align-backslashesnil 就不对齐?

我是在这个 commit 提交前测试的,现在已经完美缩进了。 :+1:

有个建议:

如果提交的内容与修改前一样,在使用 separedit-commit 提交时,还是会改变文件(会在退出emacs时提示是否要保存)。是否可以改成,如果提交的内容与之前一致,就不修改文件?或者添加一个选项让用户选择行为?

org-mode 在这种情况下是不修改文件的。

separedit-version: 0a2dc1a master origin/master fix(sh-mode): correct region detection of single quoted string (close #26)
emacs version: "GNU Emacs 29.0.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 1.16.0) of 2021-11-25"
org-version: 9.5

好主意。

已经给上游提了 PR: Fanael/edit-indirect#pr19

如果不被采纳,再由 separedit 实现。

我安装后只在emacs-lisp下可以正常用,其他的C++/Rust下都提示separedit–block-info: Not inside a edit block,这种一般是哪里配置错了导致的?

emacsq 试试:

@fengqi PR 已合并

1 个赞

大佬,我在写 elixir 的时候,有个编辑文档的需求

defmodule Foo do
  @moduledoc """
  Foo-related functions.

  ## Examples

      iex> Foo.sum(1, 2)
      3

  """

  @doc """
  Calculate the sum of two numbers.
  """
  def sum(a, b), do: a + b
end

在 elixir 中,moduledoc 和 doc 里的文本都是 markdown 形式

这种三个双引号包裹起来的文档形式跟 python 一样,所以我最开始想着去看看 python 咋整的

结果发现在 python 的三个双引号里调用 separedit 后弹出 buffer 的 major-mode 是 separedit-double-quote-string-mode,并不会调用 separedit-default-mode 里设定的 mode,这是 separedit 的 bug 吗?

是有问题,正常情况下应该是 fundamental-mode,你是不是用的 python-ts-mode

的确是的,我切换成 python-mode,就会调用 separedit-default-mode

除此外,还有个问题比较疑惑,变量 separedit-preserve-string-indentation 按字面意思是保留字符串的缩进,设置为 t 之后,如果是编辑这样的字符串

可以看到前面是没有缩进的,设置为 nil 才会有缩进,是我理解的地方有什么不对吗

是该这样理解吗?设置为 t,意为保留之前的缩进,这样无论你在编辑 buffer 如何修改,之前的缩进都不会发生变化;设置为 nil,意为不保留之前的缩进,这样在编辑 buffer 中修改缩进时,也会影响到实际文件中的缩进

如果你想把文档当作 markdown 编辑,可以按 C-c " 进行选择。

对,是这样理解的。我看 preserve 有保护的意思,就拿来表示保护这些初始的缩进不被修改的意思——不体现在 edit buffer 里面,所以修改不到。不知道这样用和不合适。


我刚刚推了新的代码,应该修复了 python-ts-mode 的问题。

1 个赞

感谢大佬,太速度了,我这里使用正常,触发 separedit 时会调用之前设置的 separedit-default-mode

这个绑定的是哪个函数呢?我貌似没有在 readme 里找到。大佬想说的是选中区域后再调用 separedit 会弹出选择模式的这个操作吗?

我现在知道的是,调用 separedit 时,加上一个 prefix-arg,可以选择编辑 buffer 的 major-mode

感谢大佬解惑,那这个思想给我的感觉有点像 Emacs 里内置的 save-restriction:操作完成后恢复之前的限制条件。不过感觉就算换个名字对我来说,第一眼看到还是比较疑惑吧,感觉把文档写的更详细会不会更好一些,比如说:

- "If non-nil preserve leading whitespaces in string."
+ "If non-nil, leading white spaces in the original file will not be edited; otherwise, they will be brought into the editing buffer and edited together."

当然我英语不是很好,大佬轻拍;可能是我理解能力有啥问题吧,不过理解了具体起啥作用,感觉原文档说得也很清楚。。。

时间长了我都忘记这是我个人配置了。其实就是 C-u C-c ' 的另一种形式:

(defun separedit+select-mode ()
  (interactive)
  (let ((current-prefix-arg '(4)))
    (separedit)))
1 个赞

更详细地测试了一下,发现还有些问题:

在编辑我刚提到的多行文本时,如果是直接调用 separedit 或者 C-u separedit,编辑 buffer 中显示的文本是正确的。

如果是选中区域后,调用 separedit,这时会让你选择 major-mode,选择完后,编辑 buffer 中显示的文本不对,貌似会把注释符号给去掉。我只测试了 python 和 elixir(我也不知道是否有别的语言支持这种多行注释。。。),这两种语言注释符号都是 #,并且在按下 C-c C-c 编辑完成后,在之前的选中区域,每行开头都会加上一个注释符号 #

补图,这次问题在 python-mode 和 python-ts-mode 上都能复现

如果直接按下 C-c C-c 编辑完成,则会在每行开头都会添加一个 #