对 vim 脚本表示很无语

Vim、Emacs配置和使用
回复
头像
自由建客
论坛版主
帖子: 13436
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

对 vim 脚本表示很无语

#1

帖子 自由建客 » 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 一般只能用全局标识符。
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

Re: 对 vim 脚本表示很无语

#2

帖子 xhy » 2010-11-23 12:56

函数不需要!, !是用来解决函数重复定义的,如果能保证不重复定义,可以不写!
SID本身就是给你map local键位用的,为什么要传出它?
这跟C语言在作用域外引用局部变量一个道理,虽然能做,但很dirty。
目前负债150多万
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 对 vim 脚本表示很无语

#3

帖子 lilydjwg » 2010-11-23 18:10

自由建客 写了: ...
对函数那种需要 ! 的做法已经很不满了,还来个鸡肋般的 <SID> ,其实定义函数或本脚本内调用根本用不着 <SID> ,用 s: 一样。SID 只在传出时才有价值。而偏偏要传出 SID 如此麻烦,很明显设计者根本就没考虑传出 SID 问题,或者其它原因,总之是很脑残的设计。要弄什么 SID 就应当弄得像 C++ 的 this 一样好用,要么就干脆如 C 一般只能用全局标识符。
很明显设计者不想让你把 SID 传出去。你要全局的话,为什么要写 s: 呢?你这是声明了一个局部变量,然后抱怨它不是全局变量!
头像
自由建客
论坛版主
帖子: 13436
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 对 vim 脚本表示很无语

#4

帖子 自由建客 » 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 有没有函数指针?
上次由 自由建客 在 2010-11-25 17:31,总共编辑 1 次。
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 对 vim 脚本表示很无语

#5

帖子 lilydjwg » 2010-11-25 10:14

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

代码: 全选

:h Funcref
头像
自由建客
论坛版主
帖子: 13436
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: 对 vim 脚本表示很无语

#6

帖子 自由建客 » 2010-11-25 17:33

这个不行,我指的是能否传出一个指向某函数的值。
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 对 vim 脚本表示很无语

#7

帖子 lilydjwg » 2010-11-25 17:53

自由建客 写了:这个不行,我指的是能否传出一个指向某函数的值。
有函数名就可以了呀。你到底要做什么啊?
回复

回到 “Vim和Emacs”