这是编写vim插件的实践代码.我按照vim文档编写它::help usr_41.txt第41.11节写一个插件.
let s:save_cpo = &cpo
set cpo&vim
if exists("g:loaded_echoplugin")
finish
endif
function s:EchoWord()
echo expand('<cword>')
endfunction
if !exists(":EchoWord")
command -nargs=0 EchoWord :call s:EchoWord()
endif
if !hasmapto('<Plug>EchoWord')
map <F8> <Plug>EchoWord
endif
noremap <script> <Plug>EchoWord <SID>EchoWord
noremap <SID>EchoWord :call <SID>EchoWord()<CR>
let g:loaded_echoplugin = 1
let &cpo = s:save_cpo
unlet s:save_cpo
Run Code Online (Sandbox Code Playgroud)
代码用于在单击时显示光标下的单词<F8>.这是映射序列:<F8> -> <Plug>EchoWord -> <SID>EchoWord -> :call <SID>Echoword()它可以工作.
然而,在这里,我有两个问题:
1.我使用过noremap这里,为什么它仍然能够重映射或递归映射?
2.如果我改变从映射map <F8> <Plug>EchoWord到noremap <F8> <Plug>EchoWord,它会做不工作.
有人可以帮忙搞清楚吗?谢谢!
<Plug>Foo是一个映射.无论它本身是递归还是无关紧要.
当您执行递归映射时,Vim会使用右侧命令的当前含义:
map b B
map <key> db " works like dB
Run Code Online (Sandbox Code Playgroud)
当您执行非递归映射时,Vim使用右侧命令的原始含义:
map b B
map <key> db " works like db
Run Code Online (Sandbox Code Playgroud)
<Plug>Foo 默认情况下没有任何意义,因此无法以递归方式映射它.
你想递归,在这里,所以你应该使用map,imap,nmap,等.