Version 0.3
Important bug fixes: - Now the script should work for the console version of VIM. (The sign list is sorted in gvim, but in vim, it is not...) - Map "mm" to toggle visual marks
This commit is contained in:
commit
201de554a5
12
README
Normal file
12
README
Normal file
@ -0,0 +1,12 @@
|
||||
This is a mirror of http://www.vim.org/scripts/script.php?script_id=1026
|
||||
|
||||
This script uses Vim's "sign" capability to provide visual marks, similar to UltraEdit's bookmark.
|
||||
|
||||
1. For gvim, use "Ctrl + F2" to toggle a visual mark.
|
||||
For both vim and gvim, use "mm" to toggle a visual mark.
|
||||
2. Use "F2" to navigate through the visual marks forward in the file.
|
||||
3. Use "Shift + F2" to navigate backwards.
|
||||
|
||||
If you do not like the highlighting scheme, you could change "SignColor" in the script. Feedbacks are welcome. :-)
|
||||
|
||||
|
335
plugin/visualmark.vim
Normal file
335
plugin/visualmark.vim
Normal file
@ -0,0 +1,335 @@
|
||||
" Visual Mark
|
||||
" 2005-03-15, brian wang
|
||||
"
|
||||
" Acknowledgements:
|
||||
" - Thanks to Hari Krishna Dara's genutils.vim (http://vim.sourceforge.net/scripts/script.php?script_id=197)
|
||||
" - Thanks to Mr. Charles E. Campbell, Jr. for making this script more plugin-like :-)
|
||||
" - Thanks to Mr. Charles E. Campbell, Jr. for making this script adapt to
|
||||
" dark/light backgrounds
|
||||
|
||||
if exists("loaded_VisualMark")
|
||||
finish
|
||||
endif
|
||||
let loaded_VisualMark = 1
|
||||
if !has("signs")
|
||||
echoerr "***sorry*** [".expand("%")."] your vim doesn't support signs"
|
||||
finish
|
||||
endif
|
||||
|
||||
if &bg == "dark"
|
||||
highlight SignColor ctermfg=white ctermbg=blue guifg=white guibg=RoyalBlue3
|
||||
else
|
||||
highlight SignColor ctermbg=white ctermfg=blue guibg=grey guifg=RoyalBlue3
|
||||
endif
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Public Interface:
|
||||
if !hasmapto('<Plug>Vm_toggle_sign')
|
||||
map <unique> <c-F2> <Plug>Vm_toggle_sign
|
||||
map <silent> <unique> mm <Plug>Vm_toggle_sign
|
||||
endif
|
||||
nnoremap <silent> <script> <Plug>Vm_toggle_sign :call Vm_toggle_sign()<cr>
|
||||
|
||||
if !hasmapto('<Plug>Vm_goto_next_sign')
|
||||
map <unique> <F2> <Plug>Vm_goto_next_sign
|
||||
endif
|
||||
nnoremap <silent> <script> <Plug>Vm_goto_next_sign :call Vm_goto_next_sign()<cr>
|
||||
|
||||
if !hasmapto('<Plug>Vm_goto_prev_sign')
|
||||
map <unique> <s-F2> <Plug>Vm_goto_prev_sign
|
||||
endif
|
||||
nnoremap <silent> <script> <Plug>Vm_goto_prev_sign :call Vm_goto_prev_sign()<cr>
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" GetVimCmdOutput:
|
||||
" Stole from Hari Krishna Dara's genutils.vim (http://vim.sourceforge.net/scripts/script.php?script_id=197)
|
||||
" to ease the scripts dependency issue
|
||||
fun! s:GetVimCmdOutput(cmd)
|
||||
" call Dfunc("GetVimCmdOutput(cmd.".a:cmd.">)")
|
||||
|
||||
" Save the original locale setting for the messages
|
||||
let old_lang = v:lang
|
||||
|
||||
" Set the language to English
|
||||
exec ":lan mes en_US"
|
||||
|
||||
let v:errmsg = ''
|
||||
let output = ''
|
||||
let _z = @z
|
||||
|
||||
try
|
||||
redir @z
|
||||
silent exe a:cmd
|
||||
catch /.*/
|
||||
let v:errmsg = substitute(v:exception, '^[^:]\+:', '', '')
|
||||
finally
|
||||
redir END
|
||||
if v:errmsg == ''
|
||||
let output = @z
|
||||
endif
|
||||
let @z = _z
|
||||
endtry
|
||||
|
||||
" Restore the original locale
|
||||
exec ":lan mes " . old_lang
|
||||
|
||||
" call Dret("GetVimCmdOutput <".output.">")
|
||||
return output
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_place_sign:
|
||||
fun! s:Vm_place_sign()
|
||||
" call Dfunc("Vm_place_sign()")
|
||||
|
||||
if !exists("b:Vm_sign_number")
|
||||
let b:Vm_sign_number = 1
|
||||
endif
|
||||
|
||||
let ln = line(".")
|
||||
|
||||
exe 'sign define SignSymbol linehl=SignColor texthl=SignColor'
|
||||
exe 'sign place ' . b:Vm_sign_number . ' line=' . ln . ' name=SignSymbol buffer=' . winbufnr(0)
|
||||
|
||||
let vsn = b:Vm_sign_number
|
||||
let b:Vm_sign_number = b:Vm_sign_number + 1
|
||||
|
||||
" call Dret("Vm_place_sign : sign#".vsn." line#".ln." buf#".winbufnr(0))
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_remove_sign:
|
||||
fun! s:Vm_remove_sign(sign_id)
|
||||
" call Dfunc("Vm_remove_sign(sign_id=".a:sign_id.")")
|
||||
silent! exe 'sign unplace ' . a:sign_id . ' buffer=' . winbufnr(0)
|
||||
" call Dret("Vm_remove_sign")
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_remove_all_signs:
|
||||
fun! s:Vm_remove_all_signs()
|
||||
" call Dfunc("Vm_remove_all_signs()")
|
||||
silent! exe 'sign unplace *'
|
||||
" call Dret("Vm_remove_all_signs")
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_get_sign_id_from_line:
|
||||
fun! s:Vm_get_sign_id_from_line(line_number)
|
||||
" call Dfunc("Vm_get_sign_id_from_line(line_number=".a:line_number.")")
|
||||
|
||||
let sign_list = s:GetVimCmdOutput('sign place buffer=' . winbufnr(0))
|
||||
" call Decho(sign_list)
|
||||
|
||||
let line_str_index = match(sign_list, "line=" . a:line_number, 0)
|
||||
if line_str_index < 0
|
||||
" call Dret("Vm_get_sign_id_from_line -1")
|
||||
return -1
|
||||
endif
|
||||
|
||||
let id_str_index = matchend(sign_list, "id=", line_str_index)
|
||||
" let tmp = strpart(sign_list, id_str_index, 10) "Decho
|
||||
" call Decho("ID str index: " . tmp)
|
||||
if id_str_index < 0
|
||||
" call Dret("Vm_get_sign_id_from_line -1")
|
||||
return -1
|
||||
endif
|
||||
|
||||
let space_index = match(sign_list, " ", id_str_index)
|
||||
let id = strpart(sign_list, id_str_index, space_index - id_str_index)
|
||||
|
||||
" call Dret("Vm_get_sign_id_from_line ".id)
|
||||
return id
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_toggle_sign:
|
||||
fun! Vm_toggle_sign()
|
||||
" call Dfunc("Vm_toggle_sign()")
|
||||
|
||||
let curr_line_number = line(".")
|
||||
let sign_id = s:Vm_get_sign_id_from_line(curr_line_number)
|
||||
|
||||
if sign_id < 0
|
||||
let is_on = 0
|
||||
else
|
||||
let is_on = 1
|
||||
endif
|
||||
|
||||
if (is_on != 0)
|
||||
call s:Vm_remove_sign(sign_id)
|
||||
else
|
||||
call s:Vm_place_sign()
|
||||
endif
|
||||
|
||||
" call Dret("Vm_toggle_sign")
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_get_line_number:
|
||||
fun! s:Vm_get_line_number(string)
|
||||
" call Dfunc("Vm_get_line_number(string<".a:string.">)")
|
||||
|
||||
let line_str_index = match(a:string, "line=", b:Vm_start_from)
|
||||
if line_str_index <= 0
|
||||
" call Dret("Vm_get_line_number -1")
|
||||
return -1
|
||||
endif
|
||||
|
||||
let equal_sign_index = match(a:string, "=", line_str_index)
|
||||
let space_index = match(a:string, " ", equal_sign_index)
|
||||
let line_number = strpart(a:string, equal_sign_index + 1, space_index - equal_sign_index - 1)
|
||||
let b:Vm_start_from = space_index
|
||||
|
||||
" call Dret("Vm_get_line_number ".line_number." : =indx:".equal_sign_index." _indx=".space_index)
|
||||
return line_number
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_get_next_sign_line:
|
||||
fun! s:Vm_get_next_sign_line(curr_line_number)
|
||||
" call Dfunc("Vm_get_next_sign_line(curr_line_number=".a:curr_line_number.">)")
|
||||
|
||||
let b:Vm_start_from = 1
|
||||
let sign_list = s:GetVimCmdOutput('sign place buffer=' . winbufnr(0))
|
||||
" call Decho("sign_list<".sign_list.">")
|
||||
|
||||
let curr_line_number = a:curr_line_number
|
||||
let line_number = 1
|
||||
let is_no_sign = 1
|
||||
let min_line_number = -1
|
||||
let min_line_number_diff = 0
|
||||
|
||||
while 1
|
||||
let line_number = s:Vm_get_line_number(sign_list)
|
||||
if line_number < 0
|
||||
break
|
||||
endif
|
||||
|
||||
" Record the very first line that has a sign
|
||||
if is_no_sign != 0
|
||||
let min_line_number = line_number
|
||||
elseif line_number < min_line_number
|
||||
let min_line_number = line_number
|
||||
endif
|
||||
let is_no_sign = 0
|
||||
|
||||
" let tmp_diff = curr_line_number - line_number
|
||||
let tmp_diff = line_number - curr_line_number
|
||||
if tmp_diff > 0
|
||||
" line_number is below curr_line_number
|
||||
if min_line_number_diff > 0
|
||||
if tmp_diff < min_line_number_diff
|
||||
let min_line_number_diff = tmp_diff
|
||||
endif
|
||||
else
|
||||
let min_line_number_diff = tmp_diff
|
||||
endif
|
||||
endif
|
||||
|
||||
" call Decho("[DBG] Line Diff: #" . min_line_number_diff)
|
||||
endwhile
|
||||
|
||||
let line_number = curr_line_number + min_line_number_diff
|
||||
" call Decho("[DBG] Line Diff: #" . min_line_number_diff)
|
||||
" call Decho("[DBG] Line Num: #" . line_number)
|
||||
|
||||
if is_no_sign != 0 || min_line_number_diff <= 0
|
||||
let line_number = min_line_number
|
||||
endif
|
||||
|
||||
" call Dret("Vm_get_next_sign_line ".line_number . " XXX")
|
||||
return line_number
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_get_prev_sign_line:
|
||||
fun! s:Vm_get_prev_sign_line(curr_line_number)
|
||||
" call Dfunc("Vm_get_prev_sign_line(curr_line_number=".a:curr_line_number.">)")
|
||||
|
||||
let b:Vm_start_from = 1
|
||||
let sign_list = s:GetVimCmdOutput('sign place buffer=' . winbufnr(0))
|
||||
" call Decho("sign_list<".sign_list.">")
|
||||
|
||||
let curr_line_number = a:curr_line_number
|
||||
let line_number = 1
|
||||
let is_no_sign = 1
|
||||
let max_line_number = -1
|
||||
let max_line_number_diff = 0
|
||||
|
||||
while 1
|
||||
let line_number = s:Vm_get_line_number(sign_list)
|
||||
if line_number < 0
|
||||
break
|
||||
endif
|
||||
|
||||
" Record the very first line that has a sign
|
||||
if is_no_sign != 0
|
||||
let max_line_number = line_number
|
||||
elseif line_number > max_line_number
|
||||
let max_line_number = line_number
|
||||
endif
|
||||
let is_no_sign = 0
|
||||
|
||||
let tmp_diff = curr_line_number - line_number
|
||||
if tmp_diff > 0
|
||||
" line_number is below curr_line_number
|
||||
if max_line_number_diff > 0
|
||||
if tmp_diff < max_line_number_diff
|
||||
let max_line_number_diff = tmp_diff
|
||||
endif
|
||||
else
|
||||
let max_line_number_diff = tmp_diff
|
||||
endif
|
||||
endif
|
||||
|
||||
" call Decho("[DBG] Line Diff: #" . max_line_number_diff)
|
||||
" call Decho("[DBG] Tmp Diff: #" . tmp_diff)
|
||||
endwhile
|
||||
|
||||
let line_number = curr_line_number - max_line_number_diff
|
||||
" call Decho("[DBG] Line Diff: #" . max_line_number_diff)
|
||||
" call Decho("[DBG] Line Num: #" . line_number)
|
||||
|
||||
if is_no_sign != 0 || max_line_number_diff <= 0
|
||||
let line_number = max_line_number
|
||||
endif
|
||||
|
||||
" call Dret("Vm_get_prev_sign_line ".line_number . " XXX")
|
||||
return line_number
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_goto_next_sign:
|
||||
fun! Vm_goto_next_sign()
|
||||
" call Dfunc("Vm_goto_next_sign()")
|
||||
|
||||
let curr_line_number = line(".")
|
||||
let next_sign_line_number = s:Vm_get_next_sign_line(curr_line_number)
|
||||
|
||||
" call Decho("Next sign line #: " . next_sign_line_number)
|
||||
if next_sign_line_number >= 0
|
||||
exe ":" . next_sign_line_number
|
||||
"call Decho("Going to Line #" . next_sign_line_number)
|
||||
endif
|
||||
|
||||
" call Dret("Vm_goto_next_sign")
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" Vm_goto_prev_sign:
|
||||
fun! Vm_goto_prev_sign()
|
||||
" call Dfunc("Vm_goto_prev_sign()")
|
||||
|
||||
let curr_line_number = line(".")
|
||||
let prev_sign_line_number = s:Vm_get_prev_sign_line(curr_line_number)
|
||||
" call Decho("Previous sign line #: " . prev_sign_line_number)
|
||||
|
||||
if prev_sign_line_number >= 0
|
||||
exe prev_sign_line_number
|
||||
endif
|
||||
|
||||
" call Dret("Vm_goto_prev_sign")
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
Loading…
Reference in New Issue
Block a user