# HG changeset patch # User Ludovic Chabant # Date 1323479533 28800 # Node ID 1da613c13d81df163410d36de43f92f17e20d1b2 # Parent 3a4f9f41a7e2c84ee473052a1e791331ccf4ada6 Better hg-status window. Better debug/tracing. diff -r 3a4f9f41a7e2 -r 1da613c13d81 doc/lawrencium.txt --- a/doc/lawrencium.txt Thu Dec 08 21:12:04 2011 -0800 +++ b/doc/lawrencium.txt Fri Dec 09 17:12:13 2011 -0800 @@ -15,24 +15,31 @@ All commands defined by |lawrencium| are local to each buffer. *lawrencium-:Hg* -:Hg [args] Run an arbitrary Mercurial command. Similar to :!hg +:Hg {args} Run an arbitrary Mercurial command. Similar to :!hg [args] but the '--repository' is automatically specified with the root of the repository the current file belongs to. *lawrencium-:Hg!* -:Hg! [args] Like |:Hg|, but the output of the command is placed in +:Hg! {args} Like |:Hg|, but the output of the command is placed in a temp file and edited in the |preview-window|. *lawrencium-:Hgcd* -:Hgcd [directory] |:cd| relative to the root of the repository. +:Hgcd[!] {path} |:cd| relative to the root of the repository. *lawrencium-:Hglcd* -:Hglcd [directory] |:lcd| relative to the root of the repository. +:Hglcd[!] {path} |:lcd| relative to the root of the repository. + + *lawrencium-:Hgedit* +:Hgedit {file} |:edit| {file} relative to the root of the repository. + + *lawrencium-:Hgedit!* +:Hgedit! {file} |:edit!| {file} relative to the root of the repository. *lawrencium-:Hgstatus* :Hgstatus Shows the output of 'hg status' in the |preview-window|. + You can navigate to the next/previous file with "n"/"p". ABOUT *lawrencium-about* diff -r 3a4f9f41a7e2 -r 1da613c13d81 plugin/lawrencium.vim --- a/plugin/lawrencium.vim Thu Dec 08 21:12:04 2011 -0800 +++ b/plugin/lawrencium.vim Fri Dec 09 17:12:13 2011 -0800 @@ -11,6 +11,9 @@ if (exists('g:loaded_lawrencium') || &cp) && !g:lawrencium_debug finish endif +if (exists('g:loaded_lawrencium') && g:lawrencium_debug) + echom "Reloaded Lawrencium." +endif let g:loaded_lawrencium = 1 if !exists('g:lawrencium_hg_executable') @@ -21,10 +24,6 @@ let g:lawrencium_trace = 0 endif -if g:lawrencium_debug - echom "Loaded Lawrencium." -endif - " }}} " Utility {{{ @@ -46,8 +45,8 @@ endfunction " Prints a message if debug tracing is enabled. -function! s:trace(message) - if g:lawrencium_trace +function! s:trace(message, ...) + if g:lawrencium_trace || (a:0 && a:1) let l:message = "lawrencium: " . a:message echom l:message endif @@ -232,25 +231,52 @@ \} function! s:HgStatus() abort + " Get the repo and the `hg status` output. let l:repo = s:hg_repo() let l:status_text = l:repo.RunCommand('status') let l:status_lines = split(l:status_text, '\n') - let l:entries = [] - for l:line in l:status_lines - if l:line =~# '^\s*$' - continue - endif - echom "STATUS: " . l:line - let l:tokens = split(l:line, '\s\+') - let l:entry = { - \'type': l:tokens[0], - \'filename': (l:repo.root_dir . l:tokens[1]), - \'text': s:hg_status_messages[l:tokens[0]], - \} - call add(l:entries, l:entry) - endfor - call setloclist(0, l:entries) - lopen + + " Open a new temp buffer in the preview window, jump to it, + " and paste the `hg status` output in there. + " Also, make it a nice size, but restore the `previewheight` setting after + " we're done. + let l:temp_file = tempname() + let l:preview_height = &previewheight + execute "setlocal previewheight=" . (len(l:status_lines) + 1) + execute "pedit " . l:temp_file + wincmd p + call append(0, l:status_lines) + execute "setlocal previewheight=" . l:preview_height + + " Setup the buffer correctly. + let b:mercurial_dir = l:repo.root_dir + setlocal buftype=nofile + setlocal nomodified + setlocal nomodifiable + setlocal readonly + + " Add some handy mappings. + nnoremap :call search('^[MARC\!\?I ]\s.', 'We') + nnoremap :call search('^[MARC\!\?I ]\s.','Wbe') + nnoremap :execute HgStatus_FileEdit() + nnoremap q :bdelete +endfunction + +function! s:HgStatus_FileEdit() abort + let l:repo = s:hg_repo() + let l:line = getline('.') + " Yay, awesome, Vim's regex syntax is fucked up like shit, especially for + " look-aheads and look-behinds. See for yourself: + let l:filename = matchstr(l:line, '\([MARC\!\?I ]\s\)\@<=.*') + let l:filename = l:repo.GetFullPath(l:filename) + " Go back to the previous window and open the file there, or open an + " existing buffer. + wincmd p + if bufexists(l:filename) + execute 'buffer ' . l:filename + else + execute 'edit ' . l:filename + endif endfunction call s:AddMainCommand("Hgstatus :execute s:HgStatus()")