分页: 1 / 2

vim 这个如何匹配

发表于 : 2011-08-25 21:55
自由建客
1.png
1.png (7.6 KiB) 查看 1868 次
其实这三个字节整串就是 <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>

Re: vim 这个如何匹配

发表于 : 2011-08-25 23:36
fanhe
用 <C-v>x80 打出来这个字符串

Re: vim 这个如何匹配

发表于 : 2011-08-25 23:51
自由建客
很遗憾,没用
1.png
1.png (3.85 KiB) 查看 1838 次
2.png
2.png (6.63 KiB) 查看 1838 次

Re: vim 这个如何匹配

发表于 : 2011-08-26 0:06
fanhe
你眼花了吧
这不是有效了吗

Re: vim 这个如何匹配

发表于 : 2011-08-26 0:14
自由建客
fanhe, :em20 是你眼花了,若有效果下面一行就不是那样而应该是 hello<F4>world<lt>F4> 了。
不过我找到原因了,此 80 非彼 80 ,看下面
1.png
1.png (9.21 KiB) 查看 1832 次
搜索只搜索到了下面的,没错,你没看花眼
2.png
2.png (5.89 KiB) 查看 1832 次
原因很清楚, vim 正则只能匹配到经过 UTF-8 编码(或许是本地编码)后的 x80 字符,而不是原始的纯粹的一个值为 x80 的单字节数,这在 UTF-8 中是非法字符。

Re: vim 这个如何匹配

发表于 : 2011-08-26 2:06
fanhe

代码: 全选

:let s = "hello\<F4>world<F4>" | echo substitute(s, '<80>4', '<F4>', 'g')
这样, 你就不能先试试只替换 <80> 的么, 没点研究精神怎么开发?
那个 <80> 是用 <C-v>x80 打出来的啊

Re: vim 这个如何匹配

发表于 : 2011-08-26 21:23
自由建客
大哥,我真服了你的眼神 :em25
还有谁会那么没常识不先去试图只匹配 <80>

Re: vim 这个如何匹配

发表于 : 2011-08-26 22:27
fanhe
自由建客 写了:大哥,我真服了你的眼神 :em25
还有谁会那么没常识不先去试图只匹配 <80>
我上面的回帖那段代码可以工作

Re: vim 这个如何匹配

发表于 : 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) 查看 1775 次
这个 <80>4 后面那个 4 是笔误吗?但这不重要,即便换成下面这样
2.png
2.png (3.58 KiB) 查看 1775 次
结果都是
3.png
3.png (2.33 KiB) 查看 1775 次
很显然替换没有成功!如果成功应该把 <80> 替换掉,变成 hello<F4>k4world<F4> !
原因我也找出来了, "\<F4>" 自动转译得到的是 <80>k4 三个字节,前面的 0x80 是单字节,而 <C-V>x80 输入的是 0xc280 双字节。
vim 显示的都是蓝色 <80> ,看上去一样,但实际不同,此 80 非彼 80 ,所以无法匹配,自然无法替换。

Re: vim 这个如何匹配

发表于 : 2011-08-26 22:54
自由建客
图片
还有这张图,也很清楚了, <C-V>x80 输入的只能匹配同样用 <C-V>x80 输入的字符,也就是下面那行。上面那行我是用 :call append(0, "hello\<F4>world<lt>F4>") 输入的,无法用 <C-V>x80 去匹配。

Re: vim 这个如何匹配

发表于 : 2011-08-26 23:10
lilydjwg
自由建客, 你那个 <80>k4 是怎么输入的?

Re: vim 这个如何匹配

发表于 : 2011-08-26 23:21
自由建客
lilydjwg, "\<F4>" 双引号中,自动转译的。实际应用就是在脚本中而不是在缓冲区,写入缓冲区用的是 append() ,只是为了弄清楚原因而已。
原因知道了,但没法解决,我改策略了,换种设计,绕过这个问题。

Re: vim 这个如何匹配

发表于 : 2011-08-26 23:29
fanhe
我明确告诉你
在我的 ubuntu 10.04,vim 7.3里面,<80>4完全可以替换
在windows 7里面,也可以替换,<80>可以替换,<80>4不行

反正,都可以替换 <80>

Re: vim 这个如何匹配

发表于 : 2011-08-26 23:44
自由建客
那只能说 7.3 进化了,我的 Debian vim 7.2 。

Re: vim 这个如何匹配

发表于 : 2011-08-27 16:13
自由建客
:em20 问题还是没能绕过去,企图绕过去,今天测试结果还是发现有问题。似乎得要用自动机了。