evil-mode 下用 shift-v 选中若干行, 函数调用得到的 (region-end) 比选中行的最后一个字符的 position 大 2

如题, 在 evil mode 下, 我在某个自己实现的函数中 (message %d (region-end)), 发现得到的 (region-end) 输出是 105983, 而这些行最后一个字符 what-cursor-position 得到的是 105981. 为什么会大 2 呢? 如果是大 1 我可以理解, 因为包含了 newline \n, 但大 2 我就不理解了. 我的平台是 macos, 换行就是 \n 而不是 \r\n.

难道这表示, 如果用 shift+v 选中若干个, (region-end) 就是会比最后一个字符的 position 大 2?

evil在按行选取的时候肯定有些自己的处理,要用它的api的话就跟着加减1什么的就好了。

测试搞个几行几十个字就好了,105983是什么和自己过不去的行为…… 得到region end之后在某个地方(point)对比一下就清楚了

你的意思是, 我应该看一看行为, 然后就把这个行为当做固定模式? 我现在看到的模式就是 +2?

呃之前没仔细看你的问题本身。我试了一下,region end是\n之后的位置,没问题,是+1。注意看point的时候要在insert mode看,normal mode你不清楚是那个光标的前面还是后面

要不你试试用 (point) 这个函数来得到 point ,别用 what-cursor-position?

这两个给出的是一样的

有没有可能是这样:

normal 模式下取得的某一行最后一个字符位置,是最后一个字符前的位置。而 region-end 是取得了 \n 之后的位置。这样就差 2 了。

1 个赞

现在我觉得在 visual mode 下试图用 (region-beginning) (region-end) 来获得选中内容本来就不是好的做法, 应该用 evil-visual-beginning, evil-visual-end.