Vim-覆盖插件作用域函数
我在Vim中有一个插件,我不喜欢其中单个函数的行为。但打开拉取请求并不是一种情况,而是一种扩展。Vim-覆盖插件作用域函数,vim,Vim,我在Vim中有一个插件,我不喜欢其中单个函数的行为。但打开拉取请求并不是一种情况,而是一种扩展。 我知道,只要新的定义在上一个定义之后出现,就可以使用bang作为后缀来覆盖函数。但是,如果这个方法的作用域是插件中的脚本,我怎么做呢? 我无法在Vim的帮助中找到提示,也无法请求搜索引擎。任何人都知道这个话题,至少如果他能说它根本不可能的话 一个简短的例子: plugin/autoload/plugin.vim ~/.vimrc 谢谢你的帮助 这是不可能的 s:foo()的作用域是它所属的脚本(请
我知道,只要新的定义在上一个定义之后出现,就可以使用bang作为后缀来覆盖函数。但是,如果这个方法的作用域是插件中的脚本,我怎么做呢?
我无法在Vim的帮助中找到提示,也无法请求搜索引擎。任何人都知道这个话题,至少如果他能说它根本不可能的话 一个简短的例子:
plugin/autoload/plugin.vim
~/.vimrc
谢谢你的帮助 这是不可能的
s:foo()
的作用域是它所属的脚本(请参见:help s:
),因此无法从其他任何地方访问它
s:foo()
的作用域是它所属的脚本(请参见:help s:
),因此无法从其他任何地方访问它
实际上这是可能的。但是正如@romainl所说,你最好向插件维护者推荐你的补丁,或者要求一个变化点 关于如何 首先,您需要确定这个自动加载插件的脚本号。假设
:scriptname
显示为210。为了自动做到这一点,我的库插件中有一个函数来完成这项工作——请参见答案末尾的当前定义
然后,要覆盖s:foo()
函数,需要为
function! <SNR>210_Foo()
new definition
endfunction
实际上这是可能的。但是正如@romainl所说,你最好向插件维护者推荐你的补丁,或者要求一个变化点 关于如何 首先,您需要确定这个自动加载插件的脚本号。假设
:scriptname
显示为210。为了自动做到这一点,我的库插件中有一个函数来完成这项工作——请参见答案末尾的当前定义
然后,要覆盖s:foo()
函数,需要为
function! <SNR>210_Foo()
new definition
endfunction
谢谢你确定。谢谢你确定。哇,太好了!我会尝试一下,但到目前为止,它看起来非常棒。到目前为止,我还不知道脚本ID的详细信息。通过Vims帮助进行的快速搜索没有提供任何关于如何分配ID的解释,在这种情况下,ID是静态的等等。关于这个主题,我有什么建议吗?我不知道是否有文档记录,但我观察到的是:每次脚本
source
d第一次出现一个新的id(好的,你的函数确实决定了这个通用性。很有趣。非常感谢!哇,太好了!我会尝试一下,但到目前为止它看起来非常棒。到目前为止,我还不知道脚本ID的详细信息。通过Vims帮助快速搜索并没有提供任何解释ID是如何分配的,在这种情况下它们是静态的等等。有什么建议吗关于这个主题我能做些什么吗?我不知道这是否有文档记录,但我观察到的是:每次脚本第一次是source
d,一个新的id(好的,你的函数确实决定了这个通用性。很有趣。非常感谢!
function! <SNR>210_Foo()
new definition
endfunction
" Function: lh#askvim#execute(command) {{{3
" @since Version 4.0.0
if exists('*execute')
function! lh#askvim#execute(command) abort
return split(execute(a:command), "\n")
endfunction
else
function! lh#askvim#execute(command) abort
return s:beware_running_through_client_server ? [] : split(lh#askvim#exe(a:command), "\n")
endfunction
endif
" Function: lh#askvim#scriptnames() {{{3
function! lh#askvim#scriptnames() abort
let scripts = lh#askvim#execute('scriptnames')
let s:scripts = map(copy(scripts), 'split(v:val, "\\v:=\\s+")')
call lh#list#map_on(s:scripts, 1, 'fnamemodify(v:val, ":p")')
return s:scripts
endfunction
" Function: lh#askvim#scriptid(name) {{{3
function! lh#askvim#scriptid(name, ...) abort
let last_change = get(a:, 1, 0)
if last_change || !exists('s:scripts')
call lh#askvim#scriptnames()
endif
let matches = filter(copy(s:scripts), 'v:val[1] =~ a:name')
if len(matches) > 1
throw "Too many scripts match `".a:name."`: ".string(matches)
elseif empty(matches)
if last_change
throw "No script match `".a:name."`"
else
return lh#askvim#scriptid(a:name, 1)
endif
endif
return matches[0][0]
endfunction