Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VIM中的锁定标记_Vim - Fatal编程技术网

VIM中的锁定标记

VIM中的锁定标记,vim,Vim,是否有任何方法(内部或通过插件)防止标记被覆盖? 我指的是一种方法,如果它已经被使用,你就不能设置一个标记(我特别想到的是全局标记) 我正在考虑将它们添加到我的vimrc或会话中,但我更喜欢另一种方式 更新 不要给我发脚本来做这件事。我可以自己做,我的问题更多的是,如果VIM中有一个隐藏的方法来做,或者如果我必须自己写一个脚本。答案显然是否定的 无论如何,感谢那些已经给我发了剧本的人。我将使用它们编写我自己的脚本(因为发送的脚本并不完全是我想要的)您可以在运行特定命令时防止更改标记。看 没有办

是否有任何方法(内部或通过插件)防止标记被覆盖? 我指的是一种方法,如果它已经被使用,你就不能设置一个标记(我特别想到的是全局标记)

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

更新 不要给我发脚本来做这件事。我可以自己做,我的问题更多的是,如果VIM中有一个隐藏的方法来做,或者如果我必须自己写一个脚本。答案显然是否定的


无论如何,感谢那些已经给我发了剧本的人。我将使用它们编写我自己的脚本(因为发送的脚本并不完全是我想要的)

您可以在运行特定命令时防止更改标记。看


没有办法防止它们被重写,但您可以使用一个函数,该函数要求使用该标记,通知您是否已使用该标记,并提示输入另一个标记

fun! SetMark()
    let mark = ''
    while mark == ''
        call inputsave()
        let mark = input('Mark to set (Enter to cancel)? ')
        call inputrestore()
        if mark == ''
            return
        endif
        if mark !~# '^[A-Z]$'
            echohl Error
            echo "Invalid mark name.  Must be a capital letter."
            echohl None
            let mark = ''
            continue
        endif
        let pos = getpos("'" . mark)
        if pos[1] != 0 " Used mark
            let fname = fnamemodify(bufname(pos[0]), ':~:.')
            call inputsave()
            let yn = input('Mark already set for ' . fname . '. Overwrite? (y/n) ')
            call inputrestore()
            if yn !~? '^y'
                let mark = ''
            endif
        endif
    endwhile
    exe 'normal m' . mark
endfun
nnoremap <F2> :call SetMark()<CR>
有趣!设定标记()
让mark=''
而马克==''
调用inputsave()
让标记=输入('标记设置(输入取消)')
调用inputrestore()
如果标记=“”
返回
恩迪夫
如果标记!~#'^[A-Z]$'
echohl误差
echo“无效的标记名称。必须是大写字母。”
无回声
让mark=''
持续
恩迪夫
让pos=getpos(“'.”标记)
如果位置[1]!=0“已用标记
让fname=fnamemodify(bufname(位置[0]),':~:。)
调用inputsave()
让yn=input('标记已设置为'.fname.'。覆盖?(y/n)'
调用inputrestore()
如果yn!~?“^y”
让mark=''
恩迪夫
恩迪夫
循环结束
exe'normal m'。标记
结束
nnoremap:调用设置标记()

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

我想要的是,如果当前标记已设置,则标记不会执行任何操作。谢谢,这正是我想要的,我想我需要将您的脚本与ZyX one混合使用。@mb14这是混合,请参阅更新的答案。不知道,这是
getpos()[1]
of unset mark为零。您能否通过在vimrc中设置标记,用您试图解决的用例更新您的问题?许多标记是特定于缓冲区的,因此在vimrc/session文件中设置它们没有多大意义。此外,Vim会记住会话中的标记,因此您的度量为“如果已经设置了标记,则不要设置标记“不会很好地工作。我有几个文件(主要是配置文件或具有复杂路径的文件),它们上有全局标记(因此不依赖于缓冲区)(例如,我的~/.vimrc设置为V)。由于我不一定记得在设置新书签时已经使用过的所有字母,所以我想记下已经存在的擦除标记。(我的内部映射以一种方式工作,文件->字母,但不是更简单的方式,因此如果我想到一个文件,我可以记住哪个书签,但我不知道哪些标记已经使用或免费)我不认为标记是实现这一点的正确工具……您可以只映射一个命令来打开您想要的文件,即映射gV:e~/.vimrc(您可以添加拆分或任何您喜欢的内容)抱歉,但我认为这正是全局标记的用途。在我错误地销毁它们之前,它工作得非常好。键入mV比编辑我的vimrc(我正在考虑在我的问题中所说的最后一种方法中进行编辑)要容易得多,也快得多我更多的是询问他们是否已经在某个地方编写了这样的脚本,而不是要求某人编写。无论如何,谢谢你。我唯一关心的是,这样做不起作用。(它不检查是否定义了标记,但是否在会话中设置了标记)酷,如果您想事先添加任何许可证,我可能会将其发布在vim网站上。@mb14这是公共域,因为我不想为这么少量的代码而烦恼。
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()