您可以m使用自定义功能重新映射:
let s:marks={}
function s:SetMark()
let m=getchar()
if type(m)==type(0)
let m=nr2char(m)
endif
if m=~#'^[a-zA-Z]$'
if has_key(s:marks, m)
throw "Mark ".m."is arleady set"
endif
let s:marks[m]=1
endif
return "m".m
endfunction
nnoremap <expr> m <SID>SetMark()
Run Code Online (Sandbox Code Playgroud)
此功能将阻止您重新映射标记.这就是它的工作原理:
getchar可能返回字符串或字符编号,我们必须将其转换回字符串.a,但不能使用名称标记%).如果你试图设置标记%,它将被vim忽略,所以不需要保留无用的密钥.没必要阻止你使用m',m[而且m]因为我们无法阻止VIM自身重新定义它们.mC,C您的标记名称在哪里.{rhs}.请注意,这不会阻止某人通过normal!(但不是normal没有爆炸)命令nnoremap(但不是没有nmap)映射或类似的东西重新定义此标记.
更新:s的修改版:SetMark:
function s:SetMark()
let m=getchar()
if type(m)==type(0)
let m=nr2char(m)
endif
if m=~#'^[A-Z]$'
let pos=getpos("'".m)
if pos[1]
echohl Error
echon "Mark ".m." is arleady set. Overwrite?"
echohl None
let c=getchar()
if type(c)==type(0)
let c=nr2char(c)
endif
echo
if c!=?'y'
return "<C-l>"
endif
endif
endif
return "m".m
endfunction
nnoremap <special><expr> m <SID>SetMark()
Run Code Online (Sandbox Code Playgroud)