annotate plugin/lawrencium.vim @ 125:bbb19d37c681

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