Puni: 通用、可定制的语法删除

那里面不是字符串,所以你平常这样弄会让里面的属性编辑非常难受的。

所以,如果Puni要支持Vue.js 这种情况,其实就要做 awesome-pair.el 做的事情的,虽然代码实现不好,但是一旦可以匹配这些模式就很爽。

awesome-pair-on-vue

awesome-pair 也一样嘛。。。

我觉得概念上其实这类事应该由 separedit.el 来解决,不过我还没用过,不知道实际体验爽不爽。

我知道,这就是 awesome-pair.el 需要改进的空间,我觉得 forward-sexp 不能解决很多现实的场景问题。

1 个赞

歪个楼,楼主这么有创造力和精力的人,不和我一起开发EAF有点浪费啊,哈哈哈哈。

当有Python、WebEngine和Vue.js这些武器储备,觉得Live in Emacs的理想一点也不遥远,每天做一点点就达到了。

2 个赞

谢邀。其实我一直想做点 gui 的东西,奈何一直没机会学习,web 那套也不太会。我先看下 EAF 搞不搞得动吧 :rofl:

@Weiss @kinono 可以试试 https://github.com/uk-ar/smart-region,只需要无脑 C-SPC

老铁精力旺盛啊!简单浏览了下,是不是可以理解为,用expand-region 加上一些手工操作就可以达成puni的目标?直接自动化或者优化expand-region是否可行?

我不知道,或许可以,但我很久不用 expand-region 也不清楚里面的实现。

在 puni 上造一个 expand-region 是简单的,反过来不一定。我感觉这两个问题是关键的:

<p>some |text </p>

expand-region 的内部实现允许不允许在这里一次选中 tag 里面的部分?

(fo|o (ba|r) baz)

expand-region 能不能判断出这两个 | 之间是不平衡的?

我印象中 expand region 的原理是对 cursor 进行各种移动和 mark 操作,最后选择一种对 mark 扩展最小的,比如操作 a 是选中整行,操作 b 是选中 word,那第一次就是效果b,第二次是效果a。

所以如果我理解的没问题的话,也是可以实现 puni的,只要把你的那些 navi 操作加到 expand region里就行,但这样意义不大而且性能也不好。

有点 vim text-obj 的味道

题外话,我装了 evil 还兴冲冲地学了 vim,但现在在 normal mode 就只用 C-f/C-b :rofl:

我覺得這部分應該是 major mode 的工作。Major mode 應該給字符串內的特殊結構也設置合理的 syntax class(就像 Python 的 f-string 那樣)。

但感覺很難。

重复一下:

或者某种类似 polymode/mmm-mode 的东西。

总之如果字符串里嵌入的是一种语言,用编辑那个语言的方式编辑它就好了。

我指的也是 mhtml/polymode 那種。

另外不好意思我之前沒看 python.el的實現。剛剛看了下 f-string 似乎沒有修改 syntax class。而且一般在字符串裡 forward-sexpkill-sexp 基本上是沒問題的。所以我覺得那個 Vue.js 文件刪掉半個括號可能是 web-mode 做了什麼。

你是对的。当光标在属性字符串里的时候,web-modeforward-sexp 会直接跑到引号的外面,再按 backward-sexp 会回到属性名前面。从 web-mode-forward-sexp 的实现中可以看到这就是它指定的行为。

我的录屏展现的已经是它被 Puni 修正以后的行为了,我觉得还不错。web-modeforward-sexp 和 syntax table 里面很多东西我都觉得是错的。

expand-region对于不同的major mode是可以有不同行为的, 比如你下面举例的html选中tag里面部分, 是可以实现的.

是,昨天我也看了一下,感觉要在 expand-region 上搞的话又会造出一个 smartparens :rofl:

结构化编辑最本质要在AST基础对各编程做结构化分析,这样才能根本解决。

取巧的办法可以利用emacs的font lock机制,根据语法颜色编辑,这种策略无法解决不平衡代码或web字符串内语法

我在文档里提到了 SMIE,我觉得这个是正道。