10

是否有一个命令vim可以为一个地方添加书签(文件的路径,该文件中的行号),以便我以后可以轻松地去那个地方?

这将类似于NERDTree :Bookmark命令。您可以使用NERDTreeFromBookmark. 我正在寻找相同的功能,不同之处在于书签不仅是文件,而且是文件+行号。

谢谢

4

5 回答 5

20

是的,您可以使用“标记”命令执行此操作。您可以创建两种类型的书签,本地和全局。您指的是全局书签。

您可以键入“mP”来创建一个名为 P 的书签。注意大小写,大写表示它是一个全局书签。要转到该书签,请键入`P。

希望这可以帮助

资源

于 2011-11-09T10:52:46.833 回答
6

viminfo设置可以包含选项!,这使得它可以将任何带有大写字母的全局变量存储在 viminfo 文件中。使用它,您可以定义一个名为的变量g:BOOKMARKS并将您的书签存储在其中。

这是您可以用来执行此操作的一些 vimscript:

set viminfo+=!

if !exists('g:BOOKMARKS')
  let g:BOOKMARKS = {}
endif

" Add the current [filename, cursor position] in g:BOOKMARKS under the given
" name
command! -nargs=1 Bookmark call s:Bookmark(<f-args>)
function! s:Bookmark(name)
  let file   = expand('%:p')
  let cursor = getpos('.')

  if file != ''
    let g:BOOKMARKS[a:name] = [file, cursor]
  else
    echom "No file"
  endif

  wviminfo
endfunction

" Delete the user-chosen bookmark
command! -nargs=1 -complete=custom,s:BookmarkNames DelBookmark call s:DelBookmark(<f-args>)
function! s:DelBookmark(name)
  if !has_key(g:BOOKMARKS, a:name)
    return
  endif

  call remove(g:BOOKMARKS, a:name)
  wviminfo
endfunction

" Go to the user-chosen bookmark
command! -nargs=1 -complete=custom,s:BookmarkNames GotoBookmark call s:GotoBookmark(<f-args>)
function! s:GotoBookmark(name)
  if !has_key(g:BOOKMARKS, a:name)
    return
  endif

  let [filename, cursor] = g:BOOKMARKS[a:name]

  exe 'edit '.filename
  call setpos('.', cursor)
endfunction

" Completion function for choosing bookmarks
function! s:BookmarkNames(A, L, P)
  return join(sort(keys(g:BOOKMARKS)), "\n")
endfunction

我不确定代码的可读性如何,但基本上,该Bookmark命令接受一个参数作为名称。它将当前文件名和光标位置存储到g:BOOKMARKS字典中。您可以使用GotoBookmark带有标记名称的命令转到它。DelBookmark以相同的方式工作,但删除给定的标记。这两个功能都是制表符完成的。

跳过它们的另一种方法是使用以下命令:

" Open all bookmarks in the quickfix window
command! CopenBookmarks call s:CopenBookmarks()
function! s:CopenBookmarks()
  let choices = []

  for [name, place] in items(g:BOOKMARKS)
    let [filename, cursor] = place

    call add(choices, {
          \ 'text':     name,
          \ 'filename': filename,
          \ 'lnum':     cursor[1],
          \ 'col':      cursor[2]
          \ })
  endfor

  call setqflist(choices)
  copen
endfunction

CopenBookmarks将在快速修复窗口中加载书签,这对我来说似乎是一个不错的界面。

这个解决方案类似于 Eric 的解决方案——它使用.viminfo文件,所以如果它出现问题,你可能会失去你的分数。而且,如果您将标记保存在一个 vim 实例中,它们将不会立即在另一个实例中可用。

我不知道你对 vimscript 有多满意,所以以防万一——要使用它,你可以将代码放在你的pluginvimfiles 目录下的一个文件中,例如plugin/bookmarks.vim. 应该完全够用了。以下是要点中的完整代码:https ://gist.github.com/1371174

编辑:稍微改变了解决方案的界面。原始版本可以在 gist history 中找到。

于 2011-11-16T20:04:38.053 回答
1

I have used this script (number marks). There might be better ones though. Wait for other answers!

于 2011-11-09T10:50:04.703 回答
1

如上所述,这并不能解决您的问题,但您可能会发现它有所帮助。

MRU.vim - 最近使用的文件插件

键入:MRU,您将获得一个很好的可搜索列表,其中包含您最近使用的文件。按回车键将您带到它。

于 2011-11-15T22:04:21.020 回答
1
" When editing a file, always jump to the last known cursor position.
" And open enough folds to make the cursor is not folded
" Don't do it when the position is invalid or when inside an event handler
" (happens when dropping a file on gvim).
autocmd BufWinEnter *
            \ if line("'\"") <= line("$") |
            \   exe "normal! g`\"" | exe "normal! zv" |
            \ endif
于 2011-12-06T01:38:49.880 回答