- typescript 应该没问题。
- web-mode 是照着 web-mode.el - html template editing for emacs 的截图实现了常见 types 和 engines 下的注释编辑,不知道对不对。
- c/c++ 宏编辑的时候,因为需要在完成之后重新对齐
\
,把#define
也放入了编辑缓冲。主要功能已实现,还有些小问题:1. 不能在#define
这行按C-c '
; 2. 进入编辑窗口后的光标位置飘了。
-
typescript-mode
已经没问题了; -
web-mode
我试了下,还是不对,执行报错Wrong type argument: listp, "/\\*+\\(?:!\\)?"
web-mode
报错的文件如下:
/**
* abc<光标位置>
*/
const App = () => {
// ..
};
文件扩展名是什么?web-mode-content-type
和 web-mode-engine
是什么?
找到问题所在了。临 push 之前忽然想起要改一个地方,简单得不能再简单了,结果改漏了,没写测试就是不靠谱。
删除本地代码,重新获取,我刚刚强推了。
Excellent work! 虽然格式没有对齐,但是已经非常有用了!大写的赞!
完美
缩进变了,还是行尾的 \
没对齐?
行尾的 \
不同于每一行开头的的 //
,在行首只需插入固定长度,行尾需要对齐到最长的那一行。我用目前的方法是用 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-backslashes
为 nil
就不对齐?
我是在这个 commit 提交前测试的,现在已经完美缩进了。
有个建议:
如果提交的内容与修改前一样,在使用 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
我安装后只在emacs-lisp下可以正常用,其他的C++/Rust下都提示separedit–block-info: Not inside a edit block,这种一般是哪里配置错了导致的?
emacsq 试试:
大佬,我在写 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
的问题。
感谢大佬,太速度了,我这里使用正常,触发 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)))
更详细地测试了一下,发现还有些问题:
在编辑我刚提到的多行文本时,如果是直接调用 separedit
或者 C-u separedit
,编辑 buffer 中显示的文本是正确的。
如果是选中区域后,调用 separedit
,这时会让你选择 major-mode,选择完后,编辑 buffer 中显示的文本不对,貌似会把注释符号给去掉。我只测试了 python 和 elixir(我也不知道是否有别的语言支持这种多行注释。。。),这两种语言注释符号都是 #
,并且在按下 C-c C-c
编辑完成后,在之前的选中区域,每行开头都会加上一个注释符号 #
。