代码语法块删除插件

代码语法块删除插件

一般来说我们会用 forward-wordbackward-word 这两个命令快速在Emacs中进行单词移动。 如果开启了 subword-mode , forward-wordbackward-word 会在骆驼风格的单词中按子单词的范围进行移动。 比如 FooBarExample 这个单词,移动的范围依次是 Foo Bar Example

今天写了一个插件,主要融合 skip-syntax-forward skip-syntax-backwardsubword-mode , 使得Emacs可以快速向左和向右进行语法块删除,同时遇到骆驼风格单词的时候可以快速删除子单词。

delete-block

安装方法见Github

使用方法

使用方法很简单, 绑定按键到下面两个函数:

delete-block-forward
delete-block-backward
3 个赞

刚刚看老王的Github动态更新了,然后就看你发帖了 :joy:

来用用我的jieba.el,可以按中文分词删除

哈哈哈,jieba分词是不是内存占用比较大? 原来写深度软件中心的时候,用过结巴分词做中文关键字搜索。

我一般对中文编辑的需求不大,主要来回切换输入法很烦。 :slight_smile:

都开lsp了,还差jieba这点占用啊,我没怎么注意看。

倒是nodejieba的API有点不舒服

LSP 太卡了 :frowning:

这个看起来很不错,回去试一试

确实卡,你平时用lsp么

不用,从来不用

好像这个只要开启 subword-mode 就能实现了

不是所有的人都喜欢 subword-mode , 所以只是在这个插件调用的时候,临时开启 subword-mode

刚刚试了试,这个在xubuntu emacs27.0.5下骆驼风格单词没有work。 我必须手动M-x subword-mode 才能开启这个功能,怎么回事呢

我看了看源代码

(let* ((subword-mode 1)
           ....)
   (kill-region ....))

我没学过elisp,但是我看(let* VARLIST BODY...)的文档,不应该是bind variables according to VARLIST then eval BODY吗,而subword-mode是function而不是variable吧…

我刚才把(subword-mode 1)let*里面移出来了,顺便在kill-region后面关掉subword-mode 以免影响forward-wordbackward-word。提了个PR,懒猫你看一看?

我自己默认开了 subword-mode , 所以你说的问题确实存在。

我已经写了个补丁来修复这个问题: Fix bug that subword movement can't work `subword-mode' is disable. · manateelazycat/delete-block@de31463 · GitHub

谢谢你的反馈。

1 个赞

https://github.com/manateelazycat/delete-block/commit/de314633f899f57ebd8fd3de2b7ddeaade746a74

已经修复了

刚刚有机会尝试了一下新的code,我发现还是有问题。在没有开启subword-mode时直接call (subword-forward)(subword-backward)是没有定义的:

save-excursion: Symbol’s function definition is void: subword-backward
save-excursion: Symbol’s function definition is void: subword-forward

还是得手动开启subword-mode,并且在跑完delete-block-forwarddelete-block-backwardsubword-mode依然不会自动关闭,在跑M-f / forward-word 和 M-b / backward-word 时还是会受到影响。

我重新发了个PR,你看一看

函数没有定义,直接 (require 'subword) 就可以了, 见补丁: Add subword depend. · manateelazycat/delete-block@50e1df3 · GitHub

然后直接调用 subword-forward 和 subword-backward

你那种用之前 (subword-mode 1) , 用完以后 (subword-mode -1) 的方式不对,这之间的代码会受到影响。

1 个赞

原来如此,谢谢