gpt4 book ai didi

vim - VIM 中的锁定标记

转载 作者:行者123 更新时间:2023-12-04 19:49:37 31 4
gpt4 key购买 nike

有没有办法(内部或通过插件)防止标记被覆盖?我的意思是一种方法,如果它已经被使用,你就不能设置标记(我特别考虑全局标记)。

我正在考虑将它们添加到我的 vimrc 或 session 中,但我更喜欢另一种方式。

更新

不要给我发送脚本来执行此操作。我可以自己做,我的问题更多是 VIM 中是否有隐藏的方法来做,或者我是否必须自己编写脚本。答案显然是否定的。

无论如何,感谢已经向我发送脚本的人。我会用它们来编写自己的脚本(因为发送的脚本不是我想要的)

最佳答案

您可以使用自定义函数重新映射 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()

此功能将防止您重新映射标记。这就是它的工作原理:

  1. 我们定义一个字典,其中的键包含已经设置的标记(实际上我们可以使用列表,但字典应该更快一点)。
  2. 我们定义了一个函数:
    1. 选择下一个符号。由于 getchar 可能返回字符串或字符数字,我们必须将其转换回字符串。
    2. 检查我们是否要设置标记(您可以使用名称为 a 的标记,但不能使用名称为 % 的标记)。如果你尝试设置标记 %,它会被 vim 忽略,所以不需要保留无用的键。无需阻止您使用 m'm[m],因为我们无法阻止 vim 本身重新定义它们。
    3. 检查该函数是否已设置有问题的标记,如果是则抛出错误。
    4. 返回文本 mC,其中 C 是您的标记名称。
  3. 我们定义一个使用此函数返回值作为 {rhs} 的映射。

请注意,这不会阻止某人通过 normal!(但不是 normal without a bang)命令重新定义此标记,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()

关于vim - VIM 中的锁定标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387321/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com