annotate plugin/lawrencium.vim @ 126:47209552ec46

Shellescaped all command arguments in HgRepo.GetCommand, so that the commands work properly with ugly file names, in my case containing parentheses. Wrapping revision arguments in quotes is no longer necessary, so removed all of that as well.
author namark <nshan.nnnn@gmail.com>
date Wed, 02 Dec 2015 22:45:12 +0400
parents a9136d95cf47
children 96e4423e729e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 " lawrencium.vim - A Mercurial wrapper
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 " Maintainer: Ludovic Chabant <http://ludovic.chabant.com>
114
facd2506066f Bumped version. I should release this stuff more often.
Ludovic Chabant <ludovic@chabant.com>
parents: 113
diff changeset
3 " Version: 0.4.0
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 " Globals {{{
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 if !exists('g:lawrencium_debug')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 let g:lawrencium_debug = 0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 if (exists('g:loaded_lawrencium') || &cp) && !g:lawrencium_debug
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 finish
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 endif
6
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
14 if (exists('g:loaded_lawrencium') && g:lawrencium_debug)
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
15 echom "Reloaded Lawrencium."
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
16 endif
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 let g:loaded_lawrencium = 1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 if !exists('g:lawrencium_hg_executable')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 let g:lawrencium_hg_executable = 'hg'
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22
43
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
23 if !exists('g:lawrencium_auto_cd')
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
24 let g:lawrencium_auto_cd = 1
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
25 endif
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
26
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 if !exists('g:lawrencium_trace')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 let g:lawrencium_trace = 0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
31 if !exists('g:lawrencium_define_mappings')
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
32 let g:lawrencium_define_mappings = 1
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
33 endif
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
34
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
35 if !exists('g:lawrencium_auto_close_buffers')
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
36 let g:lawrencium_auto_close_buffers = 1
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
37 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
38
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
39 if !exists('g:lawrencium_annotate_width_offset')
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
40 let g:lawrencium_annotate_width_offset = 0
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
41 endif
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
42
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
43 if !exists('g:lawrencium_status_win_split_above')
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
44 let g:lawrencium_status_win_split_above = 0
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
45 endif
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
46
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
47 if !exists('g:lawrencium_status_win_split_even')
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
48 let g:lawrencium_status_win_split_even = 0
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
49 endif
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
50
108
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
51 if !exists('g:lawrencium_record_start_in_working_buffer')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
52 let g:lawrencium_record_start_in_working_buffer = 0
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
53 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
54
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 " Utility {{{
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 " Strips the ending slash in a path.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 function! s:stripslash(path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 return fnamemodify(a:path, ':s?[/\\]$??')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63
98
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
64 " Returns whether a path is absolute.
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
65 function! s:isabspath(path)
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
66 return a:path =~# '\v^(\w\:)?[/\\]'
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
67 endfunction
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
68
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 " Normalizes the slashes in a path.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 function! s:normalizepath(path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 if exists('+shellslash') && &shellslash
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
72 return substitute(a:path, '\v/', '\\', 'g')
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 elseif has('win32')
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
74 return substitute(a:path, '\v/', '\\', 'g')
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 else
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 return a:path
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
80 " Shell-slashes the path (opposite of `normalizepath`).
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
81 function! s:shellslash(path)
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
82 if exists('+shellslash') && !&shellslash
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
83 return substitute(a:path, '\v\\', '/', 'g')
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
84 else
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
85 return a:path
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
86 endif
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
87 endfunction
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
88
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
89 " Like tempname() but with some control over the filename.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
90 function! s:tempname(name, ...)
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
91 let l:path = tempname()
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
92 let l:result = fnamemodify(l:path, ':h') . '/' . a:name . fnamemodify(l:path, ':t')
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
93 if a:0 > 0
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
94 let l:result = l:result . a:1
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
95 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
96 return l:result
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
97 endfunction
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
98
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
99 " Delete a temporary file if it exists.
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
100 function! s:clean_tempfile(path)
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
101 if filewritable(a:path)
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
102 call s:trace("Cleaning up temporary file: " . a:path)
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
103 call delete(a:path)
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
104 endif
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
105 endfunction
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
106
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 " Prints a message if debug tracing is enabled.
6
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
108 function! s:trace(message, ...)
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
109 if g:lawrencium_trace || (a:0 && a:1)
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 let l:message = "lawrencium: " . a:message
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 echom l:message
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114
18
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
115 " Prints an error message with 'lawrencium error' prefixed to it.
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
116 function! s:error(message)
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
117 echom "lawrencium error: " . a:message
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
118 endfunction
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
119
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 " Throw a Lawrencium exception message.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 function! s:throw(message)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 let v:errmsg = "lawrencium: " . a:message
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 throw v:errmsg
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 " Finds the repository root given a path inside that repository.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 " Throw an error if not repository is found.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 function! s:find_repo_root(path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 let l:path = s:stripslash(a:path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 let l:previous_path = ""
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 while l:path != l:previous_path
121
5168645017dd Check for `.hg` directory instead of `.hg/store`.
Ludovic Chabant <ludovic@chabant.com>
parents: 119
diff changeset
132 if isdirectory(l:path . '/.hg')
104
518a6b2eff56 Simpler looking repo paths.
Ludovic Chabant <ludovic@chabant.com>
parents: 103
diff changeset
133 return s:normalizepath(simplify(fnamemodify(l:path, ':p')))
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 let l:previous_path = l:path
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 let l:path = fnamemodify(l:path, ':h')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 endwhile
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 call s:throw("No Mercurial repository found above: " . a:path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
141 " Given a Lawrencium path (e.g: 'lawrencium:///repo/root_dir//foo/bar/file.py//rev=34'), extract
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
142 " the repository root, relative file path and revision number/changeset ID.
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
143 "
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
144 " If a second argument exists, it must be:
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
145 " - `relative`: to make the file path relative to the repository root.
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
146 " - `absolute`: to make the file path absolute.
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
147 "
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
148 function! s:parse_lawrencium_path(lawrencium_path, ...)
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
149 let l:repo_path = s:shellslash(a:lawrencium_path)
81
a42b0e63a8ea Fixed some bug with filenames with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 79
diff changeset
150 let l:repo_path = substitute(l:repo_path, '\\ ', ' ', 'g')
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
151 if l:repo_path =~? '\v^lawrencium://'
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
152 let l:repo_path = strpart(l:repo_path, strlen('lawrencium://'))
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
153 endif
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
154
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
155 let l:root_dir = ''
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
156 let l:at_idx = stridx(l:repo_path, '//')
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
157 if l:at_idx >= 0
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
158 let l:root_dir = strpart(l:repo_path, 0, l:at_idx)
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
159 let l:repo_path = strpart(l:repo_path, l:at_idx + 2)
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
160 endif
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
161
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
162 let l:value = ''
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
163 let l:action = ''
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
164 let l:actionidx = stridx(l:repo_path, '//')
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
165 if l:actionidx >= 0
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
166 let l:action = strpart(l:repo_path, l:actionidx + 2)
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
167 let l:repo_path = strpart(l:repo_path, 0, l:actionidx)
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
168
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
169 let l:equalidx = stridx(l:action, '=')
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
170 if l:equalidx >= 0
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
171 let l:value = strpart(l:action, l:equalidx + 1)
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
172 let l:action = strpart(l:action, 0, l:equalidx)
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
173 endif
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
174 endif
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
175
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
176 if a:0 > 0
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
177 execute 'cd! ' . fnameescape(l:root_dir)
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
178 if a:1 == 'relative'
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
179 let l:repo_path = fnamemodify(l:repo_path, ':.')
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
180 elseif a:1 == 'absolute'
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
181 let l:repo_path = fnamemodify(l:repo_path, ':p')
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
182 endif
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
183 execute 'cd! -'
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
184 endif
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
185
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
186 let l:result = { 'root': l:root_dir, 'path': l:repo_path, 'action': l:action, 'value': l:value }
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
187 return l:result
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
188 endfunction
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
189
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
190 " Finds a window whose displayed buffer has a given variable
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
191 " set to the given value.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
192 function! s:find_buffer_window(varname, varvalue) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
193 for wnr in range(1, winnr('$'))
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
194 let l:bnr = winbufnr(wnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
195 if getbufvar(l:bnr, a:varname) == a:varvalue
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
196 return l:wnr
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
197 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
198 endfor
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
199 return -1
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
200 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
201
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
202 " Opens a buffer in a way that makes it easy to delete it later:
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
203 " - if the about-to-be previous buffer doesn't have a given variable,
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
204 " just open the new buffer.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
205 " - if the about-to-be previous buffer has a given variable, open the
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
206 " new buffer with the `keepalt` option to make it so that the
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
207 " actual previous buffer (returned by things like `bufname('#')`)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
208 " is the original buffer that was there before the first deletable
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
209 " buffer was opened.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
210 function! s:edit_deletable_buffer(varname, varvalue, path) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
211 let l:edit_cmd = 'edit '
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
212 if getbufvar('%', a:varname) != ''
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
213 let l:edit_cmd = 'keepalt edit '
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
214 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
215 execute l:edit_cmd . fnameescape(a:path)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
216 call setbufvar('%', a:varname, a:varvalue)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
217 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
218
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
219 " Deletes all buffers that have a given variable set to a given value.
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
220 " For each buffer, if it is not shown in any window, it will be just deleted.
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
221 " If it is shown in a window, that window will be switched to the alternate
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
222 " buffer before the buffer is deleted, unless the `lawrencium_quit_on_delete`
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
223 " variable is set to `1`, in which case the window is closed too.
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
224 function! s:delete_dependency_buffers(varname, varvalue) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
225 let l:cur_winnr = winnr()
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
226 for bnr in range(1, bufnr('$'))
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
227 if getbufvar(bnr, a:varname) == a:varvalue
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
228 " Delete this buffer if it is not shown in any window.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
229 " Otherwise, display the alternate buffer before deleting
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
230 " it so the window is not closed.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
231 let l:bwnr = bufwinnr(bnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
232 if l:bwnr < 0 || getbufvar(bnr, 'lawrencium_quit_on_delete') == 1
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
233 if bufloaded(l:bnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
234 call s:trace("Deleting dependency buffer " . bnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
235 execute "bdelete! " . bnr
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
236 else
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
237 call s:trace("Dependency buffer " . bnr . " is already unladed.")
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
238 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
239 else
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
240 execute l:bwnr . "wincmd w"
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
241 " TODO: better handle case where there's no previous/alternate buffer?
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
242 let l:prev_bnr = bufnr('#')
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
243 if l:prev_bnr > 0 && bufloaded(l:prev_bnr)
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
244 execute "buffer " . l:prev_bnr
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
245 if bufloaded(l:bnr)
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
246 call s:trace("Deleting dependency buffer " . bnr . " after switching to " . l:prev_bnr . " in window " . l:bwnr)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
247 execute "bdelete! " . bnr
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
248 else
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
249 call s:trace("Dependency buffer " . bnr . " is unladed after switching to " . l:prev_bnr)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
250 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
251 else
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
252 call s:trace("Deleting dependency buffer " . bnr . " and window.")
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
253 bdelete!
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
254 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
255 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
256 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
257 endfor
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
258 if l:cur_winnr != winnr()
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
259 call s:trace("Returning to window " . l:cur_winnr)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
260 execute l:cur_winnr . "wincmd w"
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
261 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
262 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
263
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
264 " Clean up all the 'HG:' lines from a commit message, and see if there's
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
265 " any message left (Mercurial does this automatically, usually, but
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
266 " apparently not when you feed it a log file...).
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
267 function! s:clean_commit_file(log_file) abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
268 let l:lines = readfile(a:log_file)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
269 call filter(l:lines, "v:val !~# '\\v^HG:'")
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
270 if len(filter(copy(l:lines), "v:val !~# '\\v^\\s*$'")) == 0
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
271 return 0
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
272 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
273 call writefile(l:lines, a:log_file)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
274 return 1
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
275 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
276
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
279 " Mercurial Repository Object {{{
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 " Let's define a Mercurial repo 'class' using prototype-based object-oriented
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 " programming.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283 "
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 " The prototype dictionary.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 let s:HgRepo = {}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
287 " Constructor.
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 function! s:HgRepo.New(path) abort
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 let l:newRepo = copy(self)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 let l:newRepo.root_dir = s:find_repo_root(a:path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 call s:trace("Built new Mercurial repository object at : " . l:newRepo.root_dir)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 return l:newRepo
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
295 " Gets a full path given a repo-relative path.
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 function! s:HgRepo.GetFullPath(path) abort
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297 let l:root_dir = self.root_dir
98
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
298 if s:isabspath(a:path)
103
bc6003e7159e Fix stupid typo, make sure paths are normalized.
Ludovic Chabant <ludovic@chabant.com>
parents: 101
diff changeset
299 call s:throw("Expected relative path, got absolute path: " . a:path)
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 endif
103
bc6003e7159e Fix stupid typo, make sure paths are normalized.
Ludovic Chabant <ludovic@chabant.com>
parents: 101
diff changeset
301 return s:normalizepath(l:root_dir . a:path)
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303
98
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
304 " Gets a repo-relative path given any path.
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
305 function! s:HgRepo.GetRelativePath(path) abort
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
306 execute 'lcd! ' . fnameescape(self.root_dir)
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
307 let l:relative_path = fnamemodify(a:path, ':.')
98
e5ac6464a767 Handle absolute/relative paths properly.
Ludovic Chabant <ludovic@chabant.com>
parents: 96
diff changeset
308 execute 'lcd! -'
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
309 return l:relative_path
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
310 endfunction
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
311
105
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
312 " Gets, and optionally creates, a temp folder for some operation in the `.hg`
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
313 " directory.
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
314 function! s:HgRepo.GetTempDir(path, ...) abort
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
315 let l:tmp_dir = self.GetFullPath('.hg/lawrencium/' . a:path)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
316 if !isdirectory(l:tmp_dir)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
317 if a:0 > 0 && !a:1
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
318 return ''
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
319 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
320 call mkdir(l:tmp_dir, 'p')
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
321 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
322 return l:tmp_dir
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
323 endfunction
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
324
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 " Gets a list of files matching a root-relative pattern.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 " If a flag is passed and is TRUE, a slash will be appended to all
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327 " directories.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 function! s:HgRepo.Glob(pattern, ...) abort
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329 let l:root_dir = self.root_dir
11
b4baab0a4a92 Made most regex use the 'very-magic' syntax.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
330 if (a:pattern =~# '\v^[/\\]')
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 let l:root_dir = s:stripslash(l:root_dir)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 let l:matches = split(glob(l:root_dir . a:pattern), '\n')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 if a:0 && a:1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335 for l:idx in range(len(l:matches))
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 if !filereadable(l:matches[l:idx])
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 let l:matches[l:idx] = l:matches[l:idx] . '/'
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 endfor
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 let l:strip_len = len(l:root_dir)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342 call map(l:matches, 'v:val[l:strip_len : -1]')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 return l:matches
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
346 " Gets a full Mercurial command.
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
347 function! s:HgRepo.GetCommand(command, ...) abort
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
348 " If there's only one argument, and it's a list, then use that as the
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
349 " argument list.
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
350 let l:arg_list = a:000
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
351 if a:0 == 1 && type(a:1) == type([])
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
352 let l:arg_list = a:1
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
353 endif
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 let l:hg_command = g:lawrencium_hg_executable . ' --repository ' . shellescape(s:stripslash(self.root_dir))
81
a42b0e63a8ea Fixed some bug with filenames with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 79
diff changeset
355 let l:hg_command = l:hg_command . ' ' . a:command
a42b0e63a8ea Fixed some bug with filenames with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 79
diff changeset
356 for l:arg in l:arg_list
126
47209552ec46 Shellescaped all command arguments in HgRepo.GetCommand,
namark <nshan.nnnn@gmail.com>
parents: 122
diff changeset
357 let l:hg_command = l:hg_command . ' ' . shellescape(l:arg)
81
a42b0e63a8ea Fixed some bug with filenames with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 79
diff changeset
358 endfor
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
359 return l:hg_command
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
360 endfunction
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
361
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
362 " Runs a Mercurial command in the repo.
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
363 function! s:HgRepo.RunCommand(command, ...) abort
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
364 let l:all_args = [a:command] + a:000
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
365 let l:hg_command = call(self['GetCommand'], l:all_args, self)
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366 call s:trace("Running Mercurial command: " . l:hg_command)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 return system(l:hg_command)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369
84
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
370 " Runs a Mercurial command in the repo and reads its output into the current
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
371 " buffer.
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
372 function! s:HgRepo.ReadCommandOutput(command, ...) abort
84
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
373 function! s:PutOutputIntoBuffer(command_line)
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
374 let l:was_buffer_empty = (line('$') == 1 && getline(1) == '')
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
375 execute '0read!' . escape(a:command_line, '%#\')
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
376 if l:was_buffer_empty " (Always true?)
99
001b341ab8ad Fix for Lawrencium files having folded sections deleted incorrectly.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
377 " '0read' inserts before the cursor, leaving a blank line which
001b341ab8ad Fix for Lawrencium files having folded sections deleted incorrectly.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
378 " needs to be deleted... but if there are folds in this thing, we
001b341ab8ad Fix for Lawrencium files having folded sections deleted incorrectly.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
379 " must open them all first otherwise we could delete the whole
001b341ab8ad Fix for Lawrencium files having folded sections deleted incorrectly.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
380 " contents of the last fold (since Vim may close them all by
001b341ab8ad Fix for Lawrencium files having folded sections deleted incorrectly.
Ludovic Chabant <ludovic@chabant.com>
parents: 98
diff changeset
381 " default).
111
01edb7c58e0c Don't touch vim registers holding deletions.
Shane Harper <shane@shaneharper.net>
parents: 110
diff changeset
382 normal! zRG"_dd
84
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
383 endif
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
384 endfunction
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
385
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
386 let l:all_args = [a:command] + a:000
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
387 let l:hg_command = call(self['GetCommand'], l:all_args, self)
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
388 call s:trace("Running Mercurial command: " . l:hg_command)
84
b82babe7fdf8 Fix: blank line added by HgRepo.ReadCommandOutput().
Shane Harper <shane@shaneharper.net>
parents: 83
diff changeset
389 call s:PutOutputIntoBuffer(l:hg_command)
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
390 endfunction
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
391
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
392 " Build a Lawrencium path for the given file and action.
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
393 " By default, the given path will be made relative to the repository root,
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
394 " unless '0' is passed as the 4th argument.
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
395 function! s:HgRepo.GetLawrenciumPath(path, action, value, ...) abort
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
396 let l:path = a:path
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
397 if a:0 == 0 || !a:1
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
398 let l:path = self.GetRelativePath(a:path)
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
399 endif
88
08e0ab5985d2 Correctly escape paths on Windows.
Ludovic Chabant <ludovic@chabant.com>
parents: 87
diff changeset
400 let l:path = fnameescape(l:path)
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
401 let l:result = 'lawrencium://' . s:stripslash(self.root_dir) . '//' . l:path
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
402 if a:action !=? ''
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
403 let l:result = l:result . '//' . a:action
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
404 if a:value !=? ''
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
405 let l:result = l:result . '=' . a:value
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
406 endif
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
407 endif
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
408 return l:result
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
409 endfunction
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
410
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
411 " Repo cache map.
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
412 let s:buffer_repos = {}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
413
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
414 " Get a cached repo.
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415 function! s:hg_repo(...) abort
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
416 " Use the given path, or the mercurial directory of the current buffer.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
417 if a:0 == 0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
418 if exists('b:mercurial_dir')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
419 let l:path = b:mercurial_dir
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
420 else
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421 let l:path = s:find_repo_root(expand('%:p'))
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423 else
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
424 let l:path = a:1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
425 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
426 " Find a cache repo instance, or make a new one.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
427 if has_key(s:buffer_repos, l:path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428 return get(s:buffer_repos, l:path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 else
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430 let l:repo = s:HgRepo.New(l:path)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
431 let s:buffer_repos[l:path] = l:repo
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
432 return l:repo
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
433 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
434 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
435
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
436 " Sets up the current buffer with Lawrencium commands if it contains a file from a Mercurial repo.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
437 " If the file is not in a Mercurial repo, just exit silently.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
438 function! s:setup_buffer_commands() abort
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
439 call s:trace("Scanning buffer '" . bufname('%') . "' for Lawrencium setup...")
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
440 let l:do_setup = 1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
441 if exists('b:mercurial_dir')
11
b4baab0a4a92 Made most regex use the 'very-magic' syntax.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
442 if b:mercurial_dir =~# '\v^\s*$'
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
443 unlet b:mercurial_dir
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
444 else
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
445 let l:do_setup = 0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
446 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
448 try
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
449 let l:repo = s:hg_repo()
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
450 catch /^lawrencium\:/
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 return
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452 endtry
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
453 let b:mercurial_dir = l:repo.root_dir
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
454 if exists('b:mercurial_dir') && l:do_setup
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
455 call s:trace("Setting Mercurial commands for buffer '" . bufname('%'))
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
456 call s:trace(" with repo : " . expand(b:mercurial_dir))
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
457 silent doautocmd User Lawrencium
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
458 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
459 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
460
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
461 augroup lawrencium_detect
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
462 autocmd!
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
463 autocmd BufNewFile,BufReadPost * call s:setup_buffer_commands()
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
464 autocmd VimEnter * if expand('<amatch>')==''|call s:setup_buffer_commands()|endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
465 augroup end
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
466
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
467 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
468
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
469 " Buffer Object {{{
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
470
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
471 " The prototype dictionary.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
472 let s:Buffer = {}
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
473
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
474 " Constructor.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
475 function! s:Buffer.New(number) dict abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
476 let l:newBuffer = copy(self)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
477 let l:newBuffer.nr = a:number
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
478 let l:newBuffer.var_backup = {}
105
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
479 let l:newBuffer.cmd_names = {}
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
480 let l:newBuffer.on_delete = []
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
481 let l:newBuffer.on_winleave = []
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
482 let l:newBuffer.on_unload = []
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
483 execute 'augroup lawrencium_buffer_' . a:number
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
484 execute ' autocmd!'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
485 execute ' autocmd BufDelete <buffer=' . a:number . '> call s:buffer_on_delete(' . a:number . ')'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
486 execute 'augroup end'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
487 call s:trace("Built new buffer object for buffer: " . a:number)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
488 return l:newBuffer
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
489 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
490
105
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
491 function! s:Buffer.GetName(...) dict abort
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
492 let l:name = bufname(self.nr)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
493 if a:0 > 0
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
494 let l:name = fnamemodify(l:name, a:1)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
495 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
496 return l:name
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
497 endfunction
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
498
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
499 function! s:Buffer.GetVar(var) dict abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
500 return getbufvar(self.nr, a:var)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
501 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
502
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
503 function! s:Buffer.SetVar(var, value) dict abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
504 if !has_key(self.var_backup, a:var)
105
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
505 let self.var_backup[a:var] = getbufvar(self.nr, a:var)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
506 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
507 return setbufvar(self.nr, a:var, a:value)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
508 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
509
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
510 function! s:Buffer.RestoreVars() dict abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
511 for key in keys(self.var_backup)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
512 setbufvar(self.nr, key, self.var_backup[key])
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
513 endfor
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
514 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
515
105
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
516 function! s:Buffer.DefineCommand(name, ...) dict abort
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
517 if a:0 == 0
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
518 call s:throw("Not enough parameters for s:Buffer.DefineCommands()")
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
519 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
520 if a:0 == 1
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
521 let l:flags = ''
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
522 let l:cmd = a:1
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
523 else
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
524 let l:flags = a:1
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
525 let l:cmd = a:2
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
526 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
527 if has_key(self.cmd_names, a:name)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
528 call s:throw("Command '".a:name."' is already defined in buffer ".self.nr)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
529 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
530 if bufnr('%') != self.nr
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
531 call s:throw("You must move to buffer ".self.nr."first before defining local commands")
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
532 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
533 let self.cmd_names[a:name] = 1
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
534 let l:real_flags = ''
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
535 if type(l:flags) == type('')
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
536 let l:real_flags = l:flags
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
537 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
538 execute 'command -buffer '.l:real_flags.' '.a:name.' '.l:cmd
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
539 endfunction
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
540
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
541 function! s:Buffer.DeleteCommand(name) dict abort
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
542 if !has_key(self.cmd_names, a:name)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
543 call s:throw("Command '".a:name."' has not been defined in buffer ".self.nr)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
544 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
545 if bufnr('%') != self.nr
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
546 call s:throw("You must move to buffer ".self.nr."first before deleting local commands")
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
547 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
548 execute 'delcommand '.a:name
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
549 call remove(self.cmd_names, a:name)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
550 endfunction
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
551
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
552 function! s:Buffer.DeleteCommands() dict abort
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
553 if bufnr('%') != self.nr
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
554 call s:throw("You must move to buffer ".self.nr."first before deleting local commands")
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
555 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
556 for name in keys(self.cmd_names)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
557 execute 'delcommand '.name
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
558 endfor
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
559 let self.cmd_names = {}
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
560 endfunction
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
561
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
562 function! s:Buffer.MoveToFirstWindow() dict abort
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
563 let l:win_nr = bufwinnr(self.nr)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
564 if l:win_nr < 0
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
565 if a:0 > 0 && a:1 == 0
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
566 return 0
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
567 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
568 call s:throw("No windows currently showing buffer ".self.nr)
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
569 endif
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
570 execute l:win_nr.'wincmd w'
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
571 return 1
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
572 endfunction
fc5ffa4614b4 Infrastructure improvements
Ludovic Chabant <ludovic@chabant.com>
parents: 104
diff changeset
573
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
574 function! s:Buffer.OnDelete(cmd) dict abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
575 call s:trace("Adding BufDelete callback for buffer " . self.nr . ": " . a:cmd)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
576 call add(self.on_delete, a:cmd)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
577 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
578
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
579 function! s:Buffer.OnWinLeave(cmd) dict abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
580 if len(self.on_winleave) == 0
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
581 call s:trace("Adding BufWinLeave auto-command on buffer " . self.nr)
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
582 execute 'augroup lawrencium_buffer_' . self.nr . '_winleave'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
583 execute ' autocmd!'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
584 execute ' autocmd BufWinLeave <buffer=' . self.nr . '> call s:buffer_on_winleave(' . self.nr .')'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
585 execute 'augroup end'
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
586 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
587 call s:trace("Adding BufWinLeave callback for buffer " . self.nr . ": " . a:cmd)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
588 call add(self.on_winleave, a:cmd)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
589 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
590
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
591 function! s:Buffer.OnUnload(cmd) dict abort
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
592 if len(self.on_unload) == 0
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
593 call s:trace("Adding BufUnload auto-command on buffer " . self.nr)
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
594 execute 'augroup lawrencium_buffer_' . self.nr . '_unload'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
595 execute ' autocmd!'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
596 execute ' autocmd BufUnload <buffer=' . self.nr . '> call s:buffer_on_unload(' . self.nr . ')'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
597 execute 'augroup end'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
598 endif
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
599 call s:trace("Adding BufUnload callback for buffer " . self.nr . ": " . a:cmd)
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
600 call add(self.on_unload, a:cmd)
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
601 endfunction
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
602
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
603 let s:buffer_objects = {}
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
604
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
605 " Get a buffer instance for the specified buffer number, or the
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
606 " current buffer if nothing is specified.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
607 function! s:buffer_obj(...) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
608 let l:bufnr = a:0 ? a:1 : bufnr('%')
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
609 if !has_key(s:buffer_objects, l:bufnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
610 let s:buffer_objects[l:bufnr] = s:Buffer.New(l:bufnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
611 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
612 return s:buffer_objects[l:bufnr]
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
613 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
614
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
615 " Execute all the "on delete" callbacks.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
616 function! s:buffer_on_delete(number) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
617 let l:bufobj = s:buffer_objects[a:number]
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
618 call s:trace("Calling BufDelete callbacks on buffer " . l:bufobj.nr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
619 for cmd in l:bufobj.on_delete
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
620 call s:trace(" [" . cmd . "]")
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
621 execute cmd
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
622 endfor
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
623 call s:trace("Deleted buffer object " . l:bufobj.nr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
624 call remove(s:buffer_objects, l:bufobj.nr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
625 execute 'augroup lawrencium_buffer_' . l:bufobj.nr
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
626 execute ' autocmd!'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
627 execute 'augroup end'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
628 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
629
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
630 " Execute all the "on winleave" callbacks.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
631 function! s:buffer_on_winleave(number) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
632 let l:bufobj = s:buffer_objects[a:number]
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
633 call s:trace("Calling BufWinLeave callbacks on buffer " . l:bufobj.nr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
634 for cmd in l:bufobj.on_winleave
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
635 call s:trace(" [" . cmd . "]")
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
636 execute cmd
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
637 endfor
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
638 execute 'augroup lawrencium_buffer_' . l:bufobj.nr . '_winleave'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
639 execute ' autocmd!'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
640 execute 'augroup end'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
641 endfunction
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
642
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
643 " Execute all the "on unload" callbacks.
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
644 function! s:buffer_on_unload(number) abort
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
645 let l:bufobj = s:buffer_objects[a:number]
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
646 call s:trace("Calling BufUnload callbacks on buffer " . l:bufobj.nr)
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
647 for cmd in l:bufobj.on_unload
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
648 call s:trace(" [" . cmd . "]")
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
649 execute cmd
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
650 endfor
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
651 execute 'augroup lawrencium_buffer_' . l:bufobj.nr . '_unload'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
652 execute ' autocmd!'
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
653 execute 'augroup end'
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
654 endfunction
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
655
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
656 " }}}
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
657
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
658 " Lawrencium Files {{{
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
659
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
660 " Read revision (`hg cat`)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
661 function! s:read_lawrencium_rev(repo, path_parts, full_path) abort
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
662 let l:rev = a:path_parts['value']
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
663 if l:rev == ''
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
664 call a:repo.ReadCommandOutput('cat', a:full_path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
665 else
126
47209552ec46 Shellescaped all command arguments in HgRepo.GetCommand,
namark <nshan.nnnn@gmail.com>
parents: 122
diff changeset
666 call a:repo.ReadCommandOutput('cat', '-r', l:rev, a:full_path)
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
667 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
668 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
669
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
670 " Status (`hg status`)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
671 function! s:read_lawrencium_status(repo, path_parts, full_path) abort
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
672 if a:path_parts['path'] == ''
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
673 call a:repo.ReadCommandOutput('status')
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
674 else
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
675 call a:repo.ReadCommandOutput('status', a:full_path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
676 endif
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
677 setlocal nomodified
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
678 setlocal filetype=hgstatus
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
679 setlocal bufhidden=delete
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
680 setlocal buftype=nofile
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
681 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
682
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
683 " Log (`hg log`)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
684 let s:log_style_file = expand("<sfile>:h:h") . "/resources/hg_log.style"
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
685
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
686 function! s:read_lawrencium_log(repo, path_parts, full_path) abort
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
687 let l:log_opts = join(split(a:path_parts['value'], ','))
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
688 let l:log_cmd = "log " . l:log_opts
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
689
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
690 if a:path_parts['path'] == ''
112
b051b81cc365 Fix double escaping when Lawrencium is stored in a folder with spaces.
Ludovic Chabant <ludovic@chabant.com>
parents: 111
diff changeset
691 call a:repo.ReadCommandOutput(l:log_cmd, '--style', s:log_style_file)
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
692 else
112
b051b81cc365 Fix double escaping when Lawrencium is stored in a folder with spaces.
Ludovic Chabant <ludovic@chabant.com>
parents: 111
diff changeset
693 call a:repo.ReadCommandOutput(l:log_cmd, '--style', s:log_style_file, a:full_path)
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
694 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
695 setlocal filetype=hglog
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
696 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
697
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
698 " Diff revisions (`hg diff`)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
699 function! s:read_lawrencium_diff(repo, path_parts, full_path) abort
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
700 let l:diffargs = []
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
701 let l:commaidx = stridx(a:path_parts['value'], ',')
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
702 if l:commaidx > 0
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
703 let l:rev1 = strpart(a:path_parts['value'], 0, l:commaidx)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
704 let l:rev2 = strpart(a:path_parts['value'], l:commaidx + 1)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
705 if l:rev1 == '-'
126
47209552ec46 Shellescaped all command arguments in HgRepo.GetCommand,
namark <nshan.nnnn@gmail.com>
parents: 122
diff changeset
706 let l:diffargs = [ '-r', l:rev2 ]
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
707 elseif l:rev2 == '-'
126
47209552ec46 Shellescaped all command arguments in HgRepo.GetCommand,
namark <nshan.nnnn@gmail.com>
parents: 122
diff changeset
708 let l:diffargs = [ '-r', l:rev1 ]
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
709 else
126
47209552ec46 Shellescaped all command arguments in HgRepo.GetCommand,
namark <nshan.nnnn@gmail.com>
parents: 122
diff changeset
710 let l:diffargs = [ '-r', l:rev1, '-r', l:rev2 ]
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
711 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
712 elseif a:path_parts['value'] != ''
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
713 let l:diffargs = [ '-c', a:path_parts['value'] ]
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
714 else
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
715 let l:diffargs = []
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
716 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
717 if a:path_parts['path'] != '' && a:path_parts['path'] != '.'
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
718 call add(l:diffargs, a:full_path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
719 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
720 call a:repo.ReadCommandOutput('diff', l:diffargs)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
721 setlocal filetype=diff
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
722 setlocal nofoldenable
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
723 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
724
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
725 " Annotate file
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
726 function! s:read_lawrencium_annotate(repo, path_parts, full_path) abort
96
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
727 let l:cmd_args = ['-c', '-n', '-u', '-d', '-q']
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
728 if a:path_parts['value'] == 'v=1'
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
729 call insert(l:cmd_args, '-v', 0)
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
730 endif
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
731 call add(l:cmd_args, a:full_path)
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
732 call a:repo.ReadCommandOutput('annotate', l:cmd_args)
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
733 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
734
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
735 " MQ series
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
736 function! s:read_lawrencium_qseries(repo, path_parts, full_path) abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
737 let l:names = split(a:repo.RunCommand('qseries'), '\n')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
738 let l:head = split(a:repo.RunCommand('qapplied', '-s'), '\n')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
739 let l:tail = split(a:repo.RunCommand('qunapplied', '-s'), '\n')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
740
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
741 let l:idx = 0
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
742 let l:curbuffer = bufname('%')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
743 for line in l:head
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
744 call setbufvar(l:curbuffer, 'lawrencium_patchname_' . (l:idx + 1), l:names[l:idx])
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
745 call append(l:idx, "*" . line)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
746 let l:idx = l:idx + 1
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
747 endfor
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
748 for line in l:tail
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
749 call setbufvar(l:curbuffer, 'lawrencium_patchname_' . (l:idx + 1), l:names[l:idx])
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
750 call append(l:idx, line)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
751 let l:idx = l:idx + 1
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
752 endfor
78
e42f813b4a39 Fixed some bugs with the `Hgqseries` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
753 call setbufvar(l:curbuffer, 'lawrencium_patchname_top', l:names[len(l:head) - 1])
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
754 set filetype=hgqseries
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
755 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
756
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
757 " Generic read
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
758 let s:lawrencium_file_readers = {
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
759 \'rev': function('s:read_lawrencium_rev'),
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
760 \'log': function('s:read_lawrencium_log'),
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
761 \'diff': function('s:read_lawrencium_diff'),
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
762 \'status': function('s:read_lawrencium_status'),
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
763 \'annotate': function('s:read_lawrencium_annotate'),
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
764 \'qseries': function('s:read_lawrencium_qseries')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
765 \}
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
766 let s:lawrencium_file_customoptions = {
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
767 \'status': 1
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
768 \}
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
769
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
770 function! s:ReadLawrenciumFile(path) abort
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
771 call s:trace("Reading Lawrencium file: " . a:path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
772 let l:path_parts = s:parse_lawrencium_path(a:path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
773 if l:path_parts['root'] == ''
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
774 call s:throw("Can't get repository root from: " . a:path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
775 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
776 if !has_key(s:lawrencium_file_readers, l:path_parts['action'])
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
777 call s:throw("No registered reader for action: " . l:path_parts['action'])
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
778 endif
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
779
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
780 " Call the registered reader.
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
781 let l:repo = s:hg_repo(l:path_parts['root'])
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
782 let l:full_path = l:repo.root_dir . l:path_parts['path']
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
783 let LawrenciumFileReader = s:lawrencium_file_readers[l:path_parts['action']]
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
784 call LawrenciumFileReader(l:repo, l:path_parts, l:full_path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
785
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
786 " Setup the new buffer.
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
787 if !has_key(s:lawrencium_file_customoptions, l:path_parts['action'])
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
788 setlocal readonly
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
789 setlocal nomodified
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
790 setlocal bufhidden=delete
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
791 setlocal buftype=nofile
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
792 endif
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
793 goto
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
794
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
795 " Remember the real Lawrencium path, because Vim can fuck up the slashes
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
796 " on Windows.
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
797 let b:lawrencium_path = a:path
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
798
67
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
799 " Remember the repo it belongs to and make
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
800 " the Lawrencium commands available.
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
801 let b:mercurial_dir = l:repo.root_dir
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
802 call s:DefineMainCommands()
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
803
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
804 return ''
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
805 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
806
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
807 function! s:WriteLawrenciumFile(path) abort
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
808 call s:trace("Writing Lawrencium file: " . a:path)
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
809 endfunction
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
810
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
811 augroup lawrencium_files
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
812 autocmd!
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
813 autocmd BufReadCmd lawrencium://**//**//* exe s:ReadLawrenciumFile(expand('<amatch>'))
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
814 autocmd BufWriteCmd lawrencium://**//**//* exe s:WriteLawrenciumFile(expand('<amatch>'))
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
815 augroup END
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
816
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
817 " }}}
1cf08e4a7947 Made Lawrencium file easier to extend.
Ludovic Chabant <ludovic@chabant.com>
parents: 66
diff changeset
818
14
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
819 " Buffer Commands Management {{{
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
820
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
821 " Store the commands for Lawrencium-enabled buffers so that we can add them in
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
822 " batch when we need to.
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
823 let s:main_commands = []
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
824
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
825 function! s:AddMainCommand(command) abort
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
826 let s:main_commands += [a:command]
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
827 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
828
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
829 function! s:DefineMainCommands()
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
830 for l:command in s:main_commands
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
831 execute 'command! -buffer ' . l:command
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
832 endfor
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
833 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
834
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
835 augroup lawrencium_main
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
836 autocmd!
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
837 autocmd User Lawrencium call s:DefineMainCommands()
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
838 augroup end
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
839
14
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
840 " }}}
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
841
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
842 " Commands Auto-Complete {{{
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
843
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
844 " Auto-complete function for commands that take repo-relative file paths.
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
845 function! s:ListRepoFiles(ArgLead, CmdLine, CursorPos) abort
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
846 let l:matches = s:hg_repo().Glob(a:ArgLead . '*', 1)
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
847 call map(l:matches, 's:normalizepath(v:val)')
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
848 return l:matches
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
849 endfunction
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
850
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
851 " Auto-complete function for commands that take repo-relative directory paths.
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
852 function! s:ListRepoDirs(ArgLead, CmdLine, CursorPos) abort
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
853 let l:matches = s:hg_repo().Glob(a:ArgLead . '*/')
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
854 call map(l:matches, 's:normalizepath(v:val)')
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
855 return l:matches
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
856 endfunction
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
857
14
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
858 " }}}
eab2680e6818 Better fold sections.
Ludovic Chabant <ludovic@chabant.com>
parents: 12
diff changeset
859
4
b6e4446ed292 HgStatus now outputs to the location window.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
860 " Hg {{{
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
861
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
862 function! s:Hg(bang, ...) abort
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
863 let l:repo = s:hg_repo()
44
95f8e7cb5ca2 Stop fucking with my brain, Python.
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
864 if g:lawrencium_auto_cd
43
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
865 " Temporary set the current directory to the root of the repo
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
866 " to make auto-completed paths work magically.
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
867 execute 'cd! ' . fnameescape(l:repo.root_dir)
43
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
868 endif
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
869 let l:output = call(l:repo.RunCommand, a:000, l:repo)
44
95f8e7cb5ca2 Stop fucking with my brain, Python.
Ludovic Chabant <ludovic@chabant.com>
parents: 43
diff changeset
870 if g:lawrencium_auto_cd
43
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
871 execute 'cd! -'
fc20a265551d Added auto cd'ing into the repo root for `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
872 endif
110
e66df94ebceb adding HgCmdPost custom autocmd
Ghennadi Pilipenco <pilipenco@molecularhealth.com>
parents: 108
diff changeset
873 silent doautocmd User HgCmdPost
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
874 if a:bang
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
875 " Open the output of the command in a temp file.
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
876 let l:temp_file = s:tempname('hg-output-', '.txt')
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
877 split
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
878 execute 'edit ' . fnameescape(l:temp_file)
21
d0acefc1ec9a Fixed multi-line output of `:Hg`.
Ludovic Chabant <ludovic@chabant.com>
parents: 18
diff changeset
879 call append(0, split(l:output, '\n'))
46
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
880 call cursor(1, 1)
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
881
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
882 " Make it a temp buffer
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
883 setlocal bufhidden=delete
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
884 setlocal buftype=nofile
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
885
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
886 " Try to find a nice syntax to set given the current command.
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
887 let l:command_name = s:GetHgCommandName(a:000)
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
888 if l:command_name != '' && exists('g:lawrencium_hg_commands_file_types')
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
889 let l:file_type = get(g:lawrencium_hg_commands_file_types, l:command_name, '')
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
890 if l:file_type != ''
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
891 execute 'setlocal ft=' . l:file_type
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
892 endif
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
893 endif
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
894 else
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
895 " Just print out the output of the command.
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
896 echo l:output
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
897 endif
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
898 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
899
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
900 " Include the generated HG usage file.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
901 let s:usage_file = expand("<sfile>:h:h") . "/resources/hg_usage.vim"
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
902 if filereadable(s:usage_file)
89
7fcb71064e85 More path escaping!
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
903 execute "source " . fnameescape(s:usage_file)
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
904 else
18
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
905 call s:error("Can't find the Mercurial usage file. Auto-completion will be disabled in Lawrencium.")
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
906 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
907
46
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
908 " Include the command file type mappings.
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
909 let s:file_type_mappings = expand("<sfile>:h:h") . '/resources/hg_command_file_types.vim'
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
910 if filereadable(s:file_type_mappings)
89
7fcb71064e85 More path escaping!
Ludovic Chabant <ludovic@chabant.com>
parents: 88
diff changeset
911 execute "source " . fnameescape(s:file_type_mappings)
46
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
912 endif
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
913
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
914 function! s:CompleteHg(ArgLead, CmdLine, CursorPos)
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
915 " Don't do anything if the usage file was not sourced.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
916 if !exists('g:lawrencium_hg_commands') || !exists('g:lawrencium_hg_options')
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
917 return []
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
918 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
919
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
920 " a:ArgLead seems to be the number 0 when completing a minus '-'.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
921 " Gotta find out why...
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
922 let l:arglead = a:ArgLead
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
923 if type(a:ArgLead) == type(0)
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
924 let l:arglead = '-'
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
925 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
926
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
927 " Try completing a global option, before any command name.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
928 if a:CmdLine =~# '\v^Hg(\s+\-[a-zA-Z0-9\-_]*)+$'
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
929 return filter(copy(g:lawrencium_hg_options), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
930 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
931
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
932 " Try completing a command (note that there could be global options before
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
933 " the command name).
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
934 if a:CmdLine =~# '\v^Hg\s+(\-[a-zA-Z0-9\-_]+\s+)*[a-zA-Z]+$'
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
935 return filter(keys(g:lawrencium_hg_commands), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
936 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
937
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
938 " Try completing a command's options.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
939 let l:cmd = matchstr(a:CmdLine, '\v(^Hg\s+(\-[a-zA-Z0-9\-_]+\s+)*)@<=[a-zA-Z]+')
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
940 if strlen(l:cmd) > 0 && l:arglead[0] ==# '-'
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
941 if has_key(g:lawrencium_hg_commands, l:cmd)
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
942 " Return both command options and global options together.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
943 let l:copts = filter(copy(g:lawrencium_hg_commands[l:cmd]), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
944 let l:gopts = filter(copy(g:lawrencium_hg_options), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
945 return l:copts + l:gopts
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
946 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
947 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
948
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
949 " Just auto-complete with filenames unless it's an option.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
950 if l:arglead[0] ==# '-'
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
951 return []
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
952 else
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
953 return s:ListRepoFiles(a:ArgLead, a:CmdLine, a:CursorPos)
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
954 endfunction
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
955
46
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
956 function! s:GetHgCommandName(args) abort
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
957 for l:a in a:args
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
958 if stridx(l:a, '-') != 0
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
959 return l:a
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
960 endif
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
961 endfor
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
962 return ''
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
963 endfunction
6a4f5200d8da `:Hg!` command changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 45
diff changeset
964
26
de588a4bca10 Fixed completely wrong code that somehow almost ran completely fine.
Ludovic Chabant <ludovic@chabant.com>
parents: 25
diff changeset
965 call s:AddMainCommand("-bang -complete=customlist,s:CompleteHg -nargs=* Hg :call s:Hg(<bang>0, <f-args>)")
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
966
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
967 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
968
4
b6e4446ed292 HgStatus now outputs to the location window.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
969 " Hgstatus {{{
b6e4446ed292 HgStatus now outputs to the location window.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
970
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
971 function! s:HgStatus() abort
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
972 " Get the repo and the Lawrencium path for `hg status`.
4
b6e4446ed292 HgStatus now outputs to the location window.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
973 let l:repo = s:hg_repo()
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
974 let l:status_path = l:repo.GetLawrenciumPath('', 'status', '')
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
975
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
976 " Open the Lawrencium buffer in a new split window of the right size.
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
977 if g:lawrencium_status_win_split_above
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
978 execute "keepalt leftabove split " . fnameescape(l:status_path)
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
979 else
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
980 execute "keepalt rightbelow split " . fnameescape(l:status_path)
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
981 endif
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
982
86
685dfc4b5862 Fix `Hgstatus` incorrectly saying nothing has changed.
Ludovic Chabant <ludovic@chabant.com>
parents: 84
diff changeset
983 if (line('$') == 1 && getline(1) == '')
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
984 " Buffer is empty, which means there are not changes...
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
985 " Quit and display a message.
64
e75ecde434d7 Display simple message when `Hgstatus` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 63
diff changeset
986 " TODO: figure out why the first `echom` doesn't show when alone.
e75ecde434d7 Display simple message when `Hgstatus` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 63
diff changeset
987 bdelete
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
988 echom "Nothing was modified."
64
e75ecde434d7 Display simple message when `Hgstatus` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 63
diff changeset
989 echom ""
e75ecde434d7 Display simple message when `Hgstatus` is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 63
diff changeset
990 return
11
b4baab0a4a92 Made most regex use the 'very-magic' syntax.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
991 endif
6
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
992
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
993 execute "setlocal winfixheight"
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
994 if !g:lawrencium_status_win_split_even
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
995 execute "setlocal winheight=" . (line('$') + 1)
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
996 execute "resize " . (line('$') + 1)
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
997 endif
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
998
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
999 " Add some nice commands.
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1000 command! -buffer Hgstatusedit :call s:HgStatus_FileEdit(0)
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
1001 command! -buffer Hgstatusdiff :call s:HgStatus_Diff(0)
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
1002 command! -buffer Hgstatusvdiff :call s:HgStatus_Diff(1)
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1003 command! -buffer Hgstatustabdiff :call s:HgStatus_Diff(2)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1004 command! -buffer Hgstatusdiffsum :call s:HgStatus_DiffSummary(1)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1005 command! -buffer Hgstatusvdiffsum :call s:HgStatus_DiffSummary(2)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1006 command! -buffer Hgstatustabdiffsum :call s:HgStatus_DiffSummary(3)
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
1007 command! -buffer Hgstatusrefresh :call s:HgStatus_Refresh()
116
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1008 command! -buffer -range -bang Hgstatusrevert :call s:HgStatus_Revert(<line1>, <line2>, <bang>0)
63
02a1be804fe8 Using Lawrencium buffers for `Hgstatus`.
Ludovic Chabant <ludovic@chabant.com>
parents: 62
diff changeset
1009 command! -buffer -range Hgstatusaddremove :call s:HgStatus_AddRemove(<line1>, <line2>)
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1010 command! -buffer -range=% -bang Hgstatuscommit :call s:HgStatus_Commit(<line1>, <line2>, <bang>0, 0)
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1011 command! -buffer -range=% -bang Hgstatusvcommit :call s:HgStatus_Commit(<line1>, <line2>, <bang>0, 1)
40
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1012 command! -buffer -range=% -nargs=+ Hgstatusqnew :call s:HgStatus_QNew(<line1>, <line2>, <f-args>)
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1013 command! -buffer -range=% Hgstatusqrefresh :call s:HgStatus_QRefresh(<line1>, <line2>)
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1014
6
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
1015 " Add some handy mappings.
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1016 if g:lawrencium_define_mappings
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1017 nnoremap <buffer> <silent> <cr> :Hgstatusedit<cr>
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1018 nnoremap <buffer> <silent> <C-N> :call search('^[MARC\!\?I ]\s.', 'We')<cr>
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1019 nnoremap <buffer> <silent> <C-P> :call search('^[MARC\!\?I ]\s.', 'Wbe')<cr>
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1020 nnoremap <buffer> <silent> <C-D> :Hgstatustabdiff<cr>
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1021 nnoremap <buffer> <silent> <C-V> :Hgstatusvdiff<cr>
58
621185a5fa48 Added ability to show diff summaries from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
1022 nnoremap <buffer> <silent> <C-U> :Hgstatusdiffsum<cr>
621185a5fa48 Added ability to show diff summaries from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
1023 nnoremap <buffer> <silent> <C-H> :Hgstatusvdiffsum<cr>
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1024 nnoremap <buffer> <silent> <C-A> :Hgstatusaddremove<cr>
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1025 nnoremap <buffer> <silent> <C-S> :Hgstatuscommit<cr>
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1026 nnoremap <buffer> <silent> <C-R> :Hgstatusrefresh<cr>
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1027 nnoremap <buffer> <silent> q :bdelete!<cr>
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1028
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1029 vnoremap <buffer> <silent> <C-A> :Hgstatusaddremove<cr>
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1030 vnoremap <buffer> <silent> <C-S> :Hgstatuscommit<cr>
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1031 endif
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1032 endfunction
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1033
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1034 function! s:HgStatus_Refresh(...) abort
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1035 if a:0 > 0
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1036 let l:win_nr = bufwinnr(a:1)
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1037 call s:trace("Switching back to status window ".l:win_nr)
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1038 if l:win_nr < 0
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1039 call s:throw("Can't find the status window anymore!")
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1040 endif
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1041 execute l:win_nr . 'wincmd w'
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1042 " Delete everything in the buffer, and re-read the status into it.
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1043 " TODO: In theory I would only have to do `edit` like below when we're
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1044 " already in the window, but for some reason Vim just goes bonkers and
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1045 " weird shit happens. I have no idea why, hence the work-around here
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1046 " to bypass the whole `BufReadCmd` auto-command altogether, and just
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1047 " edit the buffer in place.
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1048 normal! ggVGd
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1049 call s:ReadLawrenciumFile(b:lawrencium_path)
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1050 return
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1051 endif
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1052
75
066c8654e754 Reverted some automatic `Hgstatus` window refresh.
Ludovic Chabant <ludovic@chabant.com>
parents: 74
diff changeset
1053 " Just re-edit the buffer, it will reload the contents by calling
066c8654e754 Reverted some automatic `Hgstatus` window refresh.
Ludovic Chabant <ludovic@chabant.com>
parents: 74
diff changeset
1054 " the matching Mercurial command.
066c8654e754 Reverted some automatic `Hgstatus` window refresh.
Ludovic Chabant <ludovic@chabant.com>
parents: 74
diff changeset
1055 edit
6
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
1056 endfunction
1da613c13d81 Better hg-status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
1057
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1058 function! s:HgStatus_FileEdit(newtab) abort
9
82a49134a85c Added keyboard shortcuts to Hgstatus window.
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
1059 " Get the path of the file the cursor is on.
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1060 let l:filename = s:HgStatus_GetSelectedFile()
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1061
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1062 let l:cleanupbufnr = -1
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1063 if a:newtab == 0
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1064 " If the file is already open in a window, jump to that window.
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1065 " Otherwise, jump to the previous window and open it there.
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1066 for nr in range(1, winnr('$'))
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1067 let l:br = winbufnr(nr)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1068 let l:bpath = fnamemodify(bufname(l:br), ':p')
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1069 if l:bpath ==# l:filename
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1070 execute nr . 'wincmd w'
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1071 return
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1072 endif
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1073 endfor
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1074 wincmd p
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1075 else
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1076 " Just open a new tab so we can edit the file there.
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1077 " We don't use `tabedit` because it messes up the current window
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1078 " if it happens to be the same file.
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1079 " We'll just have to clean up the default empty buffer created.
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1080 tabnew
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1081 let l:cleanupbufnr = bufnr('%')
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1082 endif
117
2e38e754c896 Correctly escape filename when opening a buffer from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 116
diff changeset
1083 execute 'edit ' . fnameescape(l:filename)
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1084 if l:cleanupbufnr >= 0
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1085 execute 'bdelete ' . l:cleanupbufnr
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1086 endif
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1087 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1088
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1089 function! s:HgStatus_AddRemove(linestart, lineend) abort
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1090 " Get the selected filenames.
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1091 let l:filenames = s:HgStatus_GetSelectedFiles(a:linestart, a:lineend, ['!', '?'])
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1092 if len(l:filenames) == 0
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1093 call s:error("No files to add or remove in selection or current line.")
69
8c9aca0e4322 Added return statement after calling s:error
lmytinsk
parents: 68
diff changeset
1094 return
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1095 endif
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1096
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1097 " Run `addremove` on those paths.
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1098 let l:repo = s:hg_repo()
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1099 call l:repo.RunCommand('addremove', l:filenames)
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1100
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1101 " Refresh the status window.
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1102 call s:HgStatus_Refresh()
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1103 endfunction
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1104
116
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1105 function! s:HgStatus_Revert(linestart, lineend, bang) abort
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1106 " Get the selected filenames.
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1107 let l:filenames = s:HgStatus_GetSelectedFiles(a:linestart, a:lineend, ['M', 'A', 'R'])
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1108 if len(l:filenames) == 0
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1109 call s:error("No files to revert in selection or current line.")
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1110 return
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1111 endif
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1112
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1113 " Run `revert` on those paths.
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1114 " If the bang modifier is specified, revert with no backup.
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1115 let l:repo = s:hg_repo()
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1116 if a:bang
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1117 call insert(l:filenames, '-C', 0)
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1118 endif
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1119 call l:repo.RunCommand('revert', l:filenames)
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1120
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1121 " Refresh the status window.
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1122 call s:HgStatus_Refresh()
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1123 endfunction
7da11e029773 Revert files from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 114
diff changeset
1124
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1125 function! s:HgStatus_Commit(linestart, lineend, bang, vertical) abort
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1126 " Get the selected filenames.
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1127 let l:filenames = s:HgStatus_GetSelectedFiles(a:linestart, a:lineend, ['M', 'A', 'R'])
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1128 if len(l:filenames) == 0
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1129 call s:error("No files to commit in selection or file.")
69
8c9aca0e4322 Added return statement after calling s:error
lmytinsk
parents: 68
diff changeset
1130 return
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1131 endif
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1132
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1133 " Run `Hgcommit` on those paths.
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1134 let l:buf_nr = bufnr('%')
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1135 let l:callback = 'call s:HgStatus_Refresh('.l:buf_nr.')'
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1136 call s:HgCommit(a:bang, a:vertical, l:callback, l:filenames)
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1137 endfunction
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1138
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1139 function! s:HgStatus_Diff(split) abort
25
0e952b7c79d7 Fixed a bug with opening a diff from `Hgstatus`
Ludovic Chabant <ludovic@chabant.com>
parents: 24
diff changeset
1140 " Open the file and run `Hgdiff` on it.
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1141 " We also need to translate the split mode for it... if we already
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1142 " opened the file in a new tab, `HgDiff` only needs to do a vertical
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1143 " split (i.e. split=1).
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1144 let l:newtab = 0
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1145 let l:hgdiffsplit = a:split
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1146 if a:split == 2
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1147 let l:newtab = 1
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1148 let l:hgdiffsplit = 1
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1149 endif
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1150 call s:HgStatus_FileEdit(l:newtab)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1151 call s:HgDiff('%:p', l:hgdiffsplit)
9
82a49134a85c Added keyboard shortcuts to Hgstatus window.
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
1152 endfunction
82a49134a85c Added keyboard shortcuts to Hgstatus window.
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
1153
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1154 function! s:HgStatus_DiffSummary(split) abort
58
621185a5fa48 Added ability to show diff summaries from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
1155 " Get the path of the file the cursor is on.
621185a5fa48 Added ability to show diff summaries from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
1156 let l:path = s:HgStatus_GetSelectedFile()
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1157 " Reuse the same diff summary window
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1158 let l:reuse_id = 'lawrencium_diffsum_for_' . bufnr('%')
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1159 let l:split_prev_win = (a:split < 3)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1160 let l:args = {'reuse_id': l:reuse_id, 'use_prev_win': l:split_prev_win,
113
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1161 \'avoid_win': winnr(), 'split_mode': a:split}
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1162 call s:HgDiffSummary(l:path, l:args)
58
621185a5fa48 Added ability to show diff summaries from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
1163 endfunction
621185a5fa48 Added ability to show diff summaries from the status window.
Ludovic Chabant <ludovic@chabant.com>
parents: 57
diff changeset
1164
40
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1165 function! s:HgStatus_QNew(linestart, lineend, patchname, ...) abort
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1166 " Get the selected filenames.
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1167 let l:filenames = s:HgStatus_GetSelectedFiles(a:linestart, a:lineend, ['M', 'A', 'R'])
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1168 if len(l:filenames) == 0
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1169 call s:error("No files in selection or file to create patch.")
69
8c9aca0e4322 Added return statement after calling s:error
lmytinsk
parents: 68
diff changeset
1170 return
40
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1171 endif
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1172
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1173 " Run `Hg qnew` on those paths.
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1174 let l:repo = s:hg_repo()
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1175 call insert(l:filenames, a:patchname, 0)
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1176 if a:0 > 0
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1177 call insert(l:filenames, '-m', 0)
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1178 let l:message = '"' . join(a:000, ' ') . '"'
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1179 call insert(l:filenames, l:message, 1)
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1180 endif
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1181 call l:repo.RunCommand('qnew', l:filenames)
72
a987094d5ae6 Made the `Hgstatus` window refresh itself when needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 71
diff changeset
1182
a987094d5ae6 Made the `Hgstatus` window refresh itself when needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 71
diff changeset
1183 " Refresh the status window.
a987094d5ae6 Made the `Hgstatus` window refresh itself when needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 71
diff changeset
1184 call s:HgStatus_Refresh()
40
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1185 endfunction
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1186
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1187 function! s:HgStatus_QRefresh(linestart, lineend) abort
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1188 " Get the selected filenames.
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1189 let l:filenames = s:HgStatus_GetSelectedFiles(a:linestart, a:lineend, ['M', 'A', 'R'])
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1190 if len(l:filenames) == 0
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1191 call s:error("No files in selection or file to refresh the patch.")
69
8c9aca0e4322 Added return statement after calling s:error
lmytinsk
parents: 68
diff changeset
1192 return
40
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1193 endif
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1194
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1195 " Run `Hg qrefresh` on those paths.
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1196 let l:repo = s:hg_repo()
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1197 call insert(l:filenames, '-s', 0)
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1198 call l:repo.RunCommand('qrefresh', l:filenames)
72
a987094d5ae6 Made the `Hgstatus` window refresh itself when needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 71
diff changeset
1199
a987094d5ae6 Made the `Hgstatus` window refresh itself when needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 71
diff changeset
1200 " Refresh the status window.
a987094d5ae6 Made the `Hgstatus` window refresh itself when needed.
Ludovic Chabant <ludovic@chabant.com>
parents: 71
diff changeset
1201 call s:HgStatus_Refresh()
40
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1202 endfunction
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1203
a63ec818ab21 Added `qnew` and `qrefresh` commands to the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 37
diff changeset
1204
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1205 function! s:HgStatus_GetSelectedFile() abort
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1206 let l:filenames = s:HgStatus_GetSelectedFiles()
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1207 return l:filenames[0]
9
82a49134a85c Added keyboard shortcuts to Hgstatus window.
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
1208 endfunction
82a49134a85c Added keyboard shortcuts to Hgstatus window.
Ludovic Chabant <ludovic@chabant.com>
parents: 8
diff changeset
1209
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1210 function! s:HgStatus_GetSelectedFiles(...) abort
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1211 if a:0 >= 2
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1212 let l:lines = getline(a:1, a:2)
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1213 else
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1214 let l:lines = []
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1215 call add(l:lines, getline('.'))
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1216 endif
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1217 let l:filenames = []
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1218 let l:repo = s:hg_repo()
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1219 for line in l:lines
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1220 if a:0 >= 3
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1221 let l:status = s:HgStatus_GetFileStatus(line)
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1222 if index(a:3, l:status) < 0
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1223 continue
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1224 endif
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1225 endif
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1226 " Yay, awesome, Vim's regex syntax is fucked up like shit, especially for
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1227 " look-aheads and look-behinds. See for yourself:
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1228 let l:filename = matchstr(l:line, '\v(^[MARC\!\?I ]\s)@<=.*')
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1229 let l:filename = l:repo.GetFullPath(l:filename)
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1230 call add(l:filenames, l:filename)
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1231 endfor
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1232 return l:filenames
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1233 endfunction
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1234
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1235 function! s:HgStatus_GetFileStatus(...) abort
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1236 let l:line = a:0 ? a:1 : getline('.')
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1237 return matchstr(l:line, '\v^[MARC\!\?I ]')
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1238 endfunction
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1239
26
de588a4bca10 Fixed completely wrong code that somehow almost ran completely fine.
Ludovic Chabant <ludovic@chabant.com>
parents: 25
diff changeset
1240 call s:AddMainCommand("Hgstatus :call s:HgStatus()")
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1241
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1242 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1243
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1244 " Hgcd, Hglcd {{{
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1245
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1246 call s:AddMainCommand("-bang -nargs=? -complete=customlist,s:ListRepoDirs Hgcd :cd<bang> `=s:hg_repo().GetFullPath(<q-args>)`")
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1247 call s:AddMainCommand("-bang -nargs=? -complete=customlist,s:ListRepoDirs Hglcd :lcd<bang> `=s:hg_repo().GetFullPath(<q-args>)`")
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1248
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1249 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1250
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1251 " Hgedit {{{
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1252
27
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1253 function! s:HgEdit(bang, filename) abort
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1254 let l:full_path = s:hg_repo().GetFullPath(a:filename)
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1255 if a:bang
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1256 execute "edit! " . fnameescape(l:full_path)
27
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1257 else
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1258 execute "edit " . fnameescape(l:full_path)
27
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1259 endif
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1260 endfunction
09115be355e2 Fixed a bug with running `Hgedit` on a directory with a trailing backslash.
Ludovic Chabant <ludovic@chabant.com>
parents: 26
diff changeset
1261
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1262 call s:AddMainCommand("-bang -nargs=1 -complete=customlist,s:ListRepoFiles Hgedit :call s:HgEdit(<bang>0, <f-args>)")
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1263
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1264 " }}}
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1265
70
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1266 " Hgvimgrep {{{
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1267
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1268 function! s:HgVimGrep(bang, pattern, ...) abort
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1269 let l:repo = s:hg_repo()
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1270 let l:file_paths = []
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1271 if a:0 > 0
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1272 for ff in a:000
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1273 let l:full_ff = l:repo.GetFullPath(ff)
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1274 call add(l:file_paths, l:full_ff)
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1275 endfor
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1276 else
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1277 call add(l:file_paths, l:repo.root_dir . "**")
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1278 endif
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1279 if a:bang
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1280 execute "vimgrep! " . a:pattern . " " . join(l:file_paths, " ")
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1281 else
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1282 execute "vimgrep " . a:pattern . " " . join(l:file_paths, " ")
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1283 endif
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1284 endfunction
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1285
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1286 call s:AddMainCommand("-bang -nargs=+ -complete=customlist,s:ListRepoFiles Hgvimgrep :call s:HgVimGrep(<bang>0, <f-args>)")
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1287
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1288 " }}}
16e873b2a4a8 Added `Hgvimgrep` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 69
diff changeset
1289
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1290 " Hgdiff, Hgvdiff, Hgtabdiff {{{
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1291
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1292 function! s:HgDiff(filename, split, ...) abort
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1293 " Default revisions to diff: the working directory (null string)
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1294 " and the parent of the working directory (using Mercurial's revsets syntax).
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1295 " Otherwise, use the 1 or 2 revisions specified as extra parameters.
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1296 let l:rev1 = 'p1()'
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1297 let l:rev2 = ''
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1298 if a:0 == 1
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1299 if type(a:1) == type([])
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1300 if len(a:1) >= 2
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1301 let l:rev1 = a:1[0]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1302 let l:rev2 = a:1[1]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1303 elseif len(a:1) == 1
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1304 let l:rev1 = a:1[0]
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1305 endif
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1306 else
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1307 let l:rev1 = a:1
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1308 endif
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1309 elseif a:0 == 2
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1310 let l:rev1 = a:1
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1311 let l:rev2 = a:2
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1312 endif
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1313
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1314 " Get the current repo, and expand the given filename in case it contains
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1315 " fancy filename modifiers.
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1316 let l:repo = s:hg_repo()
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1317 let l:path = expand(a:filename)
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1318 let l:diff_id = localtime()
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1319 call s:trace("Diff'ing '".l:rev1."' and '".l:rev2."' on file: ".l:path)
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1320
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1321 " Get the first file and open it.
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1322 let l:cleanupbufnr = -1
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1323 if l:rev1 == ''
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1324 if a:split == 2
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1325 " Don't use `tabedit` here because if `l:path` is the same as
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1326 " the current path, it will also reload the buffer in the current
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1327 " tab/window for some reason, which causes all state to be lost
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1328 " (all folds get collapsed again, cursor is moved to start, etc.)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1329 tabnew
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1330 let l:cleanupbufnr = bufnr('%')
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1331 execute 'edit ' . fnameescape(l:path)
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1332 else
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1333 if bufexists(l:path)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1334 execute 'buffer ' . fnameescape(l:path)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1335 else
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1336 execute 'edit ' . fnameescape(l:path)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1337 endif
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1338 endif
11
b4baab0a4a92 Made most regex use the 'very-magic' syntax.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
1339 " Make it part of the diff group.
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1340 call s:HgDiff_DiffThis(l:diff_id)
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1341 else
52
cd0b1cea326c Use Lawrencium files for displaying revisions in an `Hgdiff`.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
1342 let l:rev_path = l:repo.GetLawrenciumPath(l:path, 'rev', l:rev1)
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1343 if a:split == 2
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1344 " See comments above about avoiding `tabedit`.
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1345 tabnew
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1346 let l:cleanupbufnr = bufnr('%')
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1347 endif
52
cd0b1cea326c Use Lawrencium files for displaying revisions in an `Hgdiff`.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
1348 execute 'edit ' . fnameescape(l:rev_path)
11
b4baab0a4a92 Made most regex use the 'very-magic' syntax.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
1349 " Make it part of the diff group.
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1350 call s:HgDiff_DiffThis(l:diff_id)
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1351 endif
93
bc5a8dff3fa0 Another attempt to fix weird issues with cleaning up diff buffers.
Ludovic Chabant <ludovic@chabant.com>
parents: 92
diff changeset
1352 if l:cleanupbufnr >= 0 && bufloaded(l:cleanupbufnr)
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1353 execute 'bdelete ' . l:cleanupbufnr
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1354 endif
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1355
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1356 " Get the second file and open it too.
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1357 " Don't use `diffsplit` because it will set `&diff` before we get a chance
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1358 " to save a bunch of local settings that we will want to restore later.
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1359 let l:diffsplit = 'split'
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1360 if a:split >= 1
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1361 let l:diffsplit = 'vsplit'
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1362 endif
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1363 if l:rev2 == ''
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1364 execute l:diffsplit . ' ' . fnameescape(l:path)
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1365 else
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1366 let l:rev_path = l:repo.GetLawrenciumPath(l:path, 'rev', l:rev2)
52
cd0b1cea326c Use Lawrencium files for displaying revisions in an `Hgdiff`.
Ludovic Chabant <ludovic@chabant.com>
parents: 51
diff changeset
1367 execute l:diffsplit . ' ' . fnameescape(l:rev_path)
8
1e155bfa94ad Added 'Hg!' and 'Hgdiff/Hgvdiff'.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
1368 endif
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1369 call s:HgDiff_DiffThis(l:diff_id)
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1370 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1371
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1372 function! s:HgDiff_DiffThis(diff_id) abort
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1373 " Store some commands to run when we exit diff mode.
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1374 " It's needed because `diffoff` reverts those settings to their default
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1375 " values, instead of their previous ones.
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1376 if &diff
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1377 call s:throw("Calling diffthis too late on a buffer!")
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1378 return
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1379 endif
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1380 call s:trace('Enabling diff mode on ' . bufname('%'))
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1381 let w:lawrencium_diffoff = {}
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1382 let w:lawrencium_diffoff['&diff'] = 0
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1383 let w:lawrencium_diffoff['&wrap'] = &l:wrap
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1384 let w:lawrencium_diffoff['&scrollopt'] = &l:scrollopt
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1385 let w:lawrencium_diffoff['&scrollbind'] = &l:scrollbind
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1386 let w:lawrencium_diffoff['&cursorbind'] = &l:cursorbind
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1387 let w:lawrencium_diffoff['&foldmethod'] = &l:foldmethod
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1388 let w:lawrencium_diffoff['&foldcolumn'] = &l:foldcolumn
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1389 let w:lawrencium_diff_id = a:diff_id
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1390 diffthis
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1391 autocmd BufWinLeave <buffer> call s:HgDiff_CleanUp()
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1392 endfunction
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1393
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1394 function! s:HgDiff_DiffOff(...) abort
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1395 " Get the window name (given as a paramter, or current window).
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1396 let l:nr = a:0 ? a:1 : winnr()
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1397
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1398 " Run the commands we saved in `HgDiff_DiffThis`, or just run `diffoff`.
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1399 let l:backup = getwinvar(l:nr, 'lawrencium_diffoff')
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1400 if type(l:backup) == type({}) && len(l:backup) > 0
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1401 call s:trace('Disabling diff mode on ' . l:nr)
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1402 for key in keys(l:backup)
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1403 call setwinvar(l:nr, key, l:backup[key])
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1404 endfor
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1405 call setwinvar(l:nr, 'lawrencium_diffoff', {})
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1406 else
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1407 call s:trace('Disabling diff mode on ' . l:nr . ' (but no true restore)')
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1408 diffoff
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1409 endif
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1410 endfunction
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1411
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1412 function! s:HgDiff_GetDiffWindows(diff_id) abort
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1413 let l:result = []
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1414 for nr in range(1, winnr('$'))
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1415 if getwinvar(nr, '&diff') && getwinvar(nr, 'lawrencium_diff_id') == a:diff_id
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1416 call add(l:result, nr)
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1417 endif
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1418 endfor
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1419 return l:result
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1420 endfunction
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1421
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1422 function! s:HgDiff_CleanUp() abort
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1423 " If we're not leaving one of our diff window, do nothing.
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1424 if !&diff || !exists('w:lawrencium_diff_id')
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1425 return
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1426 endif
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1427
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1428 " If there will be only one diff window left (plus the one we're leaving),
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1429 " turn off diff in it and restore its local settings.
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1430 let l:nrs = s:HgDiff_GetDiffWindows(w:lawrencium_diff_id)
23
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1431 if len(l:nrs) <= 2
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1432 call s:trace('Disabling diff mode in ' . len(l:nrs) . ' windows.')
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1433 for nr in l:nrs
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1434 if getwinvar(nr, '&diff')
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1435 call s:HgDiff_DiffOff(nr)
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1436 endif
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1437 endfor
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1438 else
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1439 call s:trace('Still ' . len(l:nrs) . ' diff windows open.')
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1440 endif
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1441 endfunction
84bceffbb19c Restore window settings when a diff window is closed.
Ludovic Chabant <ludovic@chabant.com>
parents: 21
diff changeset
1442
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1443 call s:AddMainCommand("-nargs=* Hgdiff :call s:HgDiff('%:p', 0, <f-args>)")
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1444 call s:AddMainCommand("-nargs=* Hgvdiff :call s:HgDiff('%:p', 1, <f-args>)")
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1445 call s:AddMainCommand("-nargs=* Hgtabdiff :call s:HgDiff('%:p', 2, <f-args>)")
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1446
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1447 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1448
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1449 " Hgdiffsum, Hgdiffsumsplit, Hgvdiffsumsplit, Hgtabdiffsum {{{
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1450
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1451 function! s:HgDiffSummary(filename, present_args, ...) abort
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1452 " Default revisions to diff: the working directory (null string)
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1453 " and the parent of the working directory (using Mercurial's revsets syntax).
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1454 " Otherwise, use the 1 or 2 revisions specified as extra parameters.
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1455 let l:revs = ''
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1456 if a:0 == 1
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1457 if type(a:1) == type([])
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1458 if len(a:1) >= 2
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1459 let l:revs = a:1[0] . ',' . a:1[1]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1460 elseif len(a:1) == 1
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1461 let l:revs = a:1[0]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1462 endif
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1463 else
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1464 let l:revs = a:1
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1465 endif
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1466 elseif a:0 >= 2
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1467 let l:revs = a:1 . ',' . a:2
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1468 endif
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1469
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1470 " Get the current repo, and expand the given filename in case it contains
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1471 " fancy filename modifiers.
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1472 let l:repo = s:hg_repo()
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1473 let l:path = expand(a:filename)
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1474 call s:trace("Diff'ing revisions: '".l:revs."' on file: ".l:path)
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1475 let l:special = l:repo.GetLawrenciumPath(l:path, 'diff', l:revs)
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1476
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1477 " Build the correct edit command, and switch to the correct window, based
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1478 " on the presentation arguments we got.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1479 if type(a:present_args) == type(0)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1480 " Just got a split mode.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1481 let l:valid_args = {'split_mode': a:present_args}
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1482 else
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1483 " Got complex args.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1484 let l:valid_args = a:present_args
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1485 endif
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1486
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1487 " First, see if we should reuse an existing window based on some buffer
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1488 " variable.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1489 let l:target_winnr = -1
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1490 let l:split = get(l:valid_args, 'split_mode', 0)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1491 let l:reuse_id = get(l:valid_args, 'reuse_id', '')
113
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1492 let l:avoid_id = get(l:valid_args, 'avoid_win', -1)
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1493 if l:reuse_id != ''
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1494 let l:target_winnr = s:find_buffer_window(l:reuse_id, 1)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1495 if l:target_winnr > 0 && l:split != 3
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1496 " Unless we'll be opening in a new tab, don't split anymore, since
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1497 " we found the exact window we wanted.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1498 let l:split = 0
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1499 endif
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1500 call s:trace("Looking for window with '".l:reuse_id."', found: ".l:target_winnr)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1501 endif
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1502 " If we didn't find anything, see if we should use the current or previous
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1503 " window.
113
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1504 if l:target_winnr <= 0
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1505 let l:use_prev_win = get(l:valid_args, 'use_prev_win', 0)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1506 if l:use_prev_win
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1507 let l:target_winnr = winnr('#')
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1508 call s:trace("Will use previous window: ".l:target_winnr)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1509 endif
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1510 endif
113
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1511 " And let's see if we have a window we should actually avoid.
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1512 if l:avoid_id >= 0 &&
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1513 \(l:target_winnr == l:avoid_id ||
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1514 \(l:target_winnr <= 0 && winnr() == l:avoid_id))
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1515 for wnr in range(1, winnr('$'))
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1516 if wnr != l:avoid_id
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1517 call s:trace("Avoiding using window ".l:avoid_id.
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1518 \", now using: ".wnr)
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1519 let l:target_winnr = wnr
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1520 break
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1521 endif
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1522 endfor
8718e6dbea1e Fix a bug with `:Hgstatus` showing diff summaries in its own window.
Ludovic Chabant <ludovic@chabant.com>
parents: 112
diff changeset
1523 endif
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1524 " Now let's see what kind of split we want to use, if any.
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1525 let l:cmd = 'edit '
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1526 if l:split == 1
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1527 let l:cmd = 'rightbelow split '
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1528 elseif l:split == 2
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1529 let l:cmd = 'rightbelow vsplit '
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1530 elseif l:split == 3
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1531 let l:cmd = 'tabedit '
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1532 endif
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1533
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1534 " All good now, proceed.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1535 if l:target_winnr > 0
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1536 execute l:target_winnr . "wincmd w"
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1537 endif
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1538 execute 'keepalt ' . l:cmd . fnameescape(l:special)
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1539
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1540 " Set the reuse ID if we had one.
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1541 if l:reuse_id != ''
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1542 call s:trace("Setting reuse ID '".l:reuse_id."' on buffer: ".bufnr('%'))
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1543 call setbufvar('%', l:reuse_id, 1)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1544 endif
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1545 endfunction
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1546
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1547 call s:AddMainCommand("-nargs=* Hgdiffsum :call s:HgDiffSummary('%:p', 0, <f-args>)")
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1548 call s:AddMainCommand("-nargs=* Hgdiffsumsplit :call s:HgDiffSummary('%:p', 1, <f-args>)")
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1549 call s:AddMainCommand("-nargs=* Hgvdiffsumsplit :call s:HgDiffSummary('%:p', 2, <f-args>)")
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1550 call s:AddMainCommand("-nargs=* Hgtabdiffsum :call s:HgDiffSummary('%:p', 3, <f-args>)")
51
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1551
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1552 " }}}
671f5e18b515 Added "diff summary" commands to use `hg diff` instead of Vim's diff.
Ludovic Chabant <ludovic@chabant.com>
parents: 49
diff changeset
1553
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1554 " Hgcommit {{{
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1555
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1556 function! s:HgCommit(bang, vertical, callback, ...) abort
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1557 " Get the repo we'll be committing into.
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1558 let l:repo = s:hg_repo()
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1559
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1560 " Get the list of files to commit.
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1561 " It can either be several files passed as extra parameters, or an
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1562 " actual list passed as the first extra parameter.
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1563 let l:filenames = []
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1564 if a:0
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1565 let l:filenames = a:000
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1566 if a:0 == 1 && type(a:1) == type([])
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1567 let l:filenames = a:1
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1568 endif
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1569 endif
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1570
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1571 " Open a commit message file.
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1572 let l:commit_path = s:tempname('hg-editor-', '.txt')
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1573 let l:split = a:vertical ? 'vsplit' : 'split'
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1574 execute l:split . ' ' . l:commit_path
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1575 call append(0, ['', ''])
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1576 call append(2, split(s:HgCommit_GenerateMessage(l:repo, l:filenames), '\n'))
28
0cdfdab43907 `Hgcommit` now puts the cursor at the beginning of the commit message.
Ludovic Chabant <ludovic@chabant.com>
parents: 27
diff changeset
1577 call cursor(1, 1)
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1578
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1579 " Setup the auto-command that will actually commit on write/exit,
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1580 " and make the buffer delete itself on exit.
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1581 let b:mercurial_dir = l:repo.root_dir
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1582 let b:lawrencium_commit_files = l:filenames
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1583 if type(a:callback) == type([])
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1584 let b:lawrencium_commit_pre_callback = a:callback[0]
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1585 let b:lawrencium_commit_post_callback = a:callback[1]
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1586 let b:lawrencium_commit_abort_callback = a:callback[2]
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1587 else
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1588 let b:lawrencium_commit_pre_callback = 0
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1589 let b:lawrencium_commit_post_callback = a:callback
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1590 let b:lawrencium_commit_abort_callback = 0
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1591 endif
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1592 setlocal bufhidden=delete
53
b7caa6693c39 `Hglog` window improvements:
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
1593 setlocal filetype=hgcommit
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1594 if a:bang
15
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1595 autocmd BufDelete <buffer> call s:HgCommit_Execute(expand('<afile>:p'), 0)
f02e37f395ae Added ability to add files from the `hg status` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 14
diff changeset
1596 else
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1597 autocmd BufDelete <buffer> call s:HgCommit_Execute(expand('<afile>:p'), 1)
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1598 endif
31
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1599 " Make commands available.
3a0f7bb6ea64 Hgstatus window improvements and bug fixes:
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
1600 call s:DefineMainCommands()
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1601 endfunction
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1602
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1603 let s:hg_status_messages = {
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1604 \'M': 'modified',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1605 \'A': 'added',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1606 \'R': 'removed',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1607 \'C': 'clean',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1608 \'!': 'missing',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1609 \'?': 'not tracked',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1610 \'I': 'ignored',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1611 \' ': '',
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1612 \}
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1613
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1614 function! s:HgCommit_GenerateMessage(repo, filenames) abort
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1615 let l:msg = "HG: Enter commit message. Lines beginning with 'HG:' are removed.\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1616 let l:msg .= "HG: Leave message empty to abort commit.\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1617 let l:msg .= "HG: Write and quit buffer to proceed.\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1618 let l:msg .= "HG: --\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1619 let l:msg .= "HG: user: " . split(a:repo.RunCommand('showconfig ui.username'), '\n')[0] . "\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1620 let l:msg .= "HG: branch '" . split(a:repo.RunCommand('branch'), '\n')[0] . "'\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1621
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1622 execute 'lcd ' . fnameescape(a:repo.root_dir)
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1623 if len(a:filenames)
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1624 let l:status_lines = split(a:repo.RunCommand('status', a:filenames), "\n")
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1625 else
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1626 let l:status_lines = split(a:repo.RunCommand('status'), "\n")
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1627 endif
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1628 for l:line in l:status_lines
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1629 if l:line ==# ''
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1630 continue
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1631 endif
11
b4baab0a4a92 Made most regex use the 'very-magic' syntax.
Ludovic Chabant <ludovic@chabant.com>
parents: 10
diff changeset
1632 let l:type = matchstr(l:line, '\v^[MARC\!\?I ]')
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1633 let l:path = l:line[2:]
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1634 let l:msg .= "HG: " . s:hg_status_messages[l:type] . ' ' . l:path . "\n"
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1635 endfor
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1636
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1637 return l:msg
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1638 endfunction
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1639
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1640 function! s:HgCommit_Execute(log_file, show_output) abort
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1641 " Check if the user actually saved a commit message.
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1642 if !filereadable(a:log_file)
18
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
1643 call s:error("abort: Commit message not saved")
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1644 if exists('b:lawrencium_commit_abort_callback') &&
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1645 \type(b:lawrencium_commit_abort_callback) == type("") &&
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1646 \b:lawrencium_commit_abort_callback != ''
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1647 call s:trace("Executing abort callback: ".b:lawrencium_commit_abort_callback)
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1648 execute b:lawrencium_commit_abort_callback
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1649 endif
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1650 return
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1651 endif
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1652
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1653 " Execute a pre-callback if there is one.
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1654 if exists('b:lawrencium_commit_pre_callback') &&
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1655 \type(b:lawrencium_commit_pre_callback) == type("") &&
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1656 \b:lawrencium_commit_pre_callback != ''
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1657 call s:trace("Executing pre callback: ".b:lawrencium_commit_pre_callback)
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1658 execute b:lawrencium_commit_pre_callback
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1659 endif
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1660
12
a7bf37a97a1b Clean the 'HG:' lines from the commit message (apparently 'hg commit' doesn't do it with -o).
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
1661 call s:trace("Committing with log file: " . a:log_file)
a7bf37a97a1b Clean the 'HG:' lines from the commit message (apparently 'hg commit' doesn't do it with -o).
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
1662
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
1663 " Clean all the 'HG: ' lines.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
1664 let l:is_valid = s:clean_commit_file(a:log_file)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
1665 if !l:is_valid
18
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
1666 call s:error("abort: Empty commit message")
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
1667 return
4f04d5e052eb Abort commit if the commit message is empty.
Ludovic Chabant <ludovic@chabant.com>
parents: 17
diff changeset
1668 endif
12
a7bf37a97a1b Clean the 'HG:' lines from the commit message (apparently 'hg commit' doesn't do it with -o).
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
1669
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1670 " Get the repo and commit with the given message.
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1671 let l:repo = s:hg_repo()
33
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1672 let l:hg_args = ['-l', a:log_file]
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1673 call extend(l:hg_args, b:lawrencium_commit_files)
a5b2f8e4fb6c Changes to the `Hgstatus` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 32
diff changeset
1674 let l:output = l:repo.RunCommand('commit', l:hg_args)
16
724f6db3baa2 Don't show `hg commit` output if there's nothing to show.
Ludovic Chabant <ludovic@chabant.com>
parents: 15
diff changeset
1675 if a:show_output && l:output !~# '\v%^\s*%$'
724f6db3baa2 Don't show `hg commit` output if there's nothing to show.
Ludovic Chabant <ludovic@chabant.com>
parents: 15
diff changeset
1676 call s:trace("Output from hg commit:", 1)
17
5c6c605d0660 Better output for `hg commit`.
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
1677 for l:output_line in split(l:output, '\n')
5c6c605d0660 Better output for `hg commit`.
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
1678 echom l:output_line
5c6c605d0660 Better output for `hg commit`.
Ludovic Chabant <ludovic@chabant.com>
parents: 16
diff changeset
1679 endfor
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1680 endif
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1681
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1682 " Execute a post-callback if there is one.
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1683 if exists('b:lawrencium_commit_post_callback') &&
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1684 \type(b:lawrencium_commit_post_callback) == type("") &&
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1685 \b:lawrencium_commit_post_callback != ''
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1686 call s:trace("Executing post callback: ".b:lawrencium_commit_post_callback)
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1687 execute b:lawrencium_commit_post_callback
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1688 endif
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1689 endfunction
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1690
106
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1691 call s:AddMainCommand("-bang -nargs=* -complete=customlist,s:ListRepoFiles Hgcommit :call s:HgCommit(<bang>0, 0, 0, <f-args>)")
77f77b2c2738 Callback system for `Hgcommit` so we can refresh the `Hgstatus` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 105
diff changeset
1692 call s:AddMainCommand("-bang -nargs=* -complete=customlist,s:ListRepoFiles Hgvcommit :call s:HgCommit(<bang>0, 1, 0, <f-args>)")
10
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1693
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1694 " }}}
7d16084d40a9 Added 'Hgcommit' command (and this very change is committed with it!).
Ludovic Chabant <ludovic@chabant.com>
parents: 9
diff changeset
1695
37
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1696 " Hgrevert {{{
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1697
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1698 function! s:HgRevert(bang, ...) abort
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1699 " Get the files to revert.
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1700 let l:filenames = a:000
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1701 if a:0 == 0
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1702 let l:filenames = [ expand('%:p') ]
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1703 endif
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1704 if a:bang
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1705 call insert(l:filenames, '--no-backup', 0)
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1706 endif
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1707
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1708 " Get the repo and run the command.
37
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1709 let l:repo = s:hg_repo()
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1710 call l:repo.RunCommand('revert', l:filenames)
82
31801dcca77d Re-edit a reverted file to see the change.
Ludovic Chabant <ludovic@chabant.com>
parents: 81
diff changeset
1711
31801dcca77d Re-edit a reverted file to see the change.
Ludovic Chabant <ludovic@chabant.com>
parents: 81
diff changeset
1712 " Re-edit the file to see the change.
31801dcca77d Re-edit a reverted file to see the change.
Ludovic Chabant <ludovic@chabant.com>
parents: 81
diff changeset
1713 edit
37
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1714 endfunction
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1715
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1716 call s:AddMainCommand("-bang -nargs=* -complete=customlist,s:ListRepoFiles Hgrevert :call s:HgRevert(<bang>0, <f-args>)")
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1717
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1718 " }}}
9361f6b9e5a4 Added `Hgrevert` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 33
diff changeset
1719
119
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1720 " Hgremove {{{
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1721
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1722 function! s:HgRemove(bang, ...) abort
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1723 " Get the files to remove.
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1724 let l:filenames = a:000
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1725 if a:0 == 0
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1726 let l:filenames = [ expand('%:p') ]
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1727 endif
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1728 if a:bang
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1729 call insert(l:filenames, '--force', 0)
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1730 endif
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1731
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1732 " Get the repo and run the command.
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1733 let l:repo = s:hg_repo()
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1734 call l:repo.RunCommand('rm', l:filenames)
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1735
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1736 " Re-edit the file to see the change.
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1737 edit
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1738 endfunction
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1739
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1740 call s:AddMainCommand("-bang -nargs=* -complete=customlist,s:ListRepoFiles Hgremove :call s:HgRemove(<bang>0, <f-args>)")
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1741
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1742 " }}}
4ca40abecc2a Add `:Hgremove` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 117
diff changeset
1743
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1744 " Hglog, Hglogthis {{{
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1745
68
7afcd4d37062 Added vertical `Hglog` commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 67
diff changeset
1746 function! s:HgLog(vertical, ...) abort
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1747 " Get the file or directory to get the log from.
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1748 " (empty string is for the whole repository)
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1749 let l:repo = s:hg_repo()
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1750 if a:0 > 0 && matchstr(a:1, '\v-*') == ""
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1751 let l:path = l:repo.GetRelativePath(expand(a:1))
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1752 else
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
1753 let l:path = ''
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1754 endif
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1755
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1756 " Get the Lawrencium path for this `hg log`,
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1757 " open it in a preview window and jump to it.
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1758 if a:0 > 0 && l:path != ""
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1759 let l:log_opts = join(a:000[1:-1], ',')
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1760 else
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1761 let l:log_opts = join(a:000, ',')
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1762 endif
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1763
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1764 let l:log_path = l:repo.GetLawrenciumPath(l:path, 'log', l:log_opts)
68
7afcd4d37062 Added vertical `Hglog` commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 67
diff changeset
1765 if a:vertical
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1766 execute 'vertical pedit ' . fnameescape(l:log_path)
68
7afcd4d37062 Added vertical `Hglog` commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 67
diff changeset
1767 else
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1768 execute 'pedit ' . fnameescape(l:log_path)
68
7afcd4d37062 Added vertical `Hglog` commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 67
diff changeset
1769 endif
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
1770 wincmd P
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1771
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1772 " Add some other nice commands and mappings.
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1773 let l:is_file = (l:path != '' && filereadable(l:repo.GetFullPath(l:path)))
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1774 command! -buffer -nargs=* Hglogdiffsum :call s:HgLog_DiffSummary(1, <f-args>)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1775 command! -buffer -nargs=* Hglogvdiffsum :call s:HgLog_DiffSummary(2, <f-args>)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1776 command! -buffer -nargs=* Hglogtabdiffsum :call s:HgLog_DiffSummary(3, <f-args>)
92
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1777 command! -buffer -nargs=+ -complete=file Hglogexport :call s:HgLog_ExportPatch(<f-args>)
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1778 if l:is_file
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1779 command! -buffer Hglogrevedit :call s:HgLog_FileRevEdit()
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1780 command! -buffer -nargs=* Hglogdiff :call s:HgLog_Diff(0, <f-args>)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1781 command! -buffer -nargs=* Hglogvdiff :call s:HgLog_Diff(1, <f-args>)
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1782 command! -buffer -nargs=* Hglogtabdiff :call s:HgLog_Diff(2, <f-args>)
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1783 endif
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1784
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1785 if g:lawrencium_define_mappings
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1786 nnoremap <buffer> <silent> <C-U> :Hglogdiffsum<cr>
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1787 nnoremap <buffer> <silent> <C-H> :Hglogvdiffsum<cr>
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1788 nnoremap <buffer> <silent> <cr> :Hglogvdiffsum<cr>
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1789 nnoremap <buffer> <silent> q :bdelete!<cr>
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1790 if l:is_file
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1791 nnoremap <buffer> <silent> <C-E> :Hglogrevedit<cr>
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1792 nnoremap <buffer> <silent> <C-D> :Hglogtabdiff<cr>
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1793 nnoremap <buffer> <silent> <C-V> :Hglogvdiff<cr>
55
6a61724190ea Improvements to Lawrencium paths:
Ludovic Chabant <ludovic@chabant.com>
parents: 53
diff changeset
1794 endif
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1795 endif
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1796
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
1797 " Clean up when the log buffer is deleted.
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1798 let l:bufobj = s:buffer_obj()
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
1799 call l:bufobj.OnDelete('call s:HgLog_Delete(' . l:bufobj.nr . ')')
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
1800 endfunction
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
1801
65
e8f252a7ed9e Made the `Hglog` window use Lawrencium buffers:
Ludovic Chabant <ludovic@chabant.com>
parents: 64
diff changeset
1802 function! s:HgLog_Delete(bufnr)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1803 if g:lawrencium_auto_close_buffers
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1804 call s:delete_dependency_buffers('lawrencium_diff_for', a:bufnr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1805 call s:delete_dependency_buffers('lawrencium_rev_for', a:bufnr)
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
1806 endif
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1807 endfunction
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1808
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1809 function! s:HgLog_FileRevEdit()
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1810 let l:repo = s:hg_repo()
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1811 let l:bufobj = s:buffer_obj()
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1812 let l:rev = s:HgLog_GetSelectedRev()
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1813 let l:log_path = s:parse_lawrencium_path(l:bufobj.GetName())
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1814 let l:path = l:repo.GetLawrenciumPath(l:log_path['path'], 'rev', l:rev)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1815
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1816 " Go to the window we were in before going in the log window,
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1817 " and open the revision there.
48
85e39bdd7089 Lots of changes that should have gone in other commits (ugh):
Ludovic Chabant <ludovic@chabant.com>
parents: 46 47
diff changeset
1818 wincmd p
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1819 call s:edit_deletable_buffer('lawrencium_rev_for', l:bufobj.nr, l:path)
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1820 endfunction
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1821
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1822 function! s:HgLog_Diff(split, ...) abort
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1823 let l:revs = []
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1824 if a:0 >= 2
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1825 let l:revs = [a:1, a:2]
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1826 elseif a:0 == 1
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1827 let l:revs = ['p1('.a:1.')', a:1]
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1828 else
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1829 let l:sel = s:HgLog_GetSelectedRev()
107
6846e12f8ec8 Improvements for the `Hgdiff` family of commands
Ludovic Chabant <ludovic@chabant.com>
parents: 106
diff changeset
1830 let l:revs = ['p1('.l:sel.')', l:sel]
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1831 endif
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1832
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1833 let l:repo = s:hg_repo()
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1834 let l:bufobj = s:buffer_obj()
66
75e9d909758a `Hglog` changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
1835 let l:log_path = s:parse_lawrencium_path(l:bufobj.GetName())
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1836 let l:path = l:repo.GetFullPath(l:log_path['path'])
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1837
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1838 " Go to the window we were in before going to the log window,
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1839 " and open the split diff there.
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1840 if a:split < 2
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1841 wincmd p
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1842 endif
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1843 call s:HgDiff(l:path, a:split, l:revs)
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1844 endfunction
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1845
87
e688b658ce5b Add variants of existing commands that open things in a new tab page.
Ludovic Chabant <ludovic@chabant.com>
parents: 86
diff changeset
1846 function! s:HgLog_DiffSummary(split, ...) abort
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1847 let l:revs = []
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1848 if a:0 >= 2
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1849 let l:revs = [a:1, a:2]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1850 elseif a:0 == 1
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1851 let l:revs = [a:1]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1852 else
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1853 let l:revs = [s:HgLog_GetSelectedRev()]
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1854 endif
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1855
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1856 let l:repo = s:hg_repo()
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1857 let l:bufobj = s:buffer_obj()
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1858 let l:log_path = s:parse_lawrencium_path(l:bufobj.GetName())
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1859 let l:path = l:repo.GetFullPath(l:log_path['path'])
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1860
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1861 " Go to the window we were in before going in the log window,
73
785d1a1faa6c Changes and fixes to the `Hglog` window:
Ludovic Chabant <ludovic@chabant.com>
parents: 72
diff changeset
1862 " and split for the diff summary from there.
101
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1863 let l:reuse_id = 'lawrencium_diffsum_for_' . bufnr('%')
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1864 let l:split_prev_win = (a:split < 3)
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1865 let l:args = {'reuse_id': l:reuse_id, 'use_prev_win': l:split_prev_win,
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1866 \'split_mode': a:split}
2078a8b475c2 More advanced way to know what window to pick to show a diff summary.
Ludovic Chabant <ludovic@chabant.com>
parents: 100
diff changeset
1867 call s:HgDiffSummary(l:path, l:args, l:revs)
49
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1868 endfunction
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1869
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1870 function! s:HgLog_GetSelectedRev(...) abort
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1871 if a:0 == 1
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1872 let l:line = getline(a:1)
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1873 else
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1874 let l:line = getline('.')
dffb41c2067c Lawrencium files changes:
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
1875 endif
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1876 " Behold, Vim's look-ahead regex syntax again! WTF.
53
b7caa6693c39 `Hglog` window improvements:
Ludovic Chabant <ludovic@chabant.com>
parents: 52
diff changeset
1877 let l:rev = matchstr(l:line, '\v^(\d+)(\:)@=')
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1878 if l:rev == ''
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1879 call s:throw("Can't parse revision number from line: " . l:line)
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1880 endif
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1881 return l:rev
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1882 endfunction
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1883
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1884 function! s:HgLog_ExportPatch(...) abort
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1885 let l:patch_name = a:1
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1886 if !empty($HG_EXPORT_PATCH_DIR)
92
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1887 " Use the patch dir only if user has specified a relative path
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1888 if has('win32')
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1889 let l:is_patch_relative = (matchstr(l:patch_name, '\v^([a-zA-Z]:)?\\') == "")
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1890 else
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1891 let l:is_patch_relative = (matchstr(l:patch_name, '\v^/') == "")
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1892 endif
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1893 if l:is_patch_relative
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1894 let l:patch_name = s:normalizepath(
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1895 s:stripslash($HG_EXPORT_PATCH_DIR) . "/" . l:patch_name)
e856f8dc22a8 `Hglogexport` uses relative paths correctly on Windows, auto-completes to files.
Ludovic Chabant <ludovic@chabant.com>
parents: 91
diff changeset
1896 endif
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1897 endif
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1898
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1899 if a:0 == 2
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1900 let l:rev = a:2
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1901 else
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1902 let l:rev = s:HgLog_GetSelectedRev()
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1903 endif
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1904
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1905 let l:repo = s:hg_repo()
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1906 let l:export_args = ['-o', l:patch_name, '-r', l:rev]
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1907
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1908 call l:repo.RunCommand('export', l:export_args)
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1909
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1910 echom "Created patch: " . l:patch_name
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1911 endfunction
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1912
68
7afcd4d37062 Added vertical `Hglog` commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 67
diff changeset
1913 call s:AddMainCommand("Hglogthis :call s:HgLog(0, '%:p')")
7afcd4d37062 Added vertical `Hglog` commands.
Ludovic Chabant <ludovic@chabant.com>
parents: 67
diff changeset
1914 call s:AddMainCommand("Hgvlogthis :call s:HgLog(1, '%:p')")
91
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1915 call s:AddMainCommand("-nargs=* -complete=customlist,s:ListRepoFiles Hglog :call s:HgLog(0, <f-args>)")
e21a1819ab27 New command to export a patch and allow existing log command to take options.
Kannan Rajah <krajah@maprtech.com>
parents: 90
diff changeset
1916 call s:AddMainCommand("-nargs=* -complete=customlist,s:ListRepoFiles Hgvlog :call s:HgLog(1, <f-args>)")
45
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1917
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1918 " }}}
ea0ae8f6af81 Added `Hglog` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 44
diff changeset
1919
96
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1920 " Hgannotate, Hgwannotate {{{
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1921
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1922 function! s:HgAnnotate(bang, verbose, ...) abort
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1923 " Open the file to annotate if needed.
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1924 if a:0 > 0
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1925 call s:HgEdit(a:bang, a:1)
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1926 endif
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1927
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1928 " Get the Lawrencium path for the annotated file.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1929 let l:path = expand('%:p')
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1930 let l:bufnr = bufnr('%')
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1931 let l:repo = s:hg_repo()
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1932 let l:value = a:verbose ? 'v=1' : ''
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1933 let l:annotation_path = l:repo.GetLawrenciumPath(l:path, 'annotate', l:value)
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1934
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1935 " Check if we're trying to annotate something with local changes.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1936 let l:has_local_edits = 0
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1937 let l:path_status = l:repo.RunCommand('status', l:path)
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1938 if l:path_status != ''
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1939 call s:trace("Found local edits for '" . l:path . "'. Will annotate parent revision.")
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1940 let l:has_local_edits = 1
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1941 endif
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1942
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1943 if l:has_local_edits
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1944 " Just open the output of the command.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1945 echom "Local edits found, will show the annotations for the parent revision."
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1946 execute 'edit ' . fnameescape(l:annotation_path)
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1947 setlocal nowrap nofoldenable
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1948 setlocal filetype=hgannotate
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1949 else
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1950 " Store some info about the current buffer.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1951 let l:cur_topline = line('w0') + &scrolloff
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1952 let l:cur_line = line('.')
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1953 let l:cur_wrap = &wrap
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1954 let l:cur_foldenable = &foldenable
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1955
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1956 " Open the annotated file in a split buffer on the left, after
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1957 " having disabled wrapping and folds on the current file.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1958 " Make both windows scroll-bound.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1959 setlocal scrollbind nowrap nofoldenable
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
1960 execute 'keepalt leftabove vsplit ' . fnameescape(l:annotation_path)
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1961 setlocal nonumber
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1962 setlocal scrollbind nowrap nofoldenable foldcolumn=0
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1963 setlocal filetype=hgannotate
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1964
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1965 " When the annotated buffer is deleted, restore the settings we
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1966 " changed on the current buffer, and go back to that buffer.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1967 let l:annotate_buffer = s:buffer_obj()
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1968 call l:annotate_buffer.OnDelete('execute bufwinnr(' . l:bufnr . ') . "wincmd w"')
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1969 call l:annotate_buffer.OnDelete('setlocal noscrollbind')
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1970 if l:cur_wrap
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1971 call l:annotate_buffer.OnDelete('setlocal wrap')
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1972 endif
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1973 if l:cur_foldenable
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1974 call l:annotate_buffer.OnDelete('setlocal foldenable')
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1975 endif
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1976
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1977 " Go to the line we were at in the source buffer when we
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
1978 " opened the annotation window.
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1979 execute l:cur_topline
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1980 normal! zt
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1981 execute l:cur_line
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1982 syncbind
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1983
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1984 " Set the correct window width for the annotations.
96
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1985 if a:verbose
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1986 let l:last_token = match(getline('.'), '\v\d{4}:\s')
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1987 let l:token_end = 5
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1988 else
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1989 let l:last_token = match(getline('.'), '\v\d{2}:\s')
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1990 let l:token_end = 3
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1991 endif
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1992 if l:last_token < 0
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1993 echoerr "Can't find the end of the annotation columns."
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1994 else
96
1ea783dd06dd Fix typo bug, annotate window width.
Ludovic Chabant <ludovic@chabant.com>
parents: 95
diff changeset
1995 let l:column_count = l:last_token + l:token_end + g:lawrencium_annotate_width_offset
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1996 execute "vertical resize " . l:column_count
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1997 setlocal winfixwidth
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
1998 endif
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
1999 endif
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2000
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2001 " Make the annotate buffer a Lawrencium buffer.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2002 let b:mercurial_dir = l:repo.root_dir
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2003 let b:lawrencium_annotated_path = l:path
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2004 let b:lawrencium_annotated_bufnr = l:bufnr
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2005 call s:DefineMainCommands()
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2006
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2007 " Add some other nice commands and mappings.
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2008 command! -buffer Hgannotatediffsum :call s:HgAnnotate_DiffSummary()
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2009 if g:lawrencium_define_mappings
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2010 nnoremap <buffer> <silent> <cr> :Hgannotatediffsum<cr>
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2011 endif
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2012
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2013 " Clean up when the annotate buffer is deleted.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2014 let l:bufobj = s:buffer_obj()
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2015 call l:bufobj.OnDelete('call s:HgAnnotate_Delete(' . l:bufobj.nr . ')')
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2016 endfunction
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2017
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2018 function! s:HgAnnotate_Delete(bufnr) abort
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2019 if g:lawrencium_auto_close_buffers
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2020 call s:delete_dependency_buffers('lawrencium_diff_for', a:bufnr)
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2021 endif
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2022 endfunction
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2023
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2024 function! s:HgAnnotate_DiffSummary() abort
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2025 " Get the path for the diff of the revision specified under the cursor.
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2026 let l:line = getline('.')
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2027 let l:rev_hash = matchstr(l:line, '\v[a-f0-9]{12}')
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2028
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2029 " Get the Lawrencium path for the diff, and the buffer object for the
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2030 " annotation.
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2031 let l:repo = s:hg_repo()
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2032 let l:path = l:repo.GetLawrenciumPath(b:lawrencium_annotated_path, 'diff', l:rev_hash)
61
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2033 let l:annotate_buffer = s:buffer_obj()
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2034
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2035 " Find a window already displaying diffs for this annotation.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2036 let l:diff_winnr = s:find_buffer_window('lawrencium_diff_for', l:annotate_buffer.nr)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2037 if l:diff_winnr == -1
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2038 " Not found... go back to the main source buffer and open a bottom
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2039 " split with the diff for the specified revision.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2040 execute bufwinnr(b:lawrencium_annotated_bufnr) . 'wincmd w'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2041 execute 'rightbelow split ' . fnameescape(l:path)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2042 let b:lawrencium_diff_for = l:annotate_buffer.nr
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2043 let b:lawrencium_quit_on_delete = 1
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2044 else
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2045 " Found! Use that window to open the diff.
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2046 execute l:diff_winnr . 'wincmd w'
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2047 execute 'edit ' . fnameescape(l:path)
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2048 let b:lawrencium_diff_for = l:annotate_buffer.nr
ea794e48d4e2 Better way to handle buffer actions:
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
2049 endif
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2050 endfunction
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2051
95
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
2052 call s:AddMainCommand("-bang -nargs=? -complete=customlist,s:ListRepoFiles Hgannotate :call s:HgAnnotate(<bang>0, 0, <f-args>)")
d38be34b403b `Hgannotate` improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 94
diff changeset
2053 call s:AddMainCommand("-bang -nargs=? -complete=customlist,s:ListRepoFiles Hgwannotate :call s:HgAnnotate(<bang>0, 1, <f-args>)")
59
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2054
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2055 " }}}
396da6e76952 Added `Hgannotate` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 58
diff changeset
2056
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2057 " Hgqseries {{{
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2058
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2059 function! s:HgQSeries() abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2060 " Open the MQ series in the preview window and jump to it.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2061 let l:repo = s:hg_repo()
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2062 let l:path = l:repo.GetLawrenciumPath('', 'qseries', '')
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
2063 execute 'pedit ' . fnameescape(l:path)
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2064 wincmd P
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2065
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2066 " Make the series buffer a Lawrencium buffer.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2067 let b:mercurial_dir = l:repo.root_dir
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2068 call s:DefineMainCommands()
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2069
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2070 " Add some commands and mappings.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2071 command! -buffer Hgqseriesgoto :call s:HgQSeries_Goto()
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2072 command! -buffer Hgqserieseditmessage :call s:HgQSeries_EditMessage()
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2073 command! -buffer -nargs=+ Hgqseriesrename :call s:HgQSeries_Rename(<f-args>)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2074 if g:lawrencium_define_mappings
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2075 nnoremap <buffer> <silent> <C-g> :Hgqseriesgoto<cr>
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2076 nnoremap <buffer> <silent> <C-e> :Hgqserieseditmessage<cr>
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2077 nnoremap <buffer> <silent> q :bdelete!<cr>
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2078 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2079 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2080
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2081 function! s:HgQSeries_GetCurrentPatchName() abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2082 let l:pos = getpos('.')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2083 return getbufvar('%', 'lawrencium_patchname_' . l:pos[1])
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2084 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2085
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2086 function! s:HgQSeries_Goto() abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2087 let l:repo = s:hg_repo()
78
e42f813b4a39 Fixed some bugs with the `Hgqseries` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
2088 let l:patchname = s:HgQSeries_GetCurrentPatchName()
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2089 if len(l:patchname) == 0
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2090 call s:error("No patch to go to here.")
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2091 return
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2092 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2093 call l:repo.RunCommand('qgoto', l:patchname)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2094 edit
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2095 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2096
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2097 function! s:HgQSeries_Rename(...) abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2098 let l:repo = s:hg_repo()
78
e42f813b4a39 Fixed some bugs with the `Hgqseries` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
2099 let l:current_name = s:HgQSeries_GetCurrentPatchName()
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2100 if len(l:current_name) == 0
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2101 call s:error("No patch to rename here.")
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2102 return
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2103 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2104 let l:new_name = '"' . join(a:000, ' ') . '"'
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2105 call l:repo.RunCommand('qrename', l:current_name, l:new_name)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2106 edit
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2107 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2108
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2109 function! s:HgQSeries_EditMessage() abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2110 let l:repo = s:hg_repo()
78
e42f813b4a39 Fixed some bugs with the `Hgqseries` window.
Ludovic Chabant <ludovic@chabant.com>
parents: 76
diff changeset
2111 let l:patchname = getbufvar('%', 'lawrencium_patchname_top')
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2112 if len(l:patchname) == 0
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2113 call s:error("No patch to edit here.")
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2114 return
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2115 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2116 let l:current = split(l:repo.RunCommand('qheader', l:patchname), '\n')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2117
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2118 " Open a temp file to write the commit message.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2119 let l:temp_file = s:tempname('hg-qrefedit-', '.txt')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2120 split
122
a9136d95cf47 Escape paths to fix issues with repository paths with spaces in them.
Ludovic Chabant <ludovic@chabant.com>
parents: 121
diff changeset
2121 execute 'edit ' . fnameescape(l:temp_file)
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2122 call append(0, 'HG: Enter the new commit message for patch "' . l:patchname . '" here.\n')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2123 call append(0, '')
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2124 call append(0, l:current)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2125 call cursor(1, 1)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2126
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2127 " Make it a temp buffer that will actually change the commit message
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2128 " when it is saved and closed.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2129 let b:mercurial_dir = l:repo.root_dir
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2130 let b:lawrencium_patchname = l:patchname
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2131 setlocal bufhidden=delete
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2132 setlocal filetype=hgcommit
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2133 autocmd BufDelete <buffer> call s:HgQSeries_EditMessage_Execute(expand('<afile>:p'))
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2134
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2135 call s:DefineMainCommands()
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2136 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2137
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2138 function! s:HgQSeries_EditMessage_Execute(log_file) abort
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2139 if !filereadable(a:log_file)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2140 call s:error("abort: Commit message not saved")
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2141 return
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2142 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2143
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2144 " Clean all the 'HG:' lines.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2145 let l:is_valid = s:clean_commit_file(a:log_file)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2146 if !l:is_valid
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2147 call s:error("abort: Empty commit message")
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2148 return
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2149 endif
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2150
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2151 " Get the repo and edit the given patch.
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2152 let l:repo = s:hg_repo()
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2153 let l:hg_args = ['-s', '-l', a:log_file]
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2154 call l:repo.RunCommand('qref', l:hg_args)
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2155 endfunction
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2156
108
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2157 call s:AddMainCommand("Hgqseries call s:HgQSeries()")
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2158
108
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2159 " }}}
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2160
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2161 " Hgrecord {{{
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2162
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2163 function! s:HgRecord(split) abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2164 let l:repo = s:hg_repo()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2165 let l:orig_buf = s:buffer_obj()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2166 let l:tmp_path = l:orig_buf.GetName(':p') . '~record'
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2167 let l:diff_id = localtime()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2168
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2169 " Start diffing on the current file, enable some commands.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2170 call l:orig_buf.DefineCommand('Hgrecordabort', ':call s:HgRecord_Abort()')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2171 call l:orig_buf.DefineCommand('Hgrecordcommit', ':call s:HgRecord_Execute()')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2172 call s:HgDiff_DiffThis(l:diff_id)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2173 setlocal foldmethod=marker
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2174
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2175 " Split the window and open the parent revision in the right or bottom
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2176 " window. Keep the current buffer in the left or top window... we're going
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2177 " to 'move' those changes into the parent revision.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2178 let l:cmd = 'keepalt rightbelow split '
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2179 if a:split == 1
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2180 let l:cmd = 'keepalt rightbelow vsplit '
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2181 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2182 let l:rev_path = l:repo.GetLawrenciumPath(expand('%'), 'rev', '')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2183 execute l:cmd . fnameescape(l:rev_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2184
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2185 " This new buffer with the parent revision is set as a Lawrencium buffer.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2186 " Let's save it to an actual file and reopen it like that (somehow we
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2187 " could probably do it with `:saveas` instead but we'd need to reset a
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2188 " bunch of other buffer settings, and Vim weirdly creates another backup
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2189 " buffer when you do that).
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2190 execute 'keepalt write! ' . fnameescape(l:tmp_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2191 execute 'keepalt edit! ' . fnameescape(l:tmp_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2192 setlocal bufhidden=delete
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2193 let b:mercurial_dir = l:repo.root_dir
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2194 let b:lawrencium_record_for = l:orig_buf.GetName(':p')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2195 let b:lawrencium_record_other_nr = l:orig_buf.nr
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2196 let b:lawrencium_record_commit_split = !a:split
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2197 call setbufvar(l:orig_buf.nr, 'lawrencium_record_for', '%')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2198 call setbufvar(l:orig_buf.nr, 'lawrencium_record_other_nr', bufnr('%'))
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2199
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2200 " Hookup the commit and abort commands.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2201 let l:rec_buf = s:buffer_obj()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2202 call l:rec_buf.OnDelete('call s:HgRecord_Execute()')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2203 call l:rec_buf.DefineCommand('Hgrecordcommit', ':quit')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2204 call l:rec_buf.DefineCommand('Hgrecordabort', ':call s:HgRecord_Abort()')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2205 call s:DefineMainCommands()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2206
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2207 " Make it the other part of the diff.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2208 call s:HgDiff_DiffThis(l:diff_id)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2209 setlocal foldmethod=marker
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2210 call l:rec_buf.SetVar('&filetype', l:orig_buf.GetVar('&filetype'))
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2211
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2212 if g:lawrencium_record_start_in_working_buffer
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2213 wincmd p
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2214 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2215 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2216
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2217 function! s:HgRecord_Execute() abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2218 if exists('b:lawrencium_record_abort')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2219 " Abort flag is set, let's just cleanup.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2220 let l:buf_nr = b:lawrencium_record_for == '%' ? bufnr('%') :
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2221 \b:lawrencium_record_other_nr
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2222 call s:HgRecord_CleanUp(l:buf_nr)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2223 call s:error("abort: User requested aborting the record operation.")
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2224 return
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2225 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2226
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2227 if !exists('b:lawrencium_record_for')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2228 call s:throw("This doesn't seem like a record buffer, something's wrong!")
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2229 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2230 if b:lawrencium_record_for == '%'
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2231 " Switch to the 'recording' buffer's window.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2232 let l:buf_obj = s:buffer_obj(b:lawrencium_record_other_nr)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2233 call l:buf_obj.MoveToFirstWindow()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2234 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2235
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2236 " Setup the commit operation.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2237 let l:split = b:lawrencium_record_commit_split
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2238 let l:working_bufnr = b:lawrencium_record_other_nr
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2239 let l:working_path = fnameescape(b:lawrencium_record_for)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2240 let l:record_path = fnameescape(expand('%:p'))
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2241 let l:callbacks = [
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2242 \'call s:HgRecord_PostExecutePre('.l:working_bufnr.', "'.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2243 \escape(l:working_path, '\').'", "'.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2244 \escape(l:record_path, '\').'")',
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2245 \'call s:HgRecord_PostExecutePost('.l:working_bufnr.', "'.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2246 \escape(l:working_path, '\').'")',
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2247 \'call s:HgRecord_PostExecuteAbort('.l:working_bufnr.', "'.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2248 \escape(l:record_path, '\').'")'
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2249 \]
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2250 call s:trace("Starting commit flow with callbacks: ".string(l:callbacks))
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2251 call s:HgCommit(0, l:split, l:callbacks, b:lawrencium_record_for)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2252 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2253
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2254 function! s:HgRecord_PostExecutePre(working_bufnr, working_path, record_path) abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2255 " Just before committing, we switch the original file with the record
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2256 " file... we'll restore things in the post-callback below.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2257 " We also switch on 'autoread' temporarily on the working buffer so that
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2258 " we don't have an annoying popup in gVim.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2259 if has('dialog_gui')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2260 call setbufvar(a:working_bufnr, '&autoread', 1)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2261 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2262 call s:trace("Backuping original file: ".a:working_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2263 silent call rename(a:working_path, a:working_path.'~working')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2264 call s:trace("Committing recorded changes using: ".a:record_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2265 silent call rename(a:record_path, a:working_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2266 sleep 200m
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2267 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2268
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2269 function! s:HgRecord_PostExecutePost(working_bufnr, working_path) abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2270 " Recover the back-up file from underneath the buffer.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2271 call s:trace("Recovering original file: ".a:working_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2272 silent call rename(a:working_path.'~working', a:working_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2273
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2274 " Clean up!
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2275 call s:HgRecord_CleanUp(a:working_bufnr)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2276
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2277 " Restore default 'autoread'.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2278 if has('dialog_gui')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2279 set autoread<
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2280 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2281 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2282
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2283 function! s:HgRecord_PostExecuteAbort(working_bufnr, record_path) abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2284 call s:HgRecord_CleanUp(a:working_bufnr)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2285 call s:trace("Delete discarded record file: ".a:record_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2286 silent call delete(a:record_path)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2287 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2288
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2289 function! s:HgRecord_Abort() abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2290 if b:lawrencium_record_for == '%'
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2291 " We're in the working directory buffer. Switch to the 'recording'
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2292 " buffer and quit.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2293 let l:buf_obj = s:buffer_obj(b:lawrencium_record_other_nr)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2294 call l:buf_obj.MoveToFirstWindow()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2295 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2296 " We're now in the 'recording' buffer... set the abort flag and quit,
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2297 " which will run the execution (it will early out and clean things up).
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2298 let b:lawrencium_record_abort = 1
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2299 quit!
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2300 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2301
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2302 function! s:HgRecord_CleanUp(buf_nr) abort
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2303 " Get in the original buffer and clean the local commands/variables.
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2304 let l:buf_obj = s:buffer_obj(a:buf_nr)
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2305 call l:buf_obj.MoveToFirstWindow()
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2306 if !exists('b:lawrencium_record_for') || b:lawrencium_record_for != '%'
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2307 call s:throw("Cleaning up something else than the original buffer ".
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2308 \"for a record operation. That's suspiciously incorrect! ".
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2309 \"Aborting.")
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2310 endif
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2311 call l:buf_obj.DeleteCommand('Hgrecordabort')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2312 call l:buf_obj.DeleteCommand('Hgrecordcommit')
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2313 unlet b:lawrencium_record_for
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2314 unlet b:lawrencium_record_other_nr
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2315 endfunction
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2316
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2317 call s:AddMainCommand("Hgrecord call s:HgRecord(0)")
497f7a481599 Added new `Hgrecord` command.
Ludovic Chabant <ludovic@chabant.com>
parents: 107
diff changeset
2318 call s:AddMainCommand("Hgvrecord call s:HgRecord(1)")
71
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2319
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2320 " }}}
1fbba48019b5 MQ support:
Ludovic Chabant <ludovic@chabant.com>
parents: 70
diff changeset
2321
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2322 " Autoload Functions {{{
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2323
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2324 " Prints a summary of the current repo (if any) that's appropriate for
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2325 " displaying on the status line.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2326 function! lawrencium#statusline(...)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2327 if !exists('b:mercurial_dir')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2328 return ''
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2329 endif
83
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2330 let l:repo = s:hg_repo()
5
3a4f9f41a7e2 Use a hackish shortcut to get the current branch faster for the statusline.
Ludovic Chabant <ludovic@chabant.com>
parents: 4
diff changeset
2331 let l:prefix = (a:0 > 0 ? a:1 : '')
3a4f9f41a7e2 Use a hackish shortcut to get the current branch faster for the statusline.
Ludovic Chabant <ludovic@chabant.com>
parents: 4
diff changeset
2332 let l:suffix = (a:0 > 1 ? a:2 : '')
30
35d097b9513c Fixed a bug with the status line indicator.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
2333 let l:branch = 'default'
83
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2334 let l:branch_file = l:repo.GetFullPath('.hg/branch')
30
35d097b9513c Fixed a bug with the status line indicator.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
2335 if filereadable(l:branch_file)
35d097b9513c Fixed a bug with the status line indicator.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
2336 let l:branch = readfile(l:branch_file)[0]
35d097b9513c Fixed a bug with the status line indicator.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
2337 endif
83
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2338 let l:bookmarks = ''
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2339 let l:bookmarks_file = l:repo.GetFullPath('.hg/bookmarks.current')
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2340 if filereadable(l:bookmarks_file)
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2341 let l:bookmarks = join(readfile(l:bookmarks_file), ', ')
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2342 endif
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2343 let l:line = l:prefix . l:branch
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2344 if strlen(l:bookmarks) > 0
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2345 let l:line = l:line . ' - ' . l:bookmarks
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2346 endif
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2347 let l:line = l:line . l:suffix
a383a816d975 Adding bookmark information to the status line.
Ludovic Chabant <ludovic@chabant.com>
parents: 82
diff changeset
2348 return l:line
0
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2349 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2350
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2351 " Rescans the current buffer for setting up Mercurial commands.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2352 " Passing '1' as the parameter enables debug traces temporarily.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2353 function! lawrencium#rescan(...)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2354 if exists('b:mercurial_dir')
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2355 unlet b:mercurial_dir
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2356 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2357 if a:0 && a:1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2358 let l:trace_backup = g:lawrencium_trace
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2359 let g:lawrencium_trace = 1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2360 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2361 call s:setup_buffer_commands()
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2362 if a:0 && a:1
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2363 let g:lawrencium_trace = l:trace_backup
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2364 endif
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2365 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2366
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2367 " Enables/disables the debug trace.
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2368 function! lawrencium#debugtrace(...)
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2369 let g:lawrencium_trace = (a:0 == 0 || (a:0 && a:1))
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2370 echom "Lawrencium debug trace is now " . (g:lawrencium_trace ? "enabled." : "disabled.")
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2371 endfunction
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2372
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2373 " }}}
0a5b490dc35d Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2374