请教,快捷键<%>在vimscript里面如何表示?

22 views
Skip to first unread message

tomt

unread,
Dec 23, 2009, 4:22:46 AM12/23/09
to Vim.cn
我想获得c中的函数体,目前想到的方法是,找出函数头和‘{’,然后用 快捷键<%>的功能定位函数结尾‘}’,然后正则处理?
在vim script里面怎么表示呢?
或者还有其他方法处理?

Jacky Liu

unread,
Dec 23, 2009, 8:29:05 AM12/23/09
to vim...@googlegroups.com
用 normal 命令

:help normal

2009/12/23 tomt <tomtf...@gmail.com>
我想获得c中的函数体,目前想到的方法是,找出函数头和‘{’,然后用 快捷键<%>的功能定位函数结尾‘}’,然后正则处理?
在vim script里面怎么表示呢?
或者还有其他方法处理?

--
要退订此论坛,请发邮件至 Vim-cn-un...@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/Vim-cn 访问该论坛

Tomt

unread,
Dec 23, 2009, 8:39:59 AM12/23/09
to vim...@googlegroups.com
谢谢,居然有这样的一组函数 normal ,visual .....,vim 仰望中

Jacky Liu

unread,
Dec 23, 2009, 8:52:31 AM12/23/09
to vim...@googlegroups.com
不是函数,是命令。搞混的话你可能会有麻烦。
处理跨多行的文本结构,用 normal 命令结合其他 buffer 操作(比如 search(),cursor(),:global ...)是最好的办法。很多 Vim 函数和外部的文本处理程序都是针对行的。太限制了。

2009/12/23 Tomt <tomtf...@gmail.com>
谢谢,居然有这样的一组函数 normal ,visual .....,vim 仰望中

--

Tomt

unread,
Dec 24, 2009, 7:29:25 AM12/24/09
to vim...@googlegroups.com
真是搞混了,比如说cursor,我是在自定义函数里面调用,一开始一直出错。

现在想问的是如何遍历所有buffer.但是 buffer bi出错

script.vim:
mydata={'fn':35}
function! List_func()
    let fn=g:mydata.fn
    echo fn
    let bi = 1
    while bi <= fn
    buffer bi
    let bi += 1
    endwhile
endfunction

call List_func()




Ricky

unread,
Dec 24, 2009, 8:05:31 AM12/24/09
to vim...@googlegroups.com
exec "buffer " . bi

Tomt

unread,
Dec 24, 2009, 8:16:55 AM12/24/09
to vim...@googlegroups.com
谢谢,之前找了很长时间都没有找到,

Jacky Liu

unread,
Dec 24, 2009, 1:33:17 PM12/24/09
to vim...@googlegroups.com
把 buffer 当个数据类型,跟 string、List 这些一样。对于你关心的 buffer ,像其他类型的变量那样保存下来,然后基本上以变量那种方式使用。
 
---- 建立 buffer:
 
定义个变量 _bufname 用来保存 buffer name,不要有冲突。可以用一个函数生成它。
用 :badd 命令把新 buffer 加到 buffer 列表里。buffer 列表可以用 :ls 命令查看。加入时 Vim 会赋给它一个 buffer number。
定义个变量 _bufnr 保存新的 buffer number。buffer number 用 bufnr() 函数可以获得。
定义个 List:_buflines[] 用来缓存 buffer 的内容。不需要更新时可以直接拿来显示。
用 setbufvar() 函数把新 buffer 的类型设成 'nofile',这样所有跟 buffer 有关的东西都放在内存里,避免麻烦的文件操作。
 
---- 显示 buffer:
 
用 :buffer 命令在当前窗口内打开 buffer,用 append() 函数把 _buflines[] 的内容写进去。
 
---- 修改 buffer:
 
需要使用 buffer 操作时,先在窗口内显示,然后用 cursor(),:normal,search(),:global,:yank,:put ... 这些操作修改它的内容。
不需要使用 buffer 操作时,用 map(),filter(),split(),join() ... 这些操作直接修改 _buflines[] 的内容。
 
---- 撤销 buffer:
 
用 :unlet 命令撤销 _bufnr,_bufname,_buflines[] 三个变量,用 :bdelete 命令把它从 buffer 列表里删除。
 
 
可以把 buffer 定义成一个类,_bufnr,_bufname,_buflines[] 作为它的数据成员,相关的操作作为成员函数:
 
let Buffer= {}
 
 " ---- 数据成员 ----
 
 let Buffer._bufname= ''
 let Buffer._bufnr= 0
 let Buffer._buflines= []
 
 " ---- 相当于构造函数 ----
 
 function! Buffer.New(bufname) 
    let obj= copy(self)
    let obj._bufname= a:bufname
    exe 'badd ' . obj._bufname
    let obj._bufnr= bufnr(obj._bufname)
    call setbufvar(obj._bufnr, '&buftype', 'nofile')
    return obj
 endfunction
 
 " ---- 其它可能的成员函数 ----
 
 function! Buffer.Open()  " 在当前窗口内打开
 endfunction
 
 function! Buffer.DefineSyntax() " 定义这个 buffer 之内的语法高亮
 endfunction
 
 function! Buffer.DefineKeyMapping() " 定义这个 buffer 之内的按键操作
 endfunction
 
 function! Buffer.Clear() " 撤销 Buffer 对象之前的清理工作
 endfunction
 
这个 Buffer 类很适合在更复杂的类里面作为一个成员,充当用户界面的角色。因为里面既包含了要显示给用户看的内容,又定义了用户可以在这个 Buffer 内进行的操作。

 
 

 
script.vim:
mydata={'fn':35}
function! List_func()
    let fn=g:mydata.fn
    echo fn
    let bi = 1
    while bi <= fn
    buffer bi
    let bi += 1
    endwhile
endfunction

call List_func()

Tomt

unread,
Dec 25, 2009, 10:52:35 AM12/25/09
to vim...@googlegroups.com
谢谢,仔细看了一遍,之前写的脚本按这个改了一些。

现在试着处理函数体,不过处理c文件中的注释部分无从下手。考虑还是处理前先格式化原文件,简化注释部分结构,这样正则好写一点。

一开始的<%>man中找到 对应的 searchpair ,不过没有 ”normal % “方便

Jacky Liu

unread,
Dec 26, 2009, 12:21:33 AM12/26/09
to vim...@googlegroups.com
我都是先删除所有的注释和空行以后再处理。删除后的内容保存在 buffer 里,不用改动磁盘文件。

Vim 有提供一个“标准”的流程,使用 synIDattr() 和 synID() 这些函数,让你可以通过检查某段文本的语法项判断它的性质。比如,是否处在注释里面,找到的是关键字,还是字符串的一部分,等等。简单的例子在 :help searchpair() 里。复杂点的例子在 tip.txt 的最后一段。


2009/12/25 Tomt <tomtf...@gmail.com>
谢谢,仔细看了一遍,之前写的脚本按这个改了一些。

现在试着处理函数体,不过处理c文件中的注释部分无从下手。考虑还是处理前先格式化原文件,简化注释部分结构,这样正则好写一点。

一开始的<%>man中找到 对应的 searchpair ,不过没有 ”normal % “方便

Tomt

unread,
Dec 27, 2009, 2:02:28 AM12/27/09
to vim...@googlegroups.com
参照你的方法, 我把注释部分连同相关行提取,然后在文件编辑结束的时候追加到文件尾部,这样处理简化些
Reply all
Reply to author
Forward
0 new messages