Vim-覆盖插件作用域函数

Vim-覆盖插件作用域函数,vim,Vim,我在Vim中有一个插件,我不喜欢其中单个函数的行为。但打开拉取请求并不是一种情况,而是一种扩展。 我知道,只要新的定义在上一个定义之后出现,就可以使用bang作为后缀来覆盖函数。但是,如果这个方法的作用域是插件中的脚本,我怎么做呢? 我无法在Vim的帮助中找到提示,也无法请求搜索引擎。任何人都知道这个话题,至少如果他能说它根本不可能的话 一个简短的例子: plugin/autoload/plugin.vim ~/.vimrc 谢谢你的帮助 这是不可能的 s:foo()的作用域是它所属的脚本(请

我在Vim中有一个插件,我不喜欢其中单个函数的行为。但打开拉取请求并不是一种情况,而是一种扩展。
我知道,只要新的定义在上一个定义之后出现,就可以使用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