annotate autoload/lawrencium/hg.vim @ 139:065625e1bb31

Split plugin file into multiple extensions.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 13 Jun 2016 09:32:34 -0700
parents
children 652a6f5df0f3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 function lawrencium#hg#init() abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 call lawrencium#add_command("-bang -complete=customlist,lawrencium#hg#CompleteHg -nargs=* Hg :call lawrencium#hg#Hg(<bang>0, <f-args>)")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 function! lawrencium#hg#Hg(bang, ...) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 let l:repo = lawrencium#hg_repo()
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 if g:lawrencium_auto_cd
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 " Temporary set the current directory to the root of the repo
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 " to make auto-completed paths work magically.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 execute 'cd! ' . fnameescape(l:repo.root_dir)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 let l:output = call(l:repo.RunCommandEx, [0] + a:000, l:repo)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 if g:lawrencium_auto_cd
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 execute 'cd! -'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 silent doautocmd User HgCmdPost
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 if a:bang
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 " Open the output of the command in a temp file.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 let l:temp_file = lawrencium#tempname('hg-output-', '.txt')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 split
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 execute 'edit ' . fnameescape(l:temp_file)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 call append(0, split(l:output, '\n'))
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 call cursor(1, 1)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 " Make it a temp buffer
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 setlocal bufhidden=delete
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 setlocal buftype=nofile
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 " Try to find a nice syntax to set given the current command.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 let l:command_name = s:GetHgCommandName(a:000)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 if l:command_name != '' && exists('g:lawrencium_hg_commands_file_types')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 let l:file_type = get(g:lawrencium_hg_commands_file_types, l:command_name, '')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 if l:file_type != ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 execute 'setlocal ft=' . l:file_type
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 " Just print out the output of the command.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 echo l:output
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 endif
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 " Include the generated HG usage file.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 let s:usage_file = expand("<sfile>:h:h:h") . "/resources/hg_usage.vim"
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 if filereadable(s:usage_file)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 execute "source " . fnameescape(s:usage_file)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 call lawrencium#error("Can't find the Mercurial usage file. Auto-completion will be disabled in Lawrencium.")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 endif
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 " Include the command file type mappings.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 let s:file_type_mappings = expand("<sfile>:h:h") . '/resources/hg_command_file_types.vim'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 if filereadable(s:file_type_mappings)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 execute "source " . fnameescape(s:file_type_mappings)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 function! lawrencium#hg#CompleteHg(ArgLead, CmdLine, CursorPos)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 " Don't do anything if the usage file was not sourced.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 if !exists('g:lawrencium_hg_commands') || !exists('g:lawrencium_hg_options')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 return []
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 endif
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 " a:ArgLead seems to be the number 0 when completing a minus '-'.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 " Gotta find out why...
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 let l:arglead = a:ArgLead
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 if type(a:ArgLead) == type(0)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 let l:arglead = '-'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 " Try completing a global option, before any command name.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 if a:CmdLine =~# '\v^Hg(\s+\-[a-zA-Z0-9\-_]*)+$'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 return filter(copy(g:lawrencium_hg_options), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 endif
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 " Try completing a command (note that there could be global options before
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 " the command name).
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 if a:CmdLine =~# '\v^Hg\s+(\-[a-zA-Z0-9\-_]+\s+)*[a-zA-Z]+$'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 return filter(keys(g:lawrencium_hg_commands), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 " Try completing a command's options.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 let l:cmd = matchstr(a:CmdLine, '\v(^Hg\s+(\-[a-zA-Z0-9\-_]+\s+)*)@<=[a-zA-Z]+')
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 if strlen(l:cmd) > 0 && l:arglead[0] ==# '-'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 if has_key(g:lawrencium_hg_commands, l:cmd)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 " Return both command options and global options together.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 let l:copts = filter(copy(g:lawrencium_hg_commands[l:cmd]), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 let l:gopts = filter(copy(g:lawrencium_hg_options), "v:val[0:strlen(l:arglead)-1] ==# l:arglead")
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 return l:copts + l:gopts
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 " Just auto-complete with filenames unless it's an option.
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 if l:arglead[0] ==# '-'
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 return []
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 else
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 return lawrencium#list_repo_files(a:ArgLead, a:CmdLine, a:CursorPos)
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 function! s:GetHgCommandName(args) abort
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 for l:a in a:args
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 if stridx(l:a, '-') != 0
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 return l:a
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 endif
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 endfor
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 return ''
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 endfunction
065625e1bb31 Split plugin file into multiple extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108