关于Vim的递归映射

kev*_*vin 1 vim vim-plugin

这是编写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,它会做不工作.

有人可以帮忙搞清楚吗?谢谢!

rom*_*inl 5

<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,等.