diff --git a/autoload/internal_buffer.vim b/autoload/internal_buffer.vim index c956ede..c63edb8 100644 --- a/autoload/internal_buffer.vim +++ b/autoload/internal_buffer.vim @@ -86,9 +86,6 @@ fu! s:InternalBuffer.RenderLine(items, line) dict abort let next_start_col = item.end_col let idx += 1 - " echo "r -> " . item.hl_group . ' l:' . a:line - " \ . ' ' . item.start_col . ':' . item.end_col - " \ . ' — ' . string(item.text) endfor " write final text to buffer @@ -578,7 +575,7 @@ fu! s:InternalBuffer.RenderUi() dict abort call self.AddLine([ self.CreateItem("help_text", "", "Comment") ]) call self.AddLine([ self.CreateItem("help_text", "[enter/o] open file [tab/p] preview file [esc/q] close ", "Comment") ]) - call self.AddLine([ self.CreateItem("help_text", "[t] toggle grouping [a] show all results [b] back to first result in list", "Comment") ]) + call self.AddLine([ self.CreateItem("help_text", "[T] toggle grouping [a] show all results [b] back to first result in list", "Comment") ]) call self.AddLine([ self.CreateItem("help_text", "[u] show usages", "Comment") ]) endfu diff --git a/autoload/lang_map.vim b/autoload/lang_map.vim index aac1b52..eca2a3f 100644 --- a/autoload/lang_map.vim +++ b/autoload/lang_map.vim @@ -3,6 +3,10 @@ let s:definitions = {} +let s:non_standard_ft_names = { + \"javascriptreact": "javascript" + \} + fu! s:add_definition(lang, definition) abort if !has_key(s:definitions, a:lang) let s:definitions[a:lang] = [] @@ -27,6 +31,21 @@ fu! lang_map#lang_exists(language) abort return has_key(s:definitions, a:language) endfu +fu! lang_map#get_language_from_filetype(ft) abort + echo a:ft + if has_key(s:non_standard_ft_names, a:ft) + let maybe_lan = s:non_standard_ft_names[a:ft] + else + let maybe_lan = a:ft + endif + + if lang_map#lang_exists(maybe_lan) + return maybe_lan + else + return 0 + endif +endfu + call s:add_definition('elisp', { \"type": 'function', \"pcre2_regexp": '\((defun|cl-defun)\s+KEYWORD($|[^a-zA-Z0-9\?\*-])', diff --git a/autoload/search.vim b/autoload/search.vim index 0cdced6..c891593 100644 --- a/autoload/search.vim +++ b/autoload/search.vim @@ -1,18 +1,50 @@ -" Search methods definitions - -" -" --- Public api --- -" +" Search methods let s:regexp_keyword_word = 'KEYWORD' let s:engines = ['rg', 'ag'] +let s:rg_base_cmd = "rg -n --pcre2 --json" +let s:ag_base_cmd = "ag --nogroup --noheading" + let s:rg_filetype_convertion_map = { \"python": "py", \"javascript": "js", \"typescript": "ts", + \"commonlisp": "lisp", + \} + +let s:ag_filetype_convertion_map = { + \"javascript": "js", + \"typescript": "ts", + \"commonlisp": "lisp", + \} + +let s:non_standard_ft_extensions_map = { + \"coffeescript": [ '\.cjs\$', '\.coffee\$', 'Cakefile', '\._coffee\$', '\.coffeekup$', '\.ck\$' ], + \"coq": [ '\.v\$' ], + \"scad": [ '\.scad\$' ], + \"protobuf": [ '\.proto\$' ], + \"scss": [ '\.scss\$' ], + \"systemverilog": [ '\.sv\$', '\.svh\$' ], + \"racket": [ '\.rkt\$' ], + \"scheme": [ '\.scm\$', '\.ss\$', '\.sld\$' ], + \"faust": [ '\.dsp\$', '\.lib\$' ], + \"pascal": [ '\.pas\$', '\.dpr\$', '\.int\$', '\.dfm\$' ], + \"shell": [ '\.sh\$', '\.bash\$', '\.csh\$', '\.ksh\$', '\.tcsh\$' ], + \"haskell": [ '\.hs\$', '\.lhs\$' ], + \"dart": [ '\.dart\$' ] \} +let s:non_standard_ft_extensions_map_compiled = {} +for lang in keys(s:non_standard_ft_extensions_map) + let rules = s:non_standard_ft_extensions_map[lang] + let regexp = map(rules, { _, pattern -> '(' . pattern . ')' }) + let regexp = join(regexp, '|') + let regexp = "\"(" . regexp . ")\"" + + let s:non_standard_ft_extensions_map_compiled[lang] = regexp +endfor + fu! s:GetRgFiletype(lang) abort if has_key(s:rg_filetype_convertion_map, a:lang) return s:rg_filetype_convertion_map[a:lang] @@ -21,6 +53,40 @@ fu! s:GetRgFiletype(lang) abort endif endfu +fu! s:GetAgFiletype(lang) abort + if has_key(s:ag_filetype_convertion_map, a:lang) + return s:ag_filetype_convertion_map[a:lang] + else + return a:lang + endif +endfu + +fu! search#GetSearchEngineFileTypeSpecifier(engine, language) abort + let cmd = 0 + + if has_key(s:non_standard_ft_extensions_map_compiled, a:language) + if a:engine == 'rg' + let file_lists_cmd = 'rg --files | rg ' . s:non_standard_ft_extensions_map_compiled[a:language] + let files = split(system(file_lists_cmd), "\n") + let cmd = join(map(files, {_,fname -> ('-f ' . fname)}), ' ') + elseif a:engine == 'ag' + let cmd = '-G ' . s:non_standard_ft_extensions_map_compiled[a:language] + endif + else + if a:engine == 'rg' + let cmd = '-t ' . s:GetRgFiletype(a:language) + elseif a:engine == 'ag' + let cmd = '--' . s:GetAgFiletype(a:language) + endif + endif + + return cmd +endfu + +fu! search#GetLanguage(ft) + +endfu + fu! search#SearchUsages(internal_buffer) abort if g:any_jump_search_prefered_engine == 'rg' let grep_results = s:RunRgUsagesSearch(a:internal_buffer.language, a:internal_buffer.keyword) @@ -58,7 +124,7 @@ fu! search#SearchDefinitions(lang, keyword) abort return grep_results endfu -fu! search#RunSearchEnginesSpecs() +fu! search#RunSearchEnginesSpecs() abort let errors = [] let has_rg = executable('rg') @@ -74,20 +140,25 @@ fu! search#RunSearchEnginesSpecs() return errors endfu -fu! search#RunRegexpSpecs() +fu! search#RunRegexpSpecs() abort let errors = [] let passed = 0 + let failed = 0 for lang in keys(lang_map#definitions()) + let lang_passed = 0 + let lang_failed = 0 + for entry in lang_map#definitions()[lang] let re = entry.pcre2_regexp let keyword = 'test' if len(re) > 0 let test_re = substitute(re, 'KEYWORD', keyword, 'g') - let error_exit_codes = {"spec_success": [1,2], "spec_failed": [0,2]} + let invalid_exist_statues = {"spec_success": [1,2], "spec_failed": [0,2]} + let spec_types = keys(invalid_exist_statues) - for spec_type in keys(error_exit_codes) + for spec_type in spec_types for spec_string in entry[spec_type] for engine in s:engines if index(entry.supports, engine) == -1 @@ -95,21 +166,29 @@ fu! search#RunRegexpSpecs() endif let cmd = 0 + let ft_args = search#GetSearchEngineFileTypeSpecifier(engine, lang) if engine == 'rg' - let cmd = "echo \"" . spec_string . "\" | rg --pcre2 --no-filename \"" . test_re . "\"" + let rg_ft = s:GetRgFiletype(lang) + let cmd = "echo \"" . spec_string . "\" | " + \ . s:rg_base_cmd . " --no-filename " + \ . ft_args . " \"" . test_re . "\"" end if engine == 'ag' - let cmd = "echo \"" . spec_string . "\" | ag \"" . test_re . "\"" + let ag_ft = s:GetAgFiletype(lang) + let cmd = "echo \"" . spec_string . "\" | " + \ . s:ag_base_cmd . " " . ft_args . " \"" + \ . test_re . "\"" endif let raw_results = system(cmd) - if index(error_exit_codes[spec_type], v:shell_error) >= 0 - call add(errors, "FAILED -- " . spec_type . ' ' . string(raw_results) . ' -- ' . lang . " -- " . spec_string . ' -- ' . test_re) + if index(invalid_exist_statues[spec_type], v:shell_error) != -1 + call add(errors, 'FAILED ' . engine . ' ' . lang . ' ' . spec_type . ' -- result: ' . string(raw_results) . "; spec: " . string(spec_string) . '; re: ' . string(test_re)) + let lang_failed += 1 else - let passed += 1 + let lang_passed += 1 endif endfor @@ -119,10 +198,9 @@ fu! search#RunRegexpSpecs() endfor - echo "lang " . lang . ' finished tests ' . passed + echo "lang " . lang . ' finished success:' . lang_passed . ' failed: ' . lang_failed endfor - echo "passed tests: " . passed return errors endfu @@ -137,7 +215,7 @@ endfu fu! s:RunRgUsagesSearch(language, keyword) abort let rg_ft = s:GetRgFiletype(a:language) - let cmd = "rg -n --pcre2 --json -t " . rg_ft . ' -w ' . a:keyword + let cmd = s:rg_base_cmd . ' -t ' . rg_ft . ' -w ' . a:keyword let raw_results = system(cmd) let grep_results = s:ParseRgResults(raw_results) @@ -147,7 +225,7 @@ endfu fu! s:RunRgDefinitionSearch(language, patterns) abort let rg_ft = s:GetRgFiletype(a:language) - let cmd = "rg -n --pcre2 --json -t " . rg_ft . ' ' . a:patterns + let cmd = s:rg_base_cmd . ' -t ' . rg_ft . ' ' . a:patterns let raw_results = system(cmd) let grep_results = s:ParseRgResults(raw_results) @@ -155,7 +233,7 @@ fu! s:RunRgDefinitionSearch(language, patterns) abort endfu fu! s:RunAgUsagesSearch(language, keyword) abort - let cmd = "ag --nogroup --noheading --" . a:language . ' -w ' . a:keyword + let cmd = s:ag_base_cmd . ' --' . a:language . ' -w ' . a:leyword let raw_results = system(cmd) let grep_results = s:ParseAgResults(raw_results) @@ -163,7 +241,7 @@ fu! s:RunAgUsagesSearch(language, keyword) abort endfu fu! s:RunAgDefinitionSearch(language, patterns) abort - let cmd = "ag --nogroup --noheading --" . a:language . ' ' . a:patterns + let cmd = s:ag_base_cmd . ' --' . a:language . ' ' . a:patterns let raw_results = system(cmd) let grep_results = s:ParseAgResults(raw_results) diff --git a/plugin/any-jump.vim b/plugin/any-jump.vim index 22664fe..3956ad9 100644 --- a/plugin/any-jump.vim +++ b/plugin/any-jump.vim @@ -1,34 +1,34 @@ " TODO: -" - фильтрация результатов ( - search definitions ) для определений не -" работает как надо -" - добавить возможность открывать окно не только в текущем window, но и -" делать vsplit/split относительного него -" - create doc -" - add specs for all search engines +" - ignore language comments +" +" - >> если нажать [a] show all results потом промотать потом снова [a] то приходится назад мотать долго - мб как то в начало списка кидать в таком кейсе? +" " - if no language found -> run definitions search in current, unless current " is home directory +" " - hl keyword line in preview -" - profile vim popup menu k/j move (slow for now) " -" - [nvim] >> Once a focus to the floating window is lost, the window should disappear. Like many other plugins with floating window. +" - добавить возможность открывать окно не только в текущем window, но и +" делать vsplit/split относительного него " -" - add ag conversion for js also -" - add ag convertion for js +" - [nvim] >> Once a focus to the floating window is lost, the window should disappear. Like many other plugins with floating window. " -" - add ability to provide ft aliases for rg/ag and solve problem with new ft " - >> it is a good practice to augroup your aucmds " - add namespace id for nvim hl " " - add ability to change list styles by keybind +" - create doc +" +" - paths priorities for better search results " " TODO_THINK: +" - rg and ag results sometimes very differenet " - after pressing p jump to next result " - add auto preview option " - impl VimL rules " - fzf " " TODO_FUTURE_RELEASES: -" - paths priorities for better search results " - AnyJumpPreview " - AnyJumpFirst " - jumps history & jumps work flow @@ -267,9 +267,10 @@ fu! s:GetCurrentInternalBuffer() abort endfu fu! s:Jump() abort - " check current language - if !lang_map#lang_exists(&l:filetype) - call s:log("not found map definition for filetype " . string(&l:filetype)) + let lang = lang_map#get_language_from_filetype(&l:filetype) + + if type(lang) != v:t_string + call s:log("not found map definition for filetype !" . string(lang)) return endif @@ -291,10 +292,10 @@ fu! s:Jump() abort let ib = internal_buffer#GetClass().New() let ib.keyword = keyword - let ib.language = &l:filetype + let ib.language = lang let ib.source_win_id = winnr() let ib.grouping_enabled = g:any_jump_grouping_enabled - let ib.definitions_grep_results = search#SearchDefinitions(&l:filetype, keyword) + let ib.definitions_grep_results = search#SearchDefinitions(lang, keyword) if g:any_jump_usages_enabled || len(ib.definitions_grep_results) == 0 let ib.usages_opened = v:true @@ -621,7 +622,7 @@ fu! s:RunSpecs() abort if len(errors) > 0 for error in errors - echo error + echoe error endfor endif