changeset 33:a5b2f8e4fb6c

Changes to the `Hgstatus` window: - the buffer is editable, and actions like `addremove` or `commit` will only act on the remaining filenames. - added ability to run `addremove` on a selection range. - added ability to run a commit action. - added visual mode mappings.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 27 Dec 2011 23:48:50 -0800
parents 799c7b57e19a
children cfc15ff67aaf
files plugin/lawrencium.vim
diffstat 1 files changed, 47 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/plugin/lawrencium.vim	Sun Dec 25 22:44:06 2011 -0800
+++ b/plugin/lawrencium.vim	Tue Dec 27 23:48:50 2011 -0800
@@ -356,9 +356,6 @@
     " Setup the buffer correctly: readonly, and with the correct repo linked
     " to it.
     let b:mercurial_dir = l:repo.root_dir
-    setlocal nomodified
-    setlocal nomodifiable
-    setlocal readonly
     setlocal buftype=nofile
     setlocal syntax=hgstatus
 
@@ -366,11 +363,13 @@
     call s:DefineMainCommands()
 
     " Add some nice commands.
-    command! -buffer        Hgstatusedit      :call s:HgStatus_FileEdit()
-    command! -buffer -range Hgstatusaddremove :call s:HgStatus_AddRemove(<line1>, <line2>)
-    command! -buffer        Hgstatusdiff      :call s:HgStatus_Diff(0)
-    command! -buffer        Hgstatusvdiff     :call s:HgStatus_Diff(1)
-    command! -buffer        Hgstatusrefresh   :call s:HgStatus_Refresh()
+    command! -buffer          Hgstatusedit      :call s:HgStatus_FileEdit()
+    command! -buffer          Hgstatusdiff      :call s:HgStatus_Diff(0)
+    command! -buffer          Hgstatusvdiff     :call s:HgStatus_Diff(1)
+    command! -buffer          Hgstatusrefresh   :call s:HgStatus_Refresh()
+    command! -buffer -range   Hgstatusaddremove :call s:HgStatus_AddRemove(<line1>, <line2>)
+    command! -buffer -range=% -bang Hgstatuscommit  :call s:HgStatus_Commit(<line1>, <line2>, <bang>0, 0)
+    command! -buffer -range=% -bang Hgstatusvcommit :call s:HgStatus_Commit(<line1>, <line2>, <bang>0, 1)
 
     " Add some handy mappings.
     if g:lawrencium_define_mappings
@@ -380,8 +379,12 @@
         nnoremap <buffer> <silent> <C-D> :Hgstatusdiff<cr>
         nnoremap <buffer> <silent> <C-V> :Hgstatusvdiff<cr>
         nnoremap <buffer> <silent> <C-A> :Hgstatusaddremove<cr>
+        nnoremap <buffer> <silent> <C-S> :Hgstatuscommit<cr>
         nnoremap <buffer> <silent> <C-R> :Hgstatusrefresh<cr>
         nnoremap <buffer> <silent> q     :bdelete!<cr>
+
+        vnoremap <buffer> <silent> <C-A> :Hgstatusaddremove<cr>
+        vnoremap <buffer> <silent> <C-S> :Hgstatuscommit<cr>
     endif
 
     " Make sure the file is deleted with the buffer.
@@ -443,6 +446,17 @@
     call s:HgStatus_Refresh()
 endfunction
 
+function! s:HgStatus_Commit(linestart, lineend, bang, vertical) abort
+    " Get the selected filenames.
+    let l:filenames = s:HgStatus_GetSelectedFiles(a:linestart, a:lineend, ['M', 'A', 'R'])
+    if len(l:filenames) == 0
+        call s:error("No files to commit in selection or file.")
+    endif
+
+    " Run `Hgcommit` on those paths.
+    call s:HgCommit(a:bang, a:vertical, l:filenames)
+endfunction
+
 function! s:HgStatus_Diff(vertical) abort
     " Open the file and run `Hgdiff` on it.
     call s:HgStatus_FileEdit()
@@ -657,21 +671,33 @@
 
 " Hgcommit {{{
 
-function! s:HgCommit(bang, vertical) abort
+function! s:HgCommit(bang, vertical, ...) abort
     " Get the repo we'll be committing into.
     let l:repo = s:hg_repo()
 
+    " Get the list of files to commit.
+    " It can either be several files passed as extra parameters, or an
+    " actual list passed as the first extra parameter.
+    let l:filenames = []
+    if a:0
+        let l:filenames = a:000
+        if a:0 == 1 && type(a:1) == type([])
+            let l:filenames = a:1
+        endif
+    endif
+
     " Open a commit message file.
     let l:commit_path = s:tempname('hg-editor-', '.txt')
     let l:split = a:vertical ? 'vsplit' : 'split'
     execute l:split . ' ' . l:commit_path
     call append(0, ['', ''])
-    call append(2, split(s:HgCommit_GenerateMessage(l:repo), '\n'))
+    call append(2, split(s:HgCommit_GenerateMessage(l:repo, l:filenames), '\n'))
     call cursor(1, 1)
 
     " Setup the auto-command that will actually commit on write/exit,
     " and make the buffer delete itself on exit.
     let b:mercurial_dir = l:repo.root_dir
+    let b:lawrencium_commit_files = l:filenames
     setlocal bufhidden=delete
     setlocal syntax=hgcommit
     if a:bang
@@ -694,7 +720,7 @@
     \' ': '',
     \}
 
-function! s:HgCommit_GenerateMessage(repo) abort
+function! s:HgCommit_GenerateMessage(repo, filenames) abort
     let l:msg  = "HG: Enter commit message. Lines beginning with 'HG:' are removed.\n"
     let l:msg .= "HG: Leave message empty to abort commit.\n"
     let l:msg .= "HG: Write and quit buffer to proceed.\n"
@@ -702,7 +728,11 @@
     let l:msg .= "HG: user: " . split(a:repo.RunCommand('showconfig ui.username'), '\n')[0] . "\n"
     let l:msg .= "HG: branch '" . split(a:repo.RunCommand('branch'), '\n')[0] . "'\n"
 
-    let l:status_lines = split(a:repo.RunCommand('status'), "\n")
+    if len(a:filenames)
+        let l:status_lines = split(a:repo.RunCommand('status', a:filenames), "\n")
+    else
+        let l:status_lines = split(a:repo.RunCommand('status'), "\n")
+    endif
     for l:line in l:status_lines
         if l:line ==# ''
             continue
@@ -737,7 +767,9 @@
 
     " Get the repo and commit with the given message.
     let l:repo = s:hg_repo()
-    let l:output = l:repo.RunCommand('commit', '-l', a:log_file)
+    let l:hg_args = ['-l', a:log_file]
+    call extend(l:hg_args, b:lawrencium_commit_files)
+    let l:output = l:repo.RunCommand('commit', l:hg_args)
     if a:show_output && l:output !~# '\v%^\s*%$'
         call s:trace("Output from hg commit:", 1)
         for l:output_line in split(l:output, '\n')
@@ -746,8 +778,8 @@
     endif
 endfunction
 
-call s:AddMainCommand("-bang Hgcommit :call s:HgCommit(<bang>0, 0)")
-call s:AddMainCommand("-bang Hgvcommit :call s:HgCommit(<bang>0, 1)")
+call s:AddMainCommand("-bang -nargs=* -complete=customlist,s:ListRepoFiles Hgcommit :call s:HgCommit(<bang>0, 0, <f-args>)")
+call s:AddMainCommand("-bang -nargs=* -complete=customlist,s:ListRepoFiles Hgvcommit :call s:HgCommit(<bang>0, 1, <f-args>)")
 
 " }}}