vim 这个如何匹配

Vim、Emacs配置和使用
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

vim 这个如何匹配

#1

帖子 自由建客 » 2011-08-25 21:55

1.png
1.png (7.6 KiB) 查看 1856 次
其实这三个字节整串就是 <F4> 的键码,当然,我要匹配的并不是 0x80 而是这三个字节整串。实际环境是在一个字符串变量中,不是在缓冲区。

代码: 全选

let str="hello\<F4>world<F4>"                 " 双引号,文字量, vim 会自动翻译,其中 \<F4> 会变成那三个字节,后面的 <F4> 不变
let str=substitute(str, '<', '<lt>', "g")     " <F4> 处理成 <lt>F4>
let str=substitute(str, '\%x80k4', '<F4>', "g")                       " 这里不能达到预期目标,我要把那三个字节变成 <F4>
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim 这个如何匹配

#2

帖子 fanhe » 2011-08-25 23:36

用 <C-v>x80 打出来这个字符串
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#3

帖子 自由建客 » 2011-08-25 23:51

很遗憾,没用
1.png
1.png (3.85 KiB) 查看 1826 次
2.png
2.png (6.63 KiB) 查看 1826 次
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim 这个如何匹配

#4

帖子 fanhe » 2011-08-26 0:06

你眼花了吧
这不是有效了吗
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#5

帖子 自由建客 » 2011-08-26 0:14

fanhe, :em20 是你眼花了,若有效果下面一行就不是那样而应该是 hello<F4>world<lt>F4> 了。
不过我找到原因了,此 80 非彼 80 ,看下面
1.png
1.png (9.21 KiB) 查看 1820 次
搜索只搜索到了下面的,没错,你没看花眼
2.png
2.png (5.89 KiB) 查看 1820 次
原因很清楚, vim 正则只能匹配到经过 UTF-8 编码(或许是本地编码)后的 x80 字符,而不是原始的纯粹的一个值为 x80 的单字节数,这在 UTF-8 中是非法字符。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim 这个如何匹配

#6

帖子 fanhe » 2011-08-26 2:06

代码: 全选

:let s = "hello\<F4>world<F4>" | echo substitute(s, '<80>4', '<F4>', 'g')
这样, 你就不能先试试只替换 <80> 的么, 没点研究精神怎么开发?
那个 <80> 是用 <C-v>x80 打出来的啊
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#7

帖子 自由建客 » 2011-08-26 21:23

大哥,我真服了你的眼神 :em25
还有谁会那么没常识不先去试图只匹配 <80>
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim 这个如何匹配

#8

帖子 fanhe » 2011-08-26 22:27

自由建客 写了:大哥,我真服了你的眼神 :em25
还有谁会那么没常识不先去试图只匹配 <80>
我上面的回帖那段代码可以工作
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#9

帖子 自由建客 » 2011-08-26 22:49

fanhe 写了:

代码: 全选

:let s = "hello\<F4>world<F4>" | echo substitute(s, '<80>4', '<F4>', 'g')
1.png
1.png (3.63 KiB) 查看 1763 次
这个 <80>4 后面那个 4 是笔误吗?但这不重要,即便换成下面这样
2.png
2.png (3.58 KiB) 查看 1763 次
结果都是
3.png
3.png (2.33 KiB) 查看 1763 次
很显然替换没有成功!如果成功应该把 <80> 替换掉,变成 hello<F4>k4world<F4> !
原因我也找出来了, "\<F4>" 自动转译得到的是 <80>k4 三个字节,前面的 0x80 是单字节,而 <C-V>x80 输入的是 0xc280 双字节。
vim 显示的都是蓝色 <80> ,看上去一样,但实际不同,此 80 非彼 80 ,所以无法匹配,自然无法替换。
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#10

帖子 自由建客 » 2011-08-26 22:54

图片
还有这张图,也很清楚了, <C-V>x80 输入的只能匹配同样用 <C-V>x80 输入的字符,也就是下面那行。上面那行我是用 :call append(0, "hello\<F4>world<lt>F4>") 输入的,无法用 <C-V>x80 去匹配。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: vim 这个如何匹配

#11

帖子 lilydjwg » 2011-08-26 23:10

自由建客, 你那个 <80>k4 是怎么输入的?
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#12

帖子 自由建客 » 2011-08-26 23:21

lilydjwg, "\<F4>" 双引号中,自动转译的。实际应用就是在脚本中而不是在缓冲区,写入缓冲区用的是 append() ,只是为了弄清楚原因而已。
原因知道了,但没法解决,我改策略了,换种设计,绕过这个问题。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: vim 这个如何匹配

#13

帖子 fanhe » 2011-08-26 23:29

我明确告诉你
在我的 ubuntu 10.04,vim 7.3里面,<80>4完全可以替换
在windows 7里面,也可以替换,<80>可以替换,<80>4不行

反正,都可以替换 <80>
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#14

帖子 自由建客 » 2011-08-26 23:44

那只能说 7.3 进化了,我的 Debian vim 7.2 。
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: vim 这个如何匹配

#15

帖子 自由建客 » 2011-08-27 16:13

:em20 问题还是没能绕过去,企图绕过去,今天测试结果还是发现有问题。似乎得要用自动机了。
回复