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