分页: 1 / 1

对 vim 脚本表示很无语

发表于 : 2010-11-23 12:30
自由建客
为了一个 ftplugin ,不得不把文件头写得如此难看。

代码: 全选

" 和 $VIMRUNTIME/ftplugin/*.vim 一样,防重入,这点倒好说
if exists("b:did_ftplugin_after")
	finish
endif
let b:did_ftplugin_after = 1

" 关键的 SID ,要传出一个 SID 竟如此麻烦,或者说要获得自己的 SID
function! s:GetSID()
	return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_GetSID$')
endfunction
" undo_ftplugin 是必须的,看 $VIMRNTIME/ftplugin.vim
let b:undo_ftplugin_new = b:undo_ftplugin .
			\ " | call <SNR>" . s:GetSID() . "_UnDo_FtPlugin_After()" .
			\ " | unlet! b:did_ftplugin_after"
let b:undo_ftplugin = b:undo_ftplugin_new
unlet b:undo_ftplugin_new

“ =============
function! s:UnDo_FtPlugin_After()
" ……
" 脚本逻辑略
对函数那种需要 ! 的做法已经很不满了,还来个鸡肋般的 <SID> ,其实定义函数或本脚本内调用根本用不着 <SID> ,用 s: 一样。SID 只在传出时才有价值。而偏偏要传出 SID 如此麻烦,很明显设计者根本就没考虑传出 SID 问题,或者其它原因,总之是很脑残的设计。要弄什么 SID 就应当弄得像 C++ 的 this 一样好用,要么就干脆如 C 一般只能用全局标识符。

Re: 对 vim 脚本表示很无语

发表于 : 2010-11-23 12:56
xhy
函数不需要!, !是用来解决函数重复定义的,如果能保证不重复定义,可以不写!
SID本身就是给你map local键位用的,为什么要传出它?
这跟C语言在作用域外引用局部变量一个道理,虽然能做,但很dirty。

Re: 对 vim 脚本表示很无语

发表于 : 2010-11-23 18:10
lilydjwg
自由建客 写了: ...
对函数那种需要 ! 的做法已经很不满了,还来个鸡肋般的 <SID> ,其实定义函数或本脚本内调用根本用不着 <SID> ,用 s: 一样。SID 只在传出时才有价值。而偏偏要传出 SID 如此麻烦,很明显设计者根本就没考虑传出 SID 问题,或者其它原因,总之是很脑残的设计。要弄什么 SID 就应当弄得像 C++ 的 this 一样好用,要么就干脆如 C 一般只能用全局标识符。
很明显设计者不想让你把 SID 传出去。你要全局的话,为什么要写 s: 呢?你这是声明了一个局部变量,然后抱怨它不是全局变量!

Re: 对 vim 脚本表示很无语

发表于 : 2010-11-25 0:28
自由建客

代码: 全选

inoremap <buffer> <unique> ; <C-R>=<SID>Semicolon()<CR>

if !exists("*s:Semicolon")
	function s:Semicolon()
		let l:i = match(getline("."), "[^[:space:]]")
		if l:i+2 > col(".") || l:i == -1
			return "0\<C-D>\<BS>;\<CR>"
		endif
		return ";"
	endfunction
endif
果然这个 <SID> 有用。定义函数时依然用 s: ,只在映射时用 <SID> 。但其它情况 <SID> 和 s: 一样,没区别,这也太局限了。
vim 有没有函数指针?

Re: 对 vim 脚本表示很无语

发表于 : 2010-11-25 10:14
lilydjwg
自由建客 写了:....
果然这个 <SID> 有用。但其它情况 <SID> 和 s: 一样,没区别,这也太局限了。
vim 有没有函数指针?
有啊

代码: 全选

:h Funcref

Re: 对 vim 脚本表示很无语

发表于 : 2010-11-25 17:33
自由建客
这个不行,我指的是能否传出一个指向某函数的值。

Re: 对 vim 脚本表示很无语

发表于 : 2010-11-25 17:53
lilydjwg
自由建客 写了:这个不行,我指的是能否传出一个指向某函数的值。
有函数名就可以了呀。你到底要做什么啊?