Skip to content

Commit 0dff889

Browse files
committed
[lazy load] refactor 70% : basic codequery cmd works
1 parent 3b59951 commit 0dff889

File tree

5 files changed

+701
-686
lines changed

5 files changed

+701
-686
lines changed

autoload/codequery.vim

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
" =============================================================================
2+
" Helpers
3+
4+
5+
let g:c_family_filetype_list =
6+
\ ['c', 'h', 'cpp', 'cxx', 'cc', 'hpp', 'hxx', 'hh']
7+
8+
9+
let s:supported_filetypes = g:c_family_filetype_list +
10+
\ ['python', 'javascript', 'go', 'ruby', 'java', 'c', 'cpp']
11+
12+
13+
function! s:check_filetype(filetype)
14+
if index(s:supported_filetypes, a:filetype) == -1
15+
return 0
16+
endif
17+
return 1
18+
endfunction
19+
20+
21+
function! s:set_db()
22+
let path = codequery#db#find_db_path(&filetype)
23+
if empty(path)
24+
echom 'CodeQuery DB Not Found'
25+
return 0
26+
endif
27+
28+
let g:db_path = path
29+
return 1
30+
endfunction
31+
32+
33+
34+
" =============================================================================
35+
" Entries
36+
37+
38+
function! codequery#run_codequery(args)
39+
if !s:check_filetype(&filetype)
40+
echom 'Not Supported Filetype: ' . &filetype
41+
return
42+
endif
43+
44+
let g:last_query_word = ''
45+
let g:fuzzy = 0
46+
let g:append_to_quickfix = 0
47+
let g:querytype = 1
48+
let g:db_path = ''
49+
if !s:set_db()
50+
return
51+
endif
52+
53+
let args = split(a:args, ' ')
54+
let args_num = len(args)
55+
let cword = codequery#query#get_valid_cursor_word()
56+
57+
if args_num == 0
58+
call codequery#query#do_query(cword)
59+
60+
elseif index(g:codequery_subcommands, args[0]) != -1
61+
call codequery#query#set_options(args)
62+
let iword = codequery#query#get_valid_input_word(args)
63+
let word = codequery#query#get_final_query_word(iword, cword)
64+
if empty(word)
65+
echom 'Invalid Args: ' . a:args
66+
return
67+
endif
68+
69+
call codequery#query#do_query(word)
70+
else
71+
echom 'Wrong Subcommand !'
72+
endif
73+
endfunction
74+
75+
76+
function! s:make_codequery_db(args)
77+
let args = split(a:args, ' ')
78+
if empty(args)
79+
let args = [&filetype]
80+
endif
81+
82+
for ft in args
83+
if !s:check_filetype(ft)
84+
echom 'Not Supported Filetype: ' . ft
85+
continue
86+
endif
87+
88+
let db_path = codequery#db#find_db_path(ft)
89+
if empty(db_path)
90+
if index(g:c_family_filetype_list, ft) != -1
91+
let db_path = 'c_family.db'
92+
else
93+
let db_path = ft . '.db'
94+
endif
95+
endif
96+
97+
if ft ==? 'python'
98+
let shell_cmd = codequery#db#construct_python_db_build_cmd(db_path)
99+
elseif ft ==? 'javascript'
100+
let shell_cmd = codequery#db#construct_javascript_db_build_cmd(db_path)
101+
elseif ft ==? 'ruby'
102+
let shell_cmd = codequery#db#construct_ruby_db_build_cmd(db_path)
103+
elseif ft ==? 'go'
104+
let shell_cmd = codequery#db#construct_go_db_build_cmd(db_path)
105+
elseif ft ==? 'java'
106+
let shell_cmd = codequery#db#construct_java_db_build_cmd(db_path)
107+
elseif index(g:c_family_filetype_list, ft) != -1
108+
let shell_cmd = codequery#db#construct_c_db_build_cmd(db_path)
109+
else
110+
echom 'No Command For Building .' . ft . ' file'
111+
continue
112+
endif
113+
114+
" TODO: Rewrite it when Vim8 is coming
115+
" ----------------------------------------------------------------
116+
if exists(':Start')
117+
silent execute 'Start! -title=Make_CodeQuery_DB -wait=error ' . shell_cmd
118+
redraw!
119+
echom 'Making ' . db_path ' => Run :CodeQueryViewDB to Check Status'
120+
else
121+
silent execute '!' . shell_cmd
122+
redraw!
123+
endif
124+
" ----------------------------------------------------------------
125+
endfor
126+
endfunction
127+
128+
129+
function! s:view_codequery_db(args)
130+
let args = split(a:args, ' ')
131+
if empty(args)
132+
let args = [&filetype]
133+
endif
134+
135+
for ft in args
136+
if !s:check_filetype(ft)
137+
echom 'Not Supported Filetype: ' . ft
138+
continue
139+
endif
140+
141+
let db_path = codequery#db#find_db_path(ft)
142+
if empty(db_path)
143+
if index(g:c_family_filetype_list, ft) != -1
144+
execute '!echo "\n(c family) DB Not Found"'
145+
else
146+
execute '!echo "\n(' . ft . ') DB Not Found"'
147+
endif
148+
continue
149+
endif
150+
151+
execute '!echo "\n(' . db_path . ') is update at: " && stat -f "\%Sm" ' . db_path
152+
endfor
153+
endfunction
154+
155+
156+
function! s:move_codequery_db_to_git_hidden_dir(args)
157+
let args = split(a:args, ' ')
158+
if empty(args)
159+
let args = [&filetype]
160+
endif
161+
162+
for ft in args
163+
if index(g:c_family_filetype_list, ft) != -1
164+
let db_name = 'c_family.db'
165+
else
166+
let db_name = ft . '.db'
167+
endif
168+
let git_root_dir = systemlist('git rev-parse --show-toplevel')[0]
169+
let db_path = codequery#db#find_db_path(ft)
170+
171+
if !v:shell_error && !empty(db_path)
172+
let new_db_path = git_root_dir . '/.git/codequery/' . db_name
173+
call system('mkdir -p ' . git_root_dir . '/.git/codequery/')
174+
call system('mv ' . db_path . ' ' . new_db_path)
175+
echom 'Done (' . db_name . ')'
176+
else
177+
echom 'Git Dir Not Found or (' . db_name . ') Not Found'
178+
endif
179+
endfor
180+
endfunction
181+
182+
183+
function! s:show_menu(args)
184+
let args = split(a:args, ' ')
185+
let args_num = len(args)
186+
187+
if args_num > 0 && index(s:menu_subcommands, args[0]) != -1
188+
if args[0] ==# 'Unite'
189+
if args_num > 1 && args[1] ==# 'Magic'
190+
let magic_menu = 1
191+
else
192+
let magic_menu = 0
193+
endif
194+
call s:use_unite_menu(magic_menu)
195+
return
196+
endif
197+
endif
198+
199+
echom 'Wrong Subcommands! Try: ' . join(s:menu_subcommands, ', ')
200+
endfunction
201+
202+
203+
function! s:run_codequery_again_with_different_subcmd(args)
204+
let args = split(a:args, ' ')
205+
let args_num = len(args)
206+
if !empty(s:last_query_word) && args_num > 0
207+
cclose
208+
let again_cmd = 'CodeQuery ' . args[0] . ' ' . s:last_query_word . ' '
209+
\ . (s:last_query_fuzzy ? '-f' : '')
210+
execute again_cmd
211+
else
212+
echom 'Wrong Subcommands!'
213+
endif
214+
endfunction
215+
216+
217+
" modify from someone's .vimrc
218+
function! s:filter_qf_results(query)
219+
let results = getqflist()
220+
for d in results
221+
if bufname(d['bufnr']) !~ a:query && d['text'] !~ a:query
222+
call remove(results, index(results, d))
223+
endif
224+
endfor
225+
call setqflist(results)
226+
call s:prettify_qf_layout_and_map_keys(results)
227+
endfunction

autoload/codequery/db.vim

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
2+
" `lcd` brings side effect !!
3+
function! codequery#db#find_db_path(filetype)
4+
if index(g:c_family_filetype_list, a:filetype) != -1
5+
let db_name = 'c_family.db'
6+
else
7+
let db_name = a:filetype . '.db'
8+
endif
9+
10+
let lookup_path = findfile(expand('%:p:h') . '/' . db_name, '.')
11+
12+
if !empty(lookup_path)
13+
lcd %:p:h
14+
return lookup_path
15+
endif
16+
17+
lcd %:p:h
18+
let git_root_dir = systemlist('git rev-parse --show-toplevel')[0]
19+
if !v:shell_error
20+
let lookup_path = findfile(git_root_dir . '/' . db_name, '.')
21+
if !empty(lookup_path)
22+
execute 'lcd ' . git_root_dir
23+
return lookup_path
24+
else
25+
let lookup_path = findfile(git_root_dir . '/.git/codequery/' .
26+
\ db_name, '.')
27+
if !empty(lookup_path)
28+
execute 'lcd ' . git_root_dir
29+
return lookup_path
30+
endif
31+
endif
32+
endif
33+
endfunction
34+
35+
36+
function! s:construct_python_db_build_cmd(db_path)
37+
let find_cmd = 'find . -iname "*.py" > python_cscope.files'
38+
let pycscope_cmd = 'pycscope -f "python_cscope.out" -i python_cscope.files'
39+
let ctags_cmd = 'ctags --fields=+i -n -R -f "python_tags" -L python_cscope.files'
40+
let cqmakedb_cmd = 'cqmakedb -s "' . a:db_path . '" -c python_cscope.out' .
41+
\ ' -t python_tags -p'
42+
let shell_cmd = find_cmd . ' && ' .
43+
\ pycscope_cmd . ' && ' .
44+
\ ctags_cmd . ' && ' .
45+
\ cqmakedb_cmd
46+
47+
if exists('g:codequery_enable_auto_clean_languages') &&
48+
\ index(g:codequery_enable_auto_clean_languages, 'python') != -1
49+
let shell_cmd .= '&& rm python_cscope.files python_cscope.out python_tags'
50+
endif
51+
52+
return exists('g:codequery_build_python_db_cmd') ? g:codequery_build_python_db_cmd : shell_cmd
53+
endfunction
54+
55+
56+
function! s:construct_javascript_db_build_cmd(db_path)
57+
let starscope_cmd = 'starscope --force-update -e ctags -e cscope **/*.js'
58+
let rename_cmd = 'mv tags javascript_tags && mv cscope.out javascript_cscope.out'
59+
let cqmakedb_cmd = 'cqmakedb -s "' . a:db_path .
60+
\ '" -c ./javascript_cscope.out -t ./javascript_tags -p'
61+
62+
let shell_cmd = starscope_cmd . ' && ' . rename_cmd . ' && ' . cqmakedb_cmd
63+
64+
if exists('g:codequery_enable_auto_clean_languages') &&
65+
\ index(g:codequery_enable_auto_clean_languages, 'javascript') != -1
66+
let shell_cmd .= ' && rm javascript_cscope.out javascript_tags .starscope.db'
67+
endif
68+
69+
return exists('g:codequery_build_javascript_db_cmd') ? g:codequery_build_javascript_db_cmd : shell_cmd
70+
endfunction
71+
72+
73+
function! s:construct_ruby_db_build_cmd(db_path)
74+
let starscope_cmd = 'starscope --force-update -e ctags -e cscope **/*.rb'
75+
let rename_cmd = 'mv tags ruby_tags && mv cscope.out ruby_cscope.out'
76+
let cqmakedb_cmd = 'cqmakedb -s "' . a:db_path .
77+
\ '" -c ./ruby_cscope.out -t ./ruby_tags -p'
78+
79+
let shell_cmd = starscope_cmd . ' && ' . rename_cmd . ' && ' . cqmakedb_cmd
80+
81+
if exists('g:codequery_enable_auto_clean_languages') &&
82+
\ index(g:codequery_enable_auto_clean_languages, 'ruby') != -1
83+
let shell_cmd .= ' && rm ruby_cscope.out ruby_tags .starscope.db'
84+
endif
85+
86+
return exists('g:codequery_build_ruby_db_cmd') ? g:codequery_build_ruby_db_cmd : shell_cmd
87+
endfunction
88+
89+
90+
function! s:construct_go_db_build_cmd(db_path)
91+
let starscope_cmd = 'starscope --force-update -e ctags -e cscope **/*.go'
92+
let rename_cmd = 'mv tags go_tags && mv cscope.out go_cscope.out'
93+
let cqmakedb_cmd = 'cqmakedb -s "' . a:db_path .
94+
\ '" -c ./go_cscope.out -t ./go_tags -p'
95+
96+
let shell_cmd = starscope_cmd . ' && ' . rename_cmd . ' && ' . cqmakedb_cmd
97+
98+
if exists('g:codequery_enable_auto_clean_languages') &&
99+
\ index(g:codequery_enable_auto_clean_languages, 'go') != -1
100+
let shell_cmd .= ' && rm go_cscope.out go_tags .starscope.db'
101+
endif
102+
103+
return exists('g:codequery_build_go_db_cmd') ? g:codequery_build_go_db_cmd : shell_cmd
104+
endfunction
105+
106+
107+
function! s:construct_java_db_build_cmd(db_path)
108+
let find_cmd = 'find . -iname "*.java" > java_cscope.files'
109+
let cscope_cmd = 'cscope -cbR -i java_cscope.files -f java_cscope.out'
110+
let ctags_cmd = 'ctags --fields=+i -n -R -f "java_tags" -L java_cscope.files'
111+
let cqmakedb_cmd = 'cqmakedb -s "' . a:db_path . '" -c java_cscope.out' .
112+
\ ' -t java_tags -p'
113+
let shell_cmd = find_cmd . ' && ' .
114+
\ cscope_cmd . ' && ' .
115+
\ ctags_cmd . ' && ' .
116+
\ cqmakedb_cmd
117+
118+
if exists('g:codequery_enable_auto_clean_languages') &&
119+
\ index(g:codequery_enable_auto_clean_languages, 'java') != -1
120+
let shell_cmd .= '&& rm java_cscope.files java_cscope.out java_tags'
121+
endif
122+
123+
return exists('g:codequery_build_java_db_cmd') ? g:codequery_build_java_db_cmd : shell_cmd
124+
endfunction
125+
126+
127+
function! s:construct_c_db_build_cmd(db_path)
128+
let find_cmd = 'find . -iname "*.c" > c_cscope.files && ' .
129+
\ 'find . -iname "*.h" >> c_cscope.files && ' .
130+
\ 'find . -iname "*.cpp" >> c_cscope.files && ' .
131+
\ 'find . -iname "*.cxx" >> c_cscope.files && ' .
132+
\ 'find . -iname "*.cc" >> c_cscope.files && ' .
133+
\ 'find . -iname "*.hpp" >> c_cscope.files && ' .
134+
\ 'find . -iname "*.hxx" >> c_cscope.files && ' .
135+
\ 'find . -iname "*.hh" >> c_cscope.files'
136+
let cscope_cmd = 'cscope -cbk -i c_cscope.files -f c_cscope.out'
137+
let ctags_cmd = 'ctags --fields=+i -n -R -f "c_tags" -L c_cscope.files'
138+
let cqmakedb_cmd = 'cqmakedb -s "' . a:db_path . '" -c c_cscope.out' .
139+
\ ' -t c_tags -p'
140+
let shell_cmd = find_cmd . ' && ' .
141+
\ cscope_cmd . ' && ' .
142+
\ ctags_cmd . ' && ' .
143+
\ cqmakedb_cmd
144+
145+
if exists('g:codequery_enable_auto_clean_languages') &&
146+
\ index(g:codequery_enable_auto_clean_languages, 'c') != -1
147+
let shell_cmd .= '&& rm c_cscope.files c_cscope.out c_tags'
148+
endif
149+
150+
return exists('g:codequery_build_c_db_cmd') ? g:codequery_build_c_db_cmd : shell_cmd
151+
endfunction
152+

0 commit comments

Comments
 (0)