怎样把vim的一些操作与中文(比如分词)结合

我首先想到的是分词的问题。 英文中可以通过空格来区分一个单词,但是中文不存在这样的分隔符,于是有这样的问题:

一个例子 计算|机科学是一门非常神奇的学科 此句话中“|”表示光标所在的位置,能否通过cawdaw等类似的操作实现对“计算机”这个词语的编辑?

2 个赞

好有难度,我估计难以做到,这需要一个大的词库,检索时可能会比较耗性能.

先可以考虑把一个字当成一个词,这个相对比较简单.

不可能的任务。

编辑器怎么知道你 caw 是要选 「计算机」,还是「计算」,还是「计算机科学」呢,边界在哪里?即便是用拼音输入法的库,也得输入 jsj 才能确定。

是有这个问题,我也没想得特别清楚。 不过是不是可以有这两种改进:

  1. 设置成最短(或最长)匹配
  2. 输入caw后先进入的是最短匹配(删除了“计算”),然后按一个按键—比如Alt—就将匹配级别扩大一级(删除“机”),再按一次Alt就能删除“科学”

顺便请教一下,「」这两个符号是怎么打出来的?:slight_smile:

随着计算机性能的增强,也许这不再是问题:[quote=“MephistoMMM, post:2, topic:2072, full:true”] 需要一个大的词库,检索时可能会比较耗性能 [/quote]

这样的话,就直接用cl,dl…就行了:

还是拿这句话做例子: 计算|机科学是一门非常神奇的学科 当我想删除从光标位置起到后面的某个字之间的所有文字时(不借助鼠标),我总觉得要迟疑一下 我一般的做法是:

  1. 进入visual模式
  2. l移动光标,选中要删除的所有字符
  3. 然后按d. 其中的第2步,让人感觉好慢。这也促使我想到了中文分词。

不知道大家处理类似的问题是怎么做的,有没有什么好的方法? 是不是能像avy-goto-char一样,借助拼音来提高这种操作的效率?

渐进式/逐步逼近是一个比较可行的方案,https://github.com/magnars/expand-region.el 也是这种思路。

哈,回去看看你自己的提问贴,我在回复中有写 evil-surround有这个功能吗?

可以用专门的、现成的中文分词程序。

youdao-dictionary 有这个功能(翻译光标下的中文词汇),但默认没开,一来要安装额外的依赖,二来效果不知道怎样,一实现完,我就没兴趣用了。我把这个功能放到 chinese-word-at-point 里了,用的是 结巴中文分词

1 个赞

用输入法?macOS 下自带的拼音输入法有这个功能,其它的输入法应该也有。

在 Emacs 里也可以用 C-x 8 RET,再输入 300c300d

分词是个不确定性的操作,不觉得是个好主意。

目前 normal state 下面结合拼音首字母操作感觉算比较方便的了。比如你的例子,用 Fjdfj

其实我想问的是两个符号最初是怎么输入的。 几乎没有用过这两个字符,看键盘的按键没有对应的,竟然没想到是用输入法@xuchunyang,见笑啦。

真能用拼音首字母啊!?

你说的只是一种设想?还是已经有轮子了?

evil-find-char-pinyin

1 个赞

chinese-pyim 里面有一个函数 pyim-forward-word 可以分词来移动光标。

1 个赞

这个输入法真强大!我以前竟然把它exclude了,真是罪过!

刚对比了一下evil-find-char-pinyinpyim-forward-word,确实如大神所说,拼音首字母操作比较方便!

我为了装逼现注册了一下,哈哈哈:joy: vim下可以在插入模式"C-k"+"<"+“7”,和"C-k"+“7”+">" 具体参照:h digraph-tables :grinning:

macOS 自带拼音输入还是有点麻烦,一个更便捷的方法是修改 ~/Library/KeyBindings/DefaultKeyBinding.dict

{
  // Multiple sign fix
  "^*" = ("insertText:", "×");

  // Ideographic space fix
  "^$\U0020" = ("insertText:", " ");

  // Curly quotes fix
  "^[" = ("insertText:", "“");
  "^]" = ("insertText:", "”");
  "^{" = ("insertText:", "‘");
  "^}" = ("insertText:", "’");

  // Chinese quotation marks fix
  "~[" = ("insertText:", "「");
  "~]" = ("insertText:", "」");
  "~{" = ("insertText:", "『");
  "~}" = ("insertText:", "』");
}

这样就可以直接按 Alt-[ 输入方角引号了。