Mercurial > vim-lawrencium
annotate autoload/lawrencium.vim @ 151:59c51f0d6008
Fix indenting
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 08 Nov 2021 10:35:02 -0800 |
parents | 06f4d2c01fd6 |
children | 62e054a2c4f0 |
rev | line source |
---|---|
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 " Path Utility {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 " Strips the ending slash in a path. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 function! lawrencium#stripslash(path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 return fnamemodify(a:path, ':s?[/\\]$??') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 " Returns whether a path is absolute. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 function! lawrencium#isabspath(path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 return a:path =~# '\v^(\w\:)?[/\\]' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 " Normalizes the slashes in a path. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 function! lawrencium#normalizepath(path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 if exists('+shellslash') && &shellslash |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 return substitute(a:path, '\v/', '\\', 'g') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 elseif has('win32') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 return substitute(a:path, '\v/', '\\', 'g') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 return a:path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 " Shell-slashes the path (opposite of `normalizepath`). |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 function! lawrencium#shellslash(path) |
147 | 27 if exists('+shellslash') && !&shellslash |
28 return substitute(a:path, '\v\\', '/', 'g') | |
29 else | |
30 return a:path | |
31 endif | |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 " Like tempname() but with some control over the filename. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 function! lawrencium#tempname(name, ...) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 let l:path = tempname() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 let l:result = fnamemodify(l:path, ':h') . '/' . a:name . fnamemodify(l:path, ':t') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 if a:0 > 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 let l:result = l:result . a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 return l:result |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 " Delete a temporary file if it exists. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 function! lawrencium#clean_tempfile(path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 if filewritable(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 call lawrencium#trace("Cleaning up temporary file: " . a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 call delete(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 " Logging {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 " Prints a message if debug tracing is enabled. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 function! lawrencium#trace(message, ...) |
151 | 58 if g:lawrencium_trace || (a:0 && a:1) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 let l:message = "lawrencium: " . a:message |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 echom l:message |
151 | 61 endif |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 " Prints an error message with 'lawrencium error' prefixed to it. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 function! lawrencium#error(message) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 echom "lawrencium error: " . a:message |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 " Throw a Lawrencium exception message. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 function! lawrencium#throw(message) |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
71 throw "lawrencium: " . a:message |
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
72 endfunction |
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
73 |
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
74 " Throw a Lawrencium exception message and set Vim's error message. |
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
75 function! lawrencium#throwerr(message) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 let v:errmsg = "lawrencium: " . a:message |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 throw v:errmsg |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 " Repositories {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 " Finds the repository root given a path inside that repository. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 " Throw an error if not repository is found. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 function! lawrencium#find_repo_root(path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 let l:path = lawrencium#stripslash(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 let l:previous_path = "" |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 while l:path != l:previous_path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 if isdirectory(l:path . '/.hg') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 return lawrencium#normalizepath(simplify(fnamemodify(l:path, ':p'))) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 let l:previous_path = l:path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 let l:path = fnamemodify(l:path, ':h') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 endwhile |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 call lawrencium#throw("No Mercurial repository found above: " . a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 " Given a Lawrencium path (e.g: 'lawrencium:///repo/root_dir//foo/bar/file.py//rev=34'), extract |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 " the repository root, relative file path and revision number/changeset ID. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 " |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 " If a second argument exists, it must be: |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 " - `relative`: to make the file path relative to the repository root. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 " - `absolute`: to make the file path absolute. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 " |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 function! lawrencium#parse_lawrencium_path(lawrencium_path, ...) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 let l:repo_path = lawrencium#shellslash(a:lawrencium_path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 let l:repo_path = substitute(l:repo_path, '\\ ', ' ', 'g') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 if l:repo_path =~? '\v^lawrencium://' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 let l:repo_path = strpart(l:repo_path, strlen('lawrencium://')) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 let l:root_dir = '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 let l:at_idx = stridx(l:repo_path, '//') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 if l:at_idx >= 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 let l:root_dir = strpart(l:repo_path, 0, l:at_idx) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 let l:repo_path = strpart(l:repo_path, l:at_idx + 2) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 let l:value = '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 let l:action = '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 let l:actionidx = stridx(l:repo_path, '//') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 if l:actionidx >= 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 let l:action = strpart(l:repo_path, l:actionidx + 2) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 let l:repo_path = strpart(l:repo_path, 0, l:actionidx) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 let l:equalidx = stridx(l:action, '=') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 if l:equalidx >= 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 let l:value = strpart(l:action, l:equalidx + 1) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 let l:action = strpart(l:action, 0, l:equalidx) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 if a:0 > 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 execute 'cd! ' . fnameescape(l:root_dir) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 if a:1 == 'relative' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 let l:repo_path = fnamemodify(l:repo_path, ':.') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 elseif a:1 == 'absolute' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 let l:repo_path = fnamemodify(l:repo_path, ':p') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 execute 'cd! -' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 let l:result = { 'root': l:root_dir, 'path': l:repo_path, 'action': l:action, 'value': l:value } |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 return l:result |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 " Clean up all the 'HG:' lines from a commit message, and see if there's |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 " any message left (Mercurial does this automatically, usually, but |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 " apparently not when you feed it a log file...). |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 function! lawrencium#clean_commit_file(log_file) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 let l:lines = readfile(a:log_file) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 call filter(l:lines, "v:val !~# '\\v^HG:'") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 if len(filter(copy(l:lines), "v:val !~# '\\v^\\s*$'")) == 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 return 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 call writefile(l:lines, a:log_file) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 return 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 " Vim Utility {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 " Finds a window whose displayed buffer has a given variable |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 " set to the given value. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 function! lawrencium#find_buffer_window(varname, varvalue) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 for wnr in range(1, winnr('$')) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 let l:bnr = winbufnr(wnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 if getbufvar(l:bnr, a:varname) == a:varvalue |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 return l:wnr |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 return -1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 " Opens a buffer in a way that makes it easy to delete it later: |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 " - if the about-to-be previous buffer doesn't have a given variable, |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 " just open the new buffer. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 " - if the about-to-be previous buffer has a given variable, open the |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 " new buffer with the `keepalt` option to make it so that the |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 " actual previous buffer (returned by things like `bufname('#')`) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 " is the original buffer that was there before the first deletable |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 " buffer was opened. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 function! lawrencium#edit_deletable_buffer(varname, varvalue, path) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 let l:edit_cmd = 'edit ' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 if getbufvar('%', a:varname) != '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 let l:edit_cmd = 'keepalt edit ' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 execute l:edit_cmd . fnameescape(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 call setbufvar('%', a:varname, a:varvalue) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 " Deletes all buffers that have a given variable set to a given value. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 " For each buffer, if it is not shown in any window, it will be just deleted. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 " If it is shown in a window, that window will be switched to the alternate |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 " buffer before the buffer is deleted, unless the `lawrencium_quit_on_delete` |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 " variable is set to `1`, in which case the window is closed too. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 function! lawrencium#delete_dependency_buffers(varname, varvalue) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 let l:cur_winnr = winnr() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 for bnr in range(1, bufnr('$')) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 if getbufvar(bnr, a:varname) == a:varvalue |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 " Delete this buffer if it is not shown in any window. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 " Otherwise, display the alternate buffer before deleting |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 " it so the window is not closed. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 let l:bwnr = bufwinnr(bnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 if l:bwnr < 0 || getbufvar(bnr, 'lawrencium_quit_on_delete') == 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 if bufloaded(l:bnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 call lawrencium#trace("Deleting dependency buffer " . bnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 execute "bdelete! " . bnr |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 call lawrencium#trace("Dependency buffer " . bnr . " is already unladed.") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 execute l:bwnr . "wincmd w" |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 " TODO: better handle case where there's no previous/alternate buffer? |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 let l:prev_bnr = bufnr('#') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 if l:prev_bnr > 0 && bufloaded(l:prev_bnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 execute "buffer " . l:prev_bnr |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 if bufloaded(l:bnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 call lawrencium#trace("Deleting dependency buffer " . bnr . " after switching to " . l:prev_bnr . " in window " . l:bwnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 execute "bdelete! " . bnr |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
223 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 call lawrencium#trace("Dependency buffer " . bnr . " is unladed after switching to " . l:prev_bnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
227 call lawrencium#trace("Deleting dependency buffer " . bnr . " and window.") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
228 bdelete! |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
229 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
231 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
232 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 if l:cur_winnr != winnr() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 call lawrencium#trace("Returning to window " . l:cur_winnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 execute l:cur_winnr . "wincmd w" |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 " Mercurial Repository Object {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 " Let's define a Mercurial repo 'class' using prototype-based object-oriented |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 " programming. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 " |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 " The prototype dictionary. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 let s:HgRepo = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
249 " Constructor. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
250 function! s:HgRepo.New(path) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 let l:newRepo = copy(self) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
252 let l:newRepo.root_dir = lawrencium#find_repo_root(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
253 call lawrencium#trace("Built new Mercurial repository object at : " . l:newRepo.root_dir) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
254 return l:newRepo |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
256 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
257 " Gets a full path given a repo-relative path. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 function! s:HgRepo.GetFullPath(path) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
259 let l:root_dir = self.root_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
260 if lawrencium#isabspath(a:path) |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
261 call lawrencium#throwerr("Expected relative path, got absolute path: " . a:path) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 return lawrencium#normalizepath(l:root_dir . a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 " Gets a repo-relative path given any path. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 function! s:HgRepo.GetRelativePath(path) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 execute 'lcd! ' . fnameescape(self.root_dir) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
269 let l:relative_path = fnamemodify(a:path, ':.') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 execute 'lcd! -' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 return l:relative_path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
274 " Gets, and optionally creates, a temp folder for some operation in the `.hg` |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 " directory. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 function! s:HgRepo.GetTempDir(path, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 let l:tmp_dir = self.GetFullPath('.hg/lawrencium/' . a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 if !isdirectory(l:tmp_dir) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 if a:0 > 0 && !a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 return '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 call mkdir(l:tmp_dir, 'p') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
283 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 return l:tmp_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
287 " Gets a list of files matching a root-relative pattern. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 " If a flag is passed and is TRUE, a slash will be appended to all |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 " directories. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 function! s:HgRepo.Glob(pattern, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 let l:root_dir = self.root_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 if (a:pattern =~# '\v^[/\\]') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 let l:root_dir = lawrencium#stripslash(l:root_dir) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 let l:matches = split(glob(l:root_dir . a:pattern), '\n') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 if a:0 && a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 for l:idx in range(len(l:matches)) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
298 if !filereadable(l:matches[l:idx]) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
299 let l:matches[l:idx] = l:matches[l:idx] . '/' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 let l:strip_len = len(l:root_dir) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 call map(l:matches, 'v:val[l:strip_len : -1]') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 return l:matches |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 " Gets a full Mercurial command. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 function! s:HgRepo.GetCommand(command, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 " If there's only one argument, and it's a list, then use that as the |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 " argument list. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
312 let l:arg_list = a:000 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 if a:0 == 1 && type(a:1) == type([]) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 let l:arg_list = a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 let l:prev_shellslash = &shellslash |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 setlocal noshellslash |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 let l:hg_command = g:lawrencium_hg_executable . ' --repository ' . shellescape(lawrencium#stripslash(self.root_dir)) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 let l:hg_command = l:hg_command . ' ' . a:command |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 for l:arg in l:arg_list |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 let l:hg_command = l:hg_command . ' ' . shellescape(l:arg) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 if l:prev_shellslash |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 setlocal shellslash |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 return l:hg_command |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
327 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
328 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
329 " Runs a Mercurial command in the repo. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
330 function! s:HgRepo.RunCommand(command, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
331 let l:all_args = [1, a:command] + a:000 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
332 return call(self['RunCommandEx'], l:all_args, self) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
333 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
334 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
335 function! s:HgRepo.RunCommandEx(plain_mode, command, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
336 let l:prev_hgplain = $HGPLAIN |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 if a:plain_mode |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 let $HGPLAIN = 'true' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 let l:all_args = [a:command] + a:000 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
341 let l:hg_command = call(self['GetCommand'], l:all_args, self) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 call lawrencium#trace("Running Mercurial command: " . l:hg_command) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 let l:cmd_out = system(l:hg_command) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 if a:plain_mode |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
345 let $HGPLAIN = l:prev_hgplain |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 return l:cmd_out |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
349 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 " Runs a Mercurial command in the repo and reads its output into the current |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 " buffer. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
352 function! s:HgRepo.ReadCommandOutput(command, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
353 function! s:PutOutputIntoBuffer(command_line) |
146
33cc4af93b44
Use `HGPLAIN` for lawrencium buffers too.
Ludovic Chabant <ludovic@chabant.com>
parents:
141
diff
changeset
|
354 let l:prev_hgplain = $HGPLAIN |
33cc4af93b44
Use `HGPLAIN` for lawrencium buffers too.
Ludovic Chabant <ludovic@chabant.com>
parents:
141
diff
changeset
|
355 let $HGPLAIN = 'true' |
33cc4af93b44
Use `HGPLAIN` for lawrencium buffers too.
Ludovic Chabant <ludovic@chabant.com>
parents:
141
diff
changeset
|
356 |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 let l:was_buffer_empty = (line('$') == 1 && getline(1) == '') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 execute '0read!' . escape(a:command_line, '%#\') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 if l:was_buffer_empty " (Always true?) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
360 " '0read' inserts before the cursor, leaving a blank line which |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
361 " needs to be deleted... but if there are folds in this thing, we |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
362 " must open them all first otherwise we could delete the whole |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
363 " contents of the last fold (since Vim may close them all by |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 " default). |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 normal! zRG"_dd |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 endif |
146
33cc4af93b44
Use `HGPLAIN` for lawrencium buffers too.
Ludovic Chabant <ludovic@chabant.com>
parents:
141
diff
changeset
|
367 |
33cc4af93b44
Use `HGPLAIN` for lawrencium buffers too.
Ludovic Chabant <ludovic@chabant.com>
parents:
141
diff
changeset
|
368 let $HGPLAIN = l:prev_hgplain |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 let l:all_args = [a:command] + a:000 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 let l:hg_command = call(self['GetCommand'], l:all_args, self) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 call lawrencium#trace("Running Mercurial command: " . l:hg_command) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 call s:PutOutputIntoBuffer(l:hg_command) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
375 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
376 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 " Build a Lawrencium path for the given file and action. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
378 " By default, the given path will be made relative to the repository root, |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
379 " unless '0' is passed as the 4th argument. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 function! s:HgRepo.GetLawrenciumPath(path, action, value, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
381 let l:path = a:path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
382 if a:0 == 0 || !a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 let l:path = self.GetRelativePath(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
385 let l:path = fnameescape(l:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 let l:result = 'lawrencium://' . lawrencium#stripslash(self.root_dir) . '//' . l:path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 if a:action !=? '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
388 let l:result = l:result . '//' . a:action |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 if a:value !=? '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 let l:result = l:result . '=' . a:value |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 return l:result |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 " Repo cache map. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
397 let s:buffer_repos = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
399 " Get a cached repo. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
400 function! lawrencium#hg_repo(...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
401 " Use the given path, or the mercurial directory of the current buffer. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
402 if a:0 == 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
403 if exists('b:mercurial_dir') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
404 let l:path = b:mercurial_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
405 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
406 let l:path = lawrencium#find_repo_root(expand('%:p')) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
407 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
408 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
409 let l:path = a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
410 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
411 " Find a cache repo instance, or make a new one. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
412 if has_key(s:buffer_repos, l:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
413 return get(s:buffer_repos, l:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
414 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
415 let l:repo = s:HgRepo.New(l:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
416 let s:buffer_repos[l:path] = l:repo |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
417 return l:repo |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
418 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
419 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
420 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
421 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
422 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
423 " Buffer Object {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
424 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
425 " The prototype dictionary. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
426 let s:Buffer = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
427 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
428 " Constructor. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
429 function! s:Buffer.New(number) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
430 let l:newBuffer = copy(self) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
431 let l:newBuffer.nr = a:number |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
432 let l:newBuffer.var_backup = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
433 let l:newBuffer.cmd_names = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
434 let l:newBuffer.on_delete = [] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
435 let l:newBuffer.on_winleave = [] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
436 let l:newBuffer.on_unload = [] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
437 execute 'augroup lawrencium_buffer_' . a:number |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
438 execute ' autocmd!' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
439 execute ' autocmd BufDelete <buffer=' . a:number . '> call s:buffer_on_delete(' . a:number . ')' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
440 execute 'augroup end' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
441 call lawrencium#trace("Built new buffer object for buffer: " . a:number) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
442 return l:newBuffer |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
443 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
444 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
445 function! s:Buffer.GetName(...) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
446 let l:name = bufname(self.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
447 if a:0 > 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
448 let l:name = fnamemodify(l:name, a:1) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
449 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
450 return l:name |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
451 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
452 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
453 function! s:Buffer.GetVar(var) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
454 return getbufvar(self.nr, a:var) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
455 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
456 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
457 function! s:Buffer.SetVar(var, value) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
458 if !has_key(self.var_backup, a:var) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
459 let self.var_backup[a:var] = getbufvar(self.nr, a:var) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
460 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
461 return setbufvar(self.nr, a:var, a:value) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
462 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
463 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
464 function! s:Buffer.RestoreVars() dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
465 for key in keys(self.var_backup) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
466 setbufvar(self.nr, key, self.var_backup[key]) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
467 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
468 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
469 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
470 function! s:Buffer.DefineCommand(name, ...) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
471 if a:0 == 0 |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
472 call lawrencium#throwerr("Not enough parameters for s:Buffer.DefineCommands()") |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
473 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
474 if a:0 == 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
475 let l:flags = '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
476 let l:cmd = a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
477 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
478 let l:flags = a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
479 let l:cmd = a:2 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
480 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
481 if has_key(self.cmd_names, a:name) |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
482 call lawrencium#throwerr("Command '".a:name."' is already defined in buffer ".self.nr) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
483 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
484 if bufnr('%') != self.nr |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
485 call lawrencium#throwerr("You must move to buffer ".self.nr."first before defining local commands") |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
486 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
487 let self.cmd_names[a:name] = 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
488 let l:real_flags = '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
489 if type(l:flags) == type('') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
490 let l:real_flags = l:flags |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
491 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
492 execute 'command -buffer '.l:real_flags.' '.a:name.' '.l:cmd |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
493 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
494 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
495 function! s:Buffer.DeleteCommand(name) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
496 if !has_key(self.cmd_names, a:name) |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
497 call lawrencium#throwerr("Command '".a:name."' has not been defined in buffer ".self.nr) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
498 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
499 if bufnr('%') != self.nr |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
500 call lawrencium#throwerr("You must move to buffer ".self.nr."first before deleting local commands") |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
501 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
502 execute 'delcommand '.a:name |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
503 call remove(self.cmd_names, a:name) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
504 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
505 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
506 function! s:Buffer.DeleteCommands() dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
507 if bufnr('%') != self.nr |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
508 call lawrencium#throwerr("You must move to buffer ".self.nr."first before deleting local commands") |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
509 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
510 for name in keys(self.cmd_names) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
511 execute 'delcommand '.name |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
512 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
513 let self.cmd_names = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
514 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
515 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
516 function! s:Buffer.MoveToFirstWindow() dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
517 let l:win_nr = bufwinnr(self.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
518 if l:win_nr < 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
519 if a:0 > 0 && a:1 == 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
520 return 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
521 endif |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
522 call lawrencium#throwerr("No windows currently showing buffer ".self.nr) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
523 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
524 execute l:win_nr.'wincmd w' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
525 return 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
526 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
527 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
528 function! s:Buffer.OnDelete(cmd) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
529 call lawrencium#trace("Adding BufDelete callback for buffer " . self.nr . ": " . a:cmd) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
530 call add(self.on_delete, a:cmd) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
531 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
532 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
533 function! s:Buffer.OnWinLeave(cmd) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
534 if len(self.on_winleave) == 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
535 call lawrencium#trace("Adding BufWinLeave auto-command on buffer " . self.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
536 execute 'augroup lawrencium_buffer_' . self.nr . '_winleave' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
537 execute ' autocmd!' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
538 execute ' autocmd BufWinLeave <buffer=' . self.nr . '> call s:buffer_on_winleave(' . self.nr .')' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
539 execute 'augroup end' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
540 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
541 call lawrencium#trace("Adding BufWinLeave callback for buffer " . self.nr . ": " . a:cmd) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
542 call add(self.on_winleave, a:cmd) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
543 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
544 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
545 function! s:Buffer.OnUnload(cmd) dict abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
546 if len(self.on_unload) == 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
547 call lawrencium#trace("Adding BufUnload auto-command on buffer " . self.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
548 execute 'augroup lawrencium_buffer_' . self.nr . '_unload' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
549 execute ' autocmd!' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
550 execute ' autocmd BufUnload <buffer=' . self.nr . '> call s:buffer_on_unload(' . self.nr . ')' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
551 execute 'augroup end' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
552 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
553 call lawrencium#trace("Adding BufUnload callback for buffer " . self.nr . ": " . a:cmd) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
554 call add(self.on_unload, a:cmd) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
555 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
556 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
557 let s:buffer_objects = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
558 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
559 " Get a buffer instance for the specified buffer number, or the |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
560 " current buffer if nothing is specified. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
561 function! lawrencium#buffer_obj(...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
562 let l:bufnr = a:0 ? a:1 : bufnr('%') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
563 if !has_key(s:buffer_objects, l:bufnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
564 let s:buffer_objects[l:bufnr] = s:Buffer.New(l:bufnr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
565 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
566 return s:buffer_objects[l:bufnr] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
567 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
568 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
569 " Execute all the "on delete" callbacks. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
570 function! s:buffer_on_delete(number) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
571 let l:bufobj = s:buffer_objects[a:number] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
572 call lawrencium#trace("Calling BufDelete callbacks on buffer " . l:bufobj.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
573 for cmd in l:bufobj.on_delete |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
574 call lawrencium#trace(" [" . cmd . "]") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
575 execute cmd |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
576 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
577 call lawrencium#trace("Deleted buffer object " . l:bufobj.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
578 call remove(s:buffer_objects, l:bufobj.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
579 execute 'augroup lawrencium_buffer_' . l:bufobj.nr |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
580 execute ' autocmd!' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
581 execute 'augroup end' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
582 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
583 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
584 " Execute all the "on winleave" callbacks. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
585 function! s:buffer_on_winleave(number) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
586 let l:bufobj = s:buffer_objects[a:number] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
587 call lawrencium#trace("Calling BufWinLeave callbacks on buffer " . l:bufobj.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
588 for cmd in l:bufobj.on_winleave |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
589 call lawrencium#trace(" [" . cmd . "]") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
590 execute cmd |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
591 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
592 execute 'augroup lawrencium_buffer_' . l:bufobj.nr . '_winleave' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
593 execute ' autocmd!' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
594 execute 'augroup end' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
595 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
596 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
597 " Execute all the "on unload" callbacks. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
598 function! s:buffer_on_unload(number) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
599 let l:bufobj = s:buffer_objects[a:number] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
600 call lawrencium#trace("Calling BufUnload callbacks on buffer " . l:bufobj.nr) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
601 for cmd in l:bufobj.on_unload |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
602 call lawrencium#trace(" [" . cmd . "]") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
603 execute cmd |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
604 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
605 execute 'augroup lawrencium_buffer_' . l:bufobj.nr . '_unload' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
606 execute ' autocmd!' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
607 execute 'augroup end' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
608 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
609 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
610 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
611 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
612 " Buffer Commands Management {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
613 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
614 " Store the commands for Lawrencium-enabled buffers so that we can add them in |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
615 " batch when we need to. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
616 let s:main_commands = [] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
617 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
618 function! lawrencium#add_command(command) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
619 let s:main_commands += [a:command] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
620 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
621 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
622 function! lawrencium#define_commands() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
623 for l:command in s:main_commands |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
624 execute 'command! -buffer ' . l:command |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
625 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
626 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
627 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
628 augroup lawrencium_main |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
629 autocmd! |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
630 autocmd User Lawrencium call lawrencium#define_commands() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
631 augroup end |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
632 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
633 " Sets up the current buffer with Lawrencium commands if it contains a file from a Mercurial repo. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
634 " If the file is not in a Mercurial repo, just exit silently. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
635 function! lawrencium#setup_buffer_commands() abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
636 call lawrencium#trace("Scanning buffer '" . bufname('%') . "' for Lawrencium setup...") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
637 let l:do_setup = 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
638 if exists('b:mercurial_dir') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
639 if b:mercurial_dir =~# '\v^\s*$' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
640 unlet b:mercurial_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
641 else |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
642 let l:do_setup = 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
643 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
644 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
645 try |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
646 let l:repo = lawrencium#hg_repo() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
647 catch /^lawrencium\:/ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
648 return |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
649 endtry |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
650 let b:mercurial_dir = l:repo.root_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
651 if exists('b:mercurial_dir') && l:do_setup |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
652 call lawrencium#trace("Setting Mercurial commands for buffer '" . bufname('%')) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
653 call lawrencium#trace(" with repo : " . expand(b:mercurial_dir)) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
654 silent doautocmd User Lawrencium |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
655 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
656 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
657 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
658 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
659 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
660 " Commands Auto-Complete {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
661 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
662 " Auto-complete function for commands that take repo-relative file paths. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
663 function! lawrencium#list_repo_files(ArgLead, CmdLine, CursorPos) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
664 let l:matches = lawrencium#hg_repo().Glob(a:ArgLead . '*', 1) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
665 call map(l:matches, 'lawrencium#normalizepath(v:val)') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
666 return l:matches |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
667 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
668 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
669 " Auto-complete function for commands that take repo-relative directory paths. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
670 function! lawrencium#list_repo_dirs(ArgLead, CmdLine, CursorPos) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
671 let l:matches = lawrencium#hg_repo().Glob(a:ArgLead . '*/') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
672 call map(l:matches, 'lawrencium#normalizepath(v:val)') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
673 return l:matches |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
674 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
675 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
676 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
677 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
678 " Lawrencium Files {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
679 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
680 " Generic read |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
681 let s:lawrencium_file_readers = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
682 let s:lawrencium_file_customoptions = {} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
683 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
684 function! lawrencium#add_reader(action, callback, ...) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
685 if has_key(s:lawrencium_file_readers, a:action) |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
686 call lawrencium#throwerr("Lawrencium file '".a:action."' has alredy been registered.") |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
687 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
688 let s:lawrencium_file_readers[a:action] = function(a:callback) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
689 if a:0 && a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
690 let s:lawrencium_file_customoptions[a:action] = 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
691 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
692 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
693 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
694 function! lawrencium#read_lawrencium_file(path) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
695 call lawrencium#trace("Reading Lawrencium file: " . a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
696 let l:path_parts = lawrencium#parse_lawrencium_path(a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
697 if l:path_parts['root'] == '' |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
698 call lawrencium#throwerr("Can't get repository root from: " . a:path) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
699 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
700 if !has_key(s:lawrencium_file_readers, l:path_parts['action']) |
141
4d5f4233b04e
Only set `v:errmsg` for real errors, not exceptions.
Ludovic Chabant <ludovic@chabant.com>
parents:
139
diff
changeset
|
701 call lawrencium#throwerr("No registered reader for action: " . l:path_parts['action']) |
139
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
702 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
703 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
704 " Call the registered reader. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
705 let l:repo = lawrencium#hg_repo(l:path_parts['root']) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
706 let l:full_path = l:repo.root_dir . l:path_parts['path'] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
707 let LawrenciumFileReader = s:lawrencium_file_readers[l:path_parts['action']] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
708 call LawrenciumFileReader(l:repo, l:path_parts, l:full_path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
709 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
710 " Setup the new buffer. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
711 if !has_key(s:lawrencium_file_customoptions, l:path_parts['action']) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
712 setlocal readonly |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
713 setlocal nomodified |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
714 setlocal bufhidden=delete |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
715 setlocal buftype=nofile |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
716 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
717 goto |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
718 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
719 " Remember the real Lawrencium path, because Vim can fuck up the slashes |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
720 " on Windows. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
721 let b:lawrencium_path = a:path |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
722 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
723 " Remember the repo it belongs to and make |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
724 " the Lawrencium commands available. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
725 let b:mercurial_dir = l:repo.root_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
726 call lawrencium#define_commands() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
727 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
728 return '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
729 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
730 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
731 function! lawrencium#write_lawrencium_file(path) abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
732 call lawrencium#trace("Writing Lawrencium file: " . a:path) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
733 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
734 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
735 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
736 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
737 " Statusline {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
738 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
739 " Prints a summary of the current repo (if any) that's appropriate for |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
740 " displaying on the status line. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
741 function! lawrencium#statusline(...) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
742 if !exists('b:mercurial_dir') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
743 return '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
744 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
745 let l:repo = lawrencium#hg_repo() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
746 let l:prefix = (a:0 > 0 ? a:1 : '') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
747 let l:suffix = (a:0 > 1 ? a:2 : '') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
748 let l:branch = 'default' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
749 let l:branch_file = l:repo.GetFullPath('.hg/branch') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
750 if filereadable(l:branch_file) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
751 let l:branch = readfile(l:branch_file)[0] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
752 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
753 let l:bookmarks = '' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
754 let l:bookmarks_file = l:repo.GetFullPath('.hg/bookmarks.current') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
755 if filereadable(l:bookmarks_file) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
756 let l:bookmarks = join(readfile(l:bookmarks_file), ', ') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
757 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
758 let l:line = l:prefix . l:branch |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
759 if strlen(l:bookmarks) > 0 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
760 let l:line = l:line . ' - ' . l:bookmarks |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
761 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
762 let l:line = l:line . l:suffix |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
763 return l:line |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
764 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
765 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
766 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
767 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
768 " Miscellaneous User Functions {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
769 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
770 " Rescans the current buffer for setting up Mercurial commands. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
771 " Passing '1' as the parameter enables debug traces temporarily. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
772 function! lawrencium#rescan(...) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
773 if exists('b:mercurial_dir') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
774 unlet b:mercurial_dir |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
775 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
776 if a:0 && a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
777 let l:trace_backup = g:lawrencium_trace |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
778 let g:lawrencium_trace = 1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
779 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
780 call lawrencium#setup_buffer_commands() |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
781 if a:0 && a:1 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
782 let g:lawrencium_trace = l:trace_backup |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
783 endif |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
784 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
785 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
786 " Enables/disables the debug trace. |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
787 function! lawrencium#debugtrace(...) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
788 let g:lawrencium_trace = (a:0 == 0 || (a:0 && a:1)) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
789 echom "Lawrencium debug trace is now " . (g:lawrencium_trace ? "enabled." : "disabled.") |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
790 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
791 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
792 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
793 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
794 " Setup {{{ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
795 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
796 function! lawrencium#init() abort |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
797 let s:builtin_exts = [ |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
798 \'lawrencium#addremove', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
799 \'lawrencium#annotate', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
800 \'lawrencium#cat', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
801 \'lawrencium#commit', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
802 \'lawrencium#diff', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
803 \'lawrencium#hg', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
804 \'lawrencium#log', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
805 \'lawrencium#mq', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
806 \'lawrencium#record', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
807 \'lawrencium#revert', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
808 \'lawrencium#status', |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
809 \'lawrencium#vimutils' |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
810 \] |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
811 let s:user_exts = copy(g:lawrencium_extensions) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
812 let s:exts = s:builtin_exts + s:user_exts |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
813 for ext in s:exts |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
814 call lawrencium#trace("Initializing Lawrencium extension " . ext) |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
815 execute ('call ' . ext . '#init()') |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
816 endfor |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
817 endfunction |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
818 |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
819 " }}} |
065625e1bb31
Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
820 |