将标记设置为其先前的值


9

有时,我会使用mAmB...和'A'B... 使用标记轻松浏览不同的文件

有时,由于注意力不集中或任何原因(有时比我更想承认的),我使用m[LETTER]了一个已经存在的标记,当我不想使用该标记时会删除其先前的值。在大多数情况下,我没有打开标记所指向的文件。

在这种情况下,当我立即意识到自己犯了一个错误时,是否可以获取标记的先前值,而不是记住它所指向的位置,导航到该位置并再次进行设置?

我还没有在文档中找到这样的命令,所以如果不存在这样的命令,那么在这种情况下您可以使用一些聪明的解决方法吗?


1
你也可以看看这个帖子的进一步信息:superuser.com/questions/687441/...
nobe4

@ Nobe4感谢您的链接,但我没有找到它,但似乎可以确认确实不太容易做到这一点。
statox

使用跳转指令(ctrl-octrl-i:jumps用自己个人的记忆:))
VanLaser

Answers:


5

这是一些基本的VimScript,可以大致满足您的需求。

在调用原始设置标记之前,我们将覆盖ma直通mz映射以存储当前值。我们还通过定义来显示该商标的历史。g:previous_marksm<Leader>ma<Leader>mz

您可能希望以g:previous_marks一种更有条理的方式存储信息,并增加了快速恢复标记的功能(而不仅仅是查看位置),但是此示例说明了如何完成此操作,需要进行进一步的调整给读者;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()

哇,像往常一样惊人的答案!我将在本周末尝试花点时间为读者实施练习;)
statox

2

不完全是您想要的,但可能更有用:签名插件。它在装订线边距中将当前标记显示为标志,并具有用于编辑它们的简单快捷方式。它还可以将标志列表放在位置列表中,以便快速访问。


我不是边框上可见标记的忠实拥护者,但似乎有一些有趣的功能,我将对其进行介绍。
statox

@statox同样,也有标记。它实际上显示所有标记(上面的插件仅处理字母标记),并且可以使用键进行切换。我偶尔发现它有用。
佐藤桂2015年

是的,我已经使用展示标记一段时间了(与签名不同),这就是为什么我说我不喜欢标记的缘故,但是我现在正在尝试签名以查看是否喜欢它:-)
statox

2

由于实际的问题似乎是在多个文件/位置之间导航,所以我建议这个简单的解决方案是基于Unite插件的:

:Unite jump -auto-preview

该命令(可以映射为类似的命令<leader>j)将显示跳转列表带有预览:每次使用j/ 浏览列表时k,该文件中光标位置周围将显示多行。

在此处输入图片说明


选择:

默认标记是如此容易被覆盖:也许命名的书签会更适合您的用例,例如使用simple_bookmarks插件。


我真的不能说问题出在这种类型的导航上,因为我确实偶尔使用这些标记,并且在大多数情况下,我在文件中使用不同的导航方式。尽管如此,我已经思考了很长时间了,我应该更频繁地使用跳转列表,这似乎是一种不错的方法!
statox

即使可以在两次vim会话之间保存它们,也很容易覆盖标记。我添加了替代解决方案。
VanLaser

确实,非常感谢您尝试其他解决方案!
statox
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.