annotate autoload/vimcrosoft.vim @ 12:1639be0967d6

Warn if multiple solutions have been found in the project.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 29 Aug 2023 12:50:59 -0700
parents 096e80c13781
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 " vimcrosoft.vim - A wrapper for Visual Studio solutions
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 " Utilities {{{
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 let s:basedir = expand('<sfile>:p:h:h')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 function! vimcrosoft#throw(message)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 throw "vimcrosoft: ".a:message
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 function! vimcrosoft#error(message)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 let v:errmsg = "vimcrosoft: ".a:message
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 echoerr v:errmsg
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 function! vimcrosoft#warning(message)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 echohl WarningMsg
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 echom "vimcrosoft: ".a:message
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 echohl None
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 function! vimcrosoft#trace(message)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 if g:vimcrosoft_trace
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 echom "vimcrosoft: ".a:message
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 function! vimcrosoft#ensure_msbuild_found() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 if !empty(g:vimcrosoft_msbuild_path)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 return 1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 let l:programfilesdir = get(environ(), 'ProgramFiles(x86)')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 let l:vswhere = l:programfilesdir.'\Microsoft Visual Studio\Installer\vswhere.exe'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 if !executable(l:vswhere)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 call vimcrosoft#error("Can't find `vswhere` -- you must set `g:vimcrosoft_msbuild_path` yourself.")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 return 0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 let l:vswhere_cmdline = '"'.l:vswhere.'" '.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 \'-prerelease -latest -products * '.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 \'-requires Microsoft.Component.MSBuild '.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 \'-property installationPath'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 call vimcrosoft#trace("Trying to find MSBuild, running: ".l:vswhere_cmdline)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 let l:installdirs = split(system(l:vswhere_cmdline), '\n')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 call vimcrosoft#trace("Got: ".string(l:installdirs))
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 for installdir in l:installdirs
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 let l:msbuild = installdir.'\MSBuild\Current\Bin\MSBuild.exe'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 if executable(l:msbuild)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 let g:vimcrosoft_msbuild_path = l:msbuild
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 return 1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 let l:msbuild = installdir.'\MSBuild\15.0\Bin\MSBuild.exe'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 if executable(l:msbuild)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 let g:vimcrosoft_msbuild_path = l:msbuild
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 return 1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 endfor
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 call vimcrosoft#error("Couldn't find MSBuild anywhere in:\n".
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 \string(l:installdirs))
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 return 0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64
11
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
65 function! vimcrosoft#get_msbuild_errorformat() abort
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
66 " MSBuild error formats look like this:
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
67 " Path\To\Source\Filename.cpp|53| error C2065: 'MyClass': undeclared identifier [Path\To\MyProject.vcxproj]
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
68 return '%*[^\ ]\ %f\|%l\|\ %trror\ \D%n:\ %m\ [%o]'
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
69 " \'\|\|\ %f\|%l\|\ %tarning\ \D%n:\ %m\ [%o]'
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
70 endfunction
096e80c13781 Use the correct documentation extension.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
71
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 " Cache Files {{{
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 function! vimcrosoft#get_sln_cache_dir(...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 if empty(g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 if a:0 && a:1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 call vimcrosoft#throw("No solution is currently set.")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 return ''
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 let l:cache_dir = fnamemodify(g:vimcrosoft_current_sln, ':h')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 let l:cache_dir .= '\.vimcrosoft'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 return l:cache_dir
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 function! vimcrosoft#get_sln_cache_file(filename) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 let l:cache_dir = vimcrosoft#get_sln_cache_dir()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 if empty(l:cache_dir)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 return ''
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 return l:cache_dir.'\'.a:filename
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 " Configuration Files {{{
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 let s:config_format = 2
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 function! vimcrosoft#save_config() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 if empty(g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 return
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 call vimcrosoft#trace("Saving config for: ".g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 let l:lines = [
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 \'format='.string(s:config_format),
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 \g:vimcrosoft_current_sln,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 \g:vimcrosoft_current_config,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 \g:vimcrosoft_current_platform,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 \g:vimcrosoft_active_project]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 let l:configfile = vimcrosoft#get_sln_cache_file('config.txt')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 call writefile(l:lines, l:configfile)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 function! vimcrosoft#load_config() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 if empty(g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 return
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 let l:configfile = vimcrosoft#get_sln_cache_file('config.txt')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 if !filereadable(l:configfile)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 return
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 let l:lines = readfile(l:configfile)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 let l:format_line = l:lines[0]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 if l:format_line == 'format='.string(s:config_format)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 let g:vimcrosoft_current_sln = l:lines[1]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 let g:vimcrosoft_current_config = l:lines[2]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 let g:vimcrosoft_current_platform = l:lines[3]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 let g:vimcrosoft_active_project = l:lines[4]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 call vimcrosoft#warning("Solution configuration format has changed ".
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138 \"since you last opened this solution in Vim. ".
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 \"You previous configuration/platform has NOT been ".
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 \"restored.")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 " {{{ Scripts
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148 let s:scriptsdir = s:basedir.'\scripts'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
149
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
150 function! vimcrosoft#get_script_path(scriptname) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
151 return s:scriptsdir.'\'.a:scriptname
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
152 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
153
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
154 function! vimcrosoft#exec_script_job(scriptname, ...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 let l:scriptpath = vimcrosoft#get_script_path(a:scriptname)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 let l:cmd = ['python', l:scriptpath] + a:000
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 return job_start(l:cmd)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160 let s:scriptsdir_added_to_sys = 0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 let s:scripts_imported = []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 function! s:install_scriptsdir() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164 if !s:scriptsdir_added_to_sys
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 execute 'python3 import sys'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 execute 'python3 sys.path.append("'.escape(s:scriptsdir, "\\").'")'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 execute 'python3 import vimutil'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 let s:scriptsdir_added_to_sys = 1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 function! vimcrosoft#exec_script_now(scriptname, ...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173 if g:vimcrosoft_use_external_python
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174 let l:cmd = 'python '.shellescape(vimcrosoft#get_script_path(a:scriptname.'.py'))
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175 " TODO: shellescape arguments?
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 let l:cmd .= ' '.join(a:000, " ")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 let l:output = system(l:cmd)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 call s:install_scriptsdir()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 if index(s:scripts_imported, a:scriptname) < 0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 execute 'python3 import '.a:scriptname
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 call add(s:scripts_imported, a:scriptname)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 let l:line = 'vimutil.runscript('.a:scriptname.'.main'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185 if a:0 > 0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186 let l:args = copy(a:000)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187 call map(l:args, {idx, val -> escape(val, '\"')})
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 let l:line .= ', "'.join(l:args, '", "').'"'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190 let l:line .= ')'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 call vimcrosoft#trace("Executing: ".l:line)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 let l:output = py3eval(l:line)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194 return l:output
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 " Module Management {{{
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
200
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
201 let s:modulesdir = s:basedir.'\autoload\vimcrosoft'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
202 let s:modules = glob(s:modulesdir.'\*.vim', 0, 1)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
203
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
204 function! vimcrosoft#call_modules(funcname, ...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
205 for modpath in s:modules
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 let l:modname = fnamemodify(modpath, ':t:r')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
207 let l:fullfuncname = 'vimcrosoft#'.l:modname.'#'.a:funcname
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
208 if exists("*".l:fullfuncname)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
209 call vimcrosoft#trace("Module ".l:modname.": calling ".a:funcname)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 call call(l:fullfuncname, a:000)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212 call vimcrosoft#trace("Skipping ".l:fullfuncname.": doesn't exist.")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
213 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 endfor
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 " Solution Management {{{
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221 function! vimcrosoft#set_sln(slnpath, ...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 let g:vimcrosoft_current_sln = a:slnpath
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 let l:sln_was_set = !empty(a:slnpath)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 if l:sln_was_set
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 let g:vimcrosoft_current_sln_cache = vimcrosoft#get_sln_cache_file("slncache.bin")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 call vimcrosoft#call_modules('on_sln_changed', a:slnpath)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 let g:vimcrosoft_current_sln_cache = ''
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 call vimcrosoft#call_modules('on_sln_cleared')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 let l:silent = a:0 && a:1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 if !l:silent
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 call vimcrosoft#save_config()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 if l:sln_was_set
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 echom "Current solution: ".a:slnpath
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 echom "No current solution anymore"
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 function! vimcrosoft#auto_find_sln(...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 let l:path = getcwd()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247 try
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 let l:slnpath = vimcrosoft#find_sln(l:path)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249 catch /^vimcrosoft:/
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 let l:slnpath = ''
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 endtry
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 let l:silent = a:0 && a:1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 call vimcrosoft#set_sln(l:slnpath, l:silent)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 function! vimcrosoft#find_sln(curpath) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 if g:vimcrosoft_sln_finder != ''
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 return call(g:vimcrosoft_sln_finder, [a:curpath])
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260 return vimcrosoft#default_sln_finder(a:curpath)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 function! vimcrosoft#default_sln_finder(path) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 let l:cur = a:path
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 let l:prev = ""
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266 while l:cur != l:prev
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 let l:slnfiles = globpath(l:cur, '*.sln', 0, 1)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268 if !empty(l:slnfiles)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269 call vimcrosoft#trace("Found solution file: ".l:slnfiles[0])
12
1639be0967d6 Warn if multiple solutions have been found in the project.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
270 if len(l:slnfiles) > 1 && g:vimcrosoft_warn_multiple_slns
1639be0967d6 Warn if multiple solutions have been found in the project.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
271 let l:warnmsg = "Found multiple solutions files: "
1639be0967d6 Warn if multiple solutions have been found in the project.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
272 \.join(l:slnfiles, " ; ")
1639be0967d6 Warn if multiple solutions have been found in the project.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
273 \." Check or change the auto-chosen first one."
1639be0967d6 Warn if multiple solutions have been found in the project.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
274 call vimcrosoft#warning(l:warnmsg)
1639be0967d6 Warn if multiple solutions have been found in the project.
Ludovic Chabant <ludovic@chabant.com>
parents: 11
diff changeset
275 endif
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
276 return l:slnfiles[0]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 let l:prev = l:cur
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 let l:cur = fnamemodify(l:cur, ':h')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 endwhile
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 call vimcrosoft#throw("No solution file found.")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 function! vimcrosoft#set_active_project(projname, ...) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 " Strip trailing spaces in the project name.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 let l:projname = substitute(a:projname, '\v\s+$', '', 'g')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
288 let g:vimcrosoft_active_project = l:projname
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289 call vimcrosoft#call_modules('on_active_project_changed', l:projname)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 let l:silent = a:0 && a:1
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292 if !l:silent
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 call vimcrosoft#save_config()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 echom "Active project changed"
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
295 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
296 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 function! vimcrosoft#build_sln(target) abort
6
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
299 if g:vimcrosoft_save_all_on_build
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
300 wall
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
301 endif
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
302
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 let l:args = []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 if !empty(a:target)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305 call add(l:args, '/t:'.a:target)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
306 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
307 call vimcrosoft#run_make(l:args)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
308 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 function! vimcrosoft#build_project(projname, target, only) abort
6
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
311 if g:vimcrosoft_save_all_on_build
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
312 wall
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
313 endif
376f3371c311 Save all unsaved buffers before building.
Ludovic Chabant <ludovic@chabant.com>
parents: 0
diff changeset
314
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 let l:projname = !empty(a:projname) ? a:projname : g:vimcrosoft_active_project
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316 if empty(l:projname)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 call vimcrosoft#error("No project name given, and no active project set.")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 return
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 " Strip trailing spaces in the project name.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
322 let l:projname = substitute(l:projname, '\v\s+$', '', 'g')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
323 let l:target = '/t:'.tr(l:projname, '.', '_')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
324 if !empty(a:target)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325 let l:target .= ':'.a:target
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
327
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 let l:args = []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329 call add(l:args, l:target)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
330 if a:only
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
331 call add(l:args, '/p:BuildProjectReferences=false')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
332 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
333 call vimcrosoft#run_make(l:args)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
334 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
335
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
336 function! vimcrosoft#run_make(customargs) abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
337 if !vimcrosoft#ensure_msbuild_found()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
338 return
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
339 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
340
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
341 " Add some common arguments for MSBuild.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
342 let l:fullargs = copy(a:customargs)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
343 call add(l:fullargs, '"/p:Configuration='.g:vimcrosoft_current_config.'"')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
344 call add(l:fullargs, '"/p:Platform='.g:vimcrosoft_current_platform.'"')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
345 " Add the solution file itself.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
346 call add(l:fullargs, '"'.g:vimcrosoft_current_sln.'"')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
347
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
348 " Setup the backdoor args list for our compiler to pick-up, and run
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
349 " the make process.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
350 let g:vimcrosoft_temp_compiler_args__ = l:fullargs
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
351 compiler vimcrosoftsln
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
352 if !empty(g:vimcrosoft_make_command)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 execute g:vimcrosoft_make_command
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
354 elseif exists(":Make") " Support for vim-dispatch.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
355 Make
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 else
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
357 make
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
358 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
359 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361 function! vimcrosoft#set_config_platform(configplatform)
7
ff4590b2503a Fix handling of spaces in configs/platforms for autocomplete.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
362 let l:bits = split(substitute(a:configplatform, '\\ ', ' ', 'g'), '|')
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 if len(l:bits) != 2
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 call vimcrosoft#throw("Expected a value of the form: Config|Platform")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367 let g:vimcrosoft_current_config = l:bits[0]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 let g:vimcrosoft_current_platform = l:bits[1]
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369 call vimcrosoft#call_modules('on_config_platform_changed',
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
370 \g:vimcrosoft_current_config, g:vimcrosoft_current_platform)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
371
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
372 call vimcrosoft#save_config()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
373 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
374
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
375 function! vimcrosoft#get_sln_project_names() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
376 if empty(g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
377 return []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
378 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379 let l:output = vimcrosoft#exec_script_now("list_sln_projects",
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
380 \g:vimcrosoft_current_sln,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
381 \'-c', g:vimcrosoft_current_sln_cache,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
382 \'--full-names')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
383 return split(l:output, "\n")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
384 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
385
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
386 function! vimcrosoft#get_sln_config_platforms() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
387 if empty(g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388 return []
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
389 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
390 let l:output = vimcrosoft#exec_script_now("list_sln_configs",
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
391 \g:vimcrosoft_current_sln,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
392 \'-c', g:vimcrosoft_current_sln_cache)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
393 return split(l:output, "\n")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
394 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
395
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
396 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
397
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
398 " {{{ Commands Auto-completion
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
399
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
400 function! vimcrosoft#complete_current_sln_projects(ArgLead, CmdLine, CursorPos)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
401 let l:proj_names = vimcrosoft#get_sln_project_names()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
402 let l:argpat = '^'.substitute(a:ArgLead, '\', '', 'g')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
403 let l:projnames = filter(l:proj_names,
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
404 \{idx, val -> val =~? l:argpat})
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
405 return l:projnames
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
406 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
407
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
408 function! vimcrosoft#complete_current_sln_config_platforms(ArgLead, CmdLine, CursorPos)
7
ff4590b2503a Fix handling of spaces in configs/platforms for autocomplete.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
409 let l:argpat = '^'.substitute(a:ArgLead, '\', '', 'g')
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
410 let l:cfgplats = vimcrosoft#get_sln_config_platforms()
7
ff4590b2503a Fix handling of spaces in configs/platforms for autocomplete.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
411 let l:cfgplats_filtered = filter(l:cfgplats, {idx, val -> val =~? l:argpat})
ff4590b2503a Fix handling of spaces in configs/platforms for autocomplete.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
412 call map(l:cfgplats_filtered, {idx, val -> escape(val, ' ')})
ff4590b2503a Fix handling of spaces in configs/platforms for autocomplete.
Ludovic Chabant <ludovic@chabant.com>
parents: 6
diff changeset
413 return l:cfgplats_filtered
0
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
414 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
415
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
416 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
417
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
418 " {{{ Statusline Functions
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
419
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
420 function! vimcrosoft#statusline(...)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
421 if empty(g:vimcrosoft_current_sln)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
422 return ''
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
423 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
424
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
425 let l:line = fnamemodify(g:vimcrosoft_current_sln, ':t')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
426 if !empty(g:vimcrosoft_active_project)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
427 let l:line .= '('.g:vimcrosoft_active_project.')'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
428 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
429 let l:line .= ' ['.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
430 \g:vimcrosoft_current_config.'|'.
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
431 \g:vimcrosoft_current_platform.']'
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
432 return l:line
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
433 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
434
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
435 " }}}
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
436
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
437 " {{{ Initialization
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
438
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
439 function! vimcrosoft#init() abort
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
440 call vimcrosoft#trace("Loading modules...")
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
441 for modpath in s:modules
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
442 execute 'source '.fnameescape(modpath)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
443 endfor
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
444
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
445 call vimcrosoft#call_modules('init')
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
446
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
447 if g:vimcrosoft_auto_find_sln
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
448 call vimcrosoft#auto_find_sln(1)
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
449 call vimcrosoft#load_config()
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
450 endif
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
451 endfunction
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
452
5d2c0db51914 Initial commit
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
453 " }}}