Vim
中是否有命令可以标记一个位置(文件路径、该文件中的行号),以便于以后可以轻松地跳转到那个位置?
这类似于NERDTree
的:Bookmark
命令。您可以使用NERDTreeFromBookmark
打开文件。我正在寻找相同的功能,但不同之处在于书签不仅是文件,还包括文件所在的行号。
谢谢
Vim
中是否有命令可以标记一个位置(文件路径、该文件中的行号),以便于以后可以轻松地跳转到那个位置?
这类似于NERDTree
的:Bookmark
命令。您可以使用NERDTreeFromBookmark
打开文件。我正在寻找相同的功能,但不同之处在于书签不仅是文件,还包括文件所在的行号。
谢谢
你可以使用“mark”命令来创建书签,有两种类型的书签可以创建,本地和全局,你正在引用全局书签。
你可以输入“mP”来创建一个名为P的书签。注意大小写,大写表示它是一个全局书签。要跳转到该书签,请键入`P。
希望这可以帮到你
NERDTreeFromBookmark
,然后可以通过 <kbd>tab</kbd> 循环浏览我的字符串书签,例如从 prj_
开始。标记的另一个缺点是我可以创建的书签数量有限。 - xralf:bd[elete]
,它们是持久的。文档:h bwipeout
也这样说。 - Brady Trainorviminfo
设置可以包含选项!
,使其将任何使用大写字母的全局变量存储在viminfo文件中。通过这种方式,您可以定义一个名为g:BOOKMARKS
的变量,并将书签存储在其中。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
" 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
将在quickfix窗口中加载书签,这对我来说似乎是一个不错的界面。
这个解决方案与Eric的解决方案类似--它使用.viminfo
文件,所以如果出现问题,您可能会丢失您的书签。如果您在一个vim实例中保存了书签,则它们不会立即在另一个实例中可用。
我不知道您对vimscript的熟悉程度如何,因此以防万一--要使用此功能,您可以将代码放在位于您的plugin
vimfiles目录下的文件中,例如plugin/bookmarks.vim
。应该完全足够。这里也有整个代码的gist:https://gist.github.com/1371174
编辑:略微更改了解决方案的接口。原始版本可以在gist历史记录中找到。
unlet g:BOOKMARKS
。该变量现在是一个哈希表,而不是一个数组,由于它被持久化了,你可能会遇到这个问题。 - Andrew Radev.viminfo
文件是否放置在某个临时目录中(虽然可能性很小)? - Andrew Radev.viminfo
的工作原理以及是否可信。(顺便说一句,我问了一个问题,关于如何修改您的脚本以将书签保存到普通文件中) - xralf" 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