在vim脚本的函数中设置vim映射

时间:2018-07-25 12:23:14

标签: vim vim-plugin

我正在尝试为vim做一个小插件,以便让我浏览文件的清晰案例历史记录,但是上手起来很麻烦。我需要设置暴露给用户的映射方面的帮助。

这是我所做的工作的最低限度版本

function! s:DefineLeftKeyMaps()
    echom 'in defineLeft'
    nnoremap  <leader>k <Plug>MinimalDoSomething
endfunction


noremap <script> <Plug>MinimalDoSomething    <SID>DoSomething
noremap <SID>DoSomething :call <SID>DoSomething()<CR>

function! s:DoSomething()
    echom 'In DoSomething'
endfunction

command! InitCCTTSample call s:DefineLeftKeyMaps()

我需要在函数中设置暴露给用户的最终映射,因为它将用于拆分中,在该拆分中我打开不同的文件(最终使用所述映射)。由于它是一个缓冲区本地映射,我认为我每次都需要重置它。

编辑: 上述解决方案的问题在于,即使您进行映射也没有任何作用。

:map报告:

....
....
\k     * <Plug>MinimalDoSomething
....
....

原因是我使用noremap而不是map,因此后续到函数调用的映射被忽略了

欢呼

2 个答案:

答案 0 :(得分:2)

<plug>映射很难定义为缓冲区本地映射。实际上,最终用户无法在其.vimrc中定义它们,而无法在ftplugin中定义它们,这意味着您需要将文件类型与拆分缓冲区相关联。

您需要为最终用户提供一个挂钩。我看到了两种解决方案

  1. 提供一项功能,使最终用户能够在其.vimrc中注册她/他的偏好。

    " .vimrc
    call your#plug#tune_mappings({'<Plug>MinimalDoSomething': '<localleader>left'})
    
  2. 从插件触发事件时,向用户公开用户事件以供用户执行操作(例如定义映射)。

    " .vimrc
    augroup YourPlugUser
      au!
      au User TuneKeyBindings let b:maplocalleader = ',,'
      au User TuneKeyBindings nmap <buffer> <localleader><left> <Plug>MinimalDoSomething
    aug END
    
    " your plugin
    split yourplug://foobar
    doautocommand User TuneKeyBindings 
    if !hasmapto('<Plug>MinimalDoSomething, 'n')
      nmap <buffer> <leader>k <Plug>MinimalDoSomething
    endif
    

答案 1 :(得分:0)

它不起作用的原因是因为我使用了nnoremap <leader>k <Plug>MinimalDoSomething而不是nmap <leader>k <Plug>MinimalDoSomething

欢呼