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