把 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()