vim
中是否有可以为某个地方添加书签的命令(该文件的路径,该文件中的行号),以便我以后可以轻松到达该地点?
它与NERDTree
:Bookmark
命令类似。您可以使用NERDTreeFromBookmark
打开文件。我正在寻找相同的功能,区别在于书签不仅是文件,还有文件+行号。
谢谢
答案 0 :(得分:20)
是的,您可以使用'mark'命令执行此操作。您可以创建两种类型的书签,本地和全局。您指的是全局书签。
您可以输入'mP'来创建一个名为P的书签。注意大小写,大写表示它是一个全局书签。要转到该书签,请键入“P。
”希望这有帮助
答案 1 :(得分: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
会在quickfix窗口中加载书签,这对我来说似乎是个不错的界面。
此解决方案类似于Eric的 - 它使用.viminfo
文件,因此如果出现问题,您可能会丢失标记。如果您将标记保存在一个vim实例中,它们将不会立即在另一个实例中可用。
我不知道你对vimscript有多满意,所以为了以防万一 - 你可以将代码放在plugin
vimfiles目录下的文件中,例如plugin/bookmarks.vim
。应该完全够了。以下是要点中的完整代码:https://gist.github.com/1371174
编辑:稍微更改了解决方案的界面。原始版本可以在要点历史中找到。
答案 2 :(得分:1)
我使用过this script (number marks)。可能会有更好的。等待其他答案!
答案 3 :(得分:1)
答案 4 :(得分: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