annotate plugin/lawrencium.vim @ 132:c04855b6f318

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