123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- " Vim filetype plugin file
- " Language: Java
- " Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>
- " Former Maintainer: Dan Sharp
- " Repository: https://github.com/zzzyxwvut/java-vim.git
- " Last Change: 2024 Dec 25
- " 2024 Jan 14 by Vim Project (browsefilter)
- " 2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
- " Make sure the continuation lines below do not cause problems in
- " compatibility mode.
- let s:save_cpo = &cpo
- set cpo-=C
- if (exists("g:java_ignore_javadoc") || exists("g:java_ignore_markdown")) &&
- \ exists("*javaformat#RemoveCommonMarkdownWhitespace")
- delfunction javaformat#RemoveCommonMarkdownWhitespace
- unlet! g:loaded_javaformat
- endif
- if exists("b:did_ftplugin")
- let &cpo = s:save_cpo
- unlet s:save_cpo
- finish
- endif
- let b:did_ftplugin = 1
- " For filename completion, prefer the .java extension over the .class
- " extension.
- set suffixes+=.class
- " Enable gf on import statements. Convert . in the package
- " name to / and append .java to the name, then search the path.
- setlocal includeexpr=substitute(v:fname,'\\.','/','g')
- setlocal suffixesadd=.java
- " Clean up in case this file is sourced again.
- unlet! s:zip_func_upgradable
- """" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
- " Documented in ":help ft-java-plugin".
- if exists("g:ftplugin_java_source_path") &&
- \ type(g:ftplugin_java_source_path) == type("")
- if filereadable(g:ftplugin_java_source_path)
- if exists("#zip") &&
- \ g:ftplugin_java_source_path =~# '.\.\%(jar\|zip\)$'
- if !exists("s:zip_files")
- let s:zip_files = {}
- endif
- let s:zip_files[bufnr('%')] = g:ftplugin_java_source_path
- let s:zip_files[0] = g:ftplugin_java_source_path
- let s:zip_func_upgradable = 1
- function! JavaFileTypeZipFile() abort
- let @/ = substitute(v:fname, '\.', '\\/', 'g') . '.java'
- return get(s:zip_files, bufnr('%'), s:zip_files[0])
- endfunction
- " E120 for "inex=s:JavaFileTypeZipFile()" before v8.2.3900.
- setlocal includeexpr=JavaFileTypeZipFile()
- setlocal suffixesadd<
- endif
- else
- let &l:path = g:ftplugin_java_source_path . ',' . &l:path
- endif
- endif
- " Set 'formatoptions' to break comment lines but not other lines,
- " and insert the comment leader when hitting <CR> or using "o".
- setlocal formatoptions-=t formatoptions+=croql
- " Set 'comments' to format Markdown Javadoc comments and dashed lists
- " in other multi-line comments (it behaves just like C).
- setlocal comments& comments^=:///,sO:*\ -,mO:*\ \ ,exO:*/
- setlocal commentstring=//\ %s
- " Change the :browse e filter to primarily show Java-related files.
- if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
- let b:browsefilter="Java Files (*.java)\t*.java\n" .
- \ "Properties Files (*.prop*)\t*.prop*\n" .
- \ "Manifest Files (*.mf)\t*.mf\n"
- if has("win32")
- let b:browsefilter .= "All Files (*.*)\t*\n"
- else
- let b:browsefilter .= "All Files (*)\t*\n"
- endif
- endif
- """" Support pre- and post-compiler actions for SpotBugs.
- if (!empty(get(g:, 'spotbugs_properties', {})) ||
- \ !empty(get(b:, 'spotbugs_properties', {}))) &&
- \ filereadable($VIMRUNTIME . '/compiler/spotbugs.vim')
- function! s:SpotBugsGetProperty(name, default) abort
- return get(
- \ {s:spotbugs_properties_scope}spotbugs_properties,
- \ a:name,
- \ a:default)
- endfunction
- function! s:SpotBugsHasProperty(name) abort
- return has_key(
- \ {s:spotbugs_properties_scope}spotbugs_properties,
- \ a:name)
- endfunction
- function! s:SpotBugsGetProperties() abort
- return {s:spotbugs_properties_scope}spotbugs_properties
- endfunction
- " Work around ":bar"s and ":autocmd"s.
- function! JavaFileTypeExecuteActionOnce(cleanup_cmd, action_cmd) abort
- try
- execute a:cleanup_cmd
- finally
- execute a:action_cmd
- endtry
- endfunction
- if exists("b:spotbugs_properties")
- let s:spotbugs_properties_scope = 'b:'
- " Merge global entries, if any, in buffer-local entries, favouring
- " defined buffer-local ones.
- call extend(
- \ b:spotbugs_properties,
- \ get(g:, 'spotbugs_properties', {}),
- \ 'keep')
- elseif exists("g:spotbugs_properties")
- let s:spotbugs_properties_scope = 'g:'
- endif
- let s:commands = {}
- for s:name in ['DefaultPreCompilerCommand',
- \ 'DefaultPreCompilerTestCommand',
- \ 'DefaultPostCompilerCommand']
- if s:SpotBugsHasProperty(s:name)
- let s:commands[s:name] = remove(
- \ s:SpotBugsGetProperties(),
- \ s:name)
- endif
- endfor
- if s:SpotBugsHasProperty('compiler')
- " XXX: Postpone loading the script until all state, if any, has been
- " collected.
- if !empty(s:commands)
- let g:spotbugs#state = {
- \ 'compiler': remove(s:SpotBugsGetProperties(), 'compiler'),
- \ 'commands': copy(s:commands),
- \ }
- else
- let g:spotbugs#state = {
- \ 'compiler': remove(s:SpotBugsGetProperties(), 'compiler'),
- \ }
- endif
- " Merge default entries in global (or buffer-local) entries, favouring
- " defined global (or buffer-local) ones.
- call extend(
- \ {s:spotbugs_properties_scope}spotbugs_properties,
- \ spotbugs#DefaultProperties(),
- \ 'keep')
- elseif !empty(s:commands)
- " XXX: Postpone loading the script until all state, if any, has been
- " collected.
- let g:spotbugs#state = {'commands': copy(s:commands)}
- endif
- unlet s:commands s:name
- let s:request = 0
- if s:SpotBugsHasProperty('PostCompilerAction')
- let s:request += 4
- endif
- if s:SpotBugsHasProperty('PreCompilerTestAction')
- let s:dispatcher = printf('call call(%s, [])',
- \ string(s:SpotBugsGetProperties().PreCompilerTestAction))
- let s:request += 2
- endif
- if s:SpotBugsHasProperty('PreCompilerAction')
- let s:dispatcher = printf('call call(%s, [])',
- \ string(s:SpotBugsGetProperties().PreCompilerAction))
- let s:request += 1
- endif
- " Adapt the tests for "s:FindClassFiles()" from "compiler/spotbugs.vim".
- if (s:request == 3 || s:request == 7) &&
- \ (!empty(s:SpotBugsGetProperty('sourceDirPath', [])) &&
- \ !empty(s:SpotBugsGetProperty('classDirPath', [])) &&
- \ !empty(s:SpotBugsGetProperty('testSourceDirPath', [])) &&
- \ !empty(s:SpotBugsGetProperty('testClassDirPath', [])))
- function! s:DispatchAction(paths_action_pairs) abort
- let name = expand('%:p')
- for [paths, Action] in a:paths_action_pairs
- for path in paths
- if name =~# (path . '.\{-}\.java\=$')
- call Action()
- return
- endif
- endfor
- endfor
- endfunction
- let s:dir_cnt = min([
- \ len(s:SpotBugsGetProperties().sourceDirPath),
- \ len(s:SpotBugsGetProperties().classDirPath)])
- let s:test_dir_cnt = min([
- \ len(s:SpotBugsGetProperties().testSourceDirPath),
- \ len(s:SpotBugsGetProperties().testClassDirPath)])
- " Do not break up path pairs with filtering!
- let s:dispatcher = printf('call s:DispatchAction(%s)',
- \ string([[s:SpotBugsGetProperties().sourceDirPath[0 : s:dir_cnt - 1],
- \ s:SpotBugsGetProperties().PreCompilerAction],
- \ [s:SpotBugsGetProperties().testSourceDirPath[0 : s:test_dir_cnt - 1],
- \ s:SpotBugsGetProperties().PreCompilerTestAction]]))
- unlet s:test_dir_cnt s:dir_cnt
- endif
- if exists("s:dispatcher")
- function! s:ExecuteActions(pre_action, post_action) abort
- try
- execute a:pre_action
- catch /\<E42:/
- execute a:post_action
- endtry
- endfunction
- endif
- if s:request
- if exists("b:spotbugs_syntax_once") || empty(join(getline(1, 8), ''))
- let s:actions = [{'event': 'User'}]
- else
- " XXX: Handle multiple FileType events when vimrc contains more
- " than one filetype setting for the language, e.g.:
- " :filetype plugin indent on
- " :autocmd BufRead,BufNewFile *.java setlocal filetype=java ...
- " XXX: DO NOT ADD b:spotbugs_syntax_once TO b:undo_ftplugin !
- let b:spotbugs_syntax_once = 1
- let s:actions = [{
- \ 'event': 'Syntax',
- \ 'once': 1,
- \ }, {
- \ 'event': 'User',
- \ }]
- endif
- for s:idx in range(len(s:actions))
- if s:request == 7 || s:request == 6 || s:request == 5
- let s:actions[s:idx].cmd = printf('call s:ExecuteActions(%s, %s)',
- \ string(s:dispatcher),
- \ string(printf('compiler spotbugs | call call(%s, [])',
- \ string(s:SpotBugsGetProperties().PostCompilerAction))))
- elseif s:request == 4
- let s:actions[s:idx].cmd = printf(
- \ 'compiler spotbugs | call call(%s, [])',
- \ string(s:SpotBugsGetProperties().PostCompilerAction))
- elseif s:request == 3 || s:request == 2 || s:request == 1
- let s:actions[s:idx].cmd = printf('call s:ExecuteActions(%s, %s)',
- \ string(s:dispatcher),
- \ string('compiler spotbugs'))
- else
- let s:actions[s:idx].cmd = ''
- endif
- endfor
- if !exists("#java_spotbugs")
- augroup java_spotbugs
- augroup END
- endif
- " The events are defined in s:actions.
- silent! autocmd! java_spotbugs User <buffer>
- silent! autocmd! java_spotbugs Syntax <buffer>
- for s:action in s:actions
- if has_key(s:action, 'once')
- execute printf('autocmd java_spotbugs %s <buffer> ' .
- \ 'call JavaFileTypeExecuteActionOnce(%s, %s)',
- \ s:action.event,
- \ string(printf('autocmd! java_spotbugs %s <buffer>',
- \ s:action.event)),
- \ string(s:action.cmd))
- else
- execute printf('autocmd java_spotbugs %s <buffer> %s',
- \ s:action.event,
- \ s:action.cmd)
- endif
- endfor
- if s:SpotBugsHasProperty('PostCompilerActionExecutor') &&
- \ (s:request == 7 || s:request == 6 ||
- \ s:request == 5 || s:request == 4)
- let s:augroup = s:SpotBugsGetProperty(
- \ 'augroupForPostCompilerAction',
- \ 'java_spotbugs_post')
- let s:augroup = !empty(s:augroup) ? s:augroup : 'java_spotbugs_post'
- for s:candidate in ['java_spotbugs_post', s:augroup]
- if !exists("#" . s:candidate)
- execute printf('augroup %s | augroup END', s:candidate)
- endif
- endfor
- silent! autocmd! java_spotbugs_post User <buffer>
- " Define a User ":autocmd" to define a once-only ShellCmdPost
- " ":autocmd" that will invoke "PostCompilerActionExecutor" and let
- " it decide whether to proceed with ":compiler spotbugs" etc.; and
- " seek explicit synchronisation with ":doautocmd ShellCmdPost" by
- " omitting "nested" for "java_spotbugs_post" and "java_spotbugs".
- execute printf('autocmd java_spotbugs_post User <buffer> ' .
- \ 'call JavaFileTypeExecuteActionOnce(%s, %s)',
- \ string(printf('autocmd! %s ShellCmdPost <buffer>', s:augroup)),
- \ string(printf('autocmd %s ShellCmdPost <buffer> ' .
- \ 'call JavaFileTypeExecuteActionOnce(%s, %s)',
- \ s:augroup,
- \ string(printf('autocmd! %s ShellCmdPost <buffer>', s:augroup)),
- \ string(printf('call call(%s, [%s])',
- \ string(s:SpotBugsGetProperties().PostCompilerActionExecutor),
- \ string(printf('compiler spotbugs | call call(%s, [])',
- \ string(s:SpotBugsGetProperties().PostCompilerAction))))))))
- endif
- unlet! s:candidate s:augroup s:action s:actions s:idx s:dispatcher
- endif
- delfunction s:SpotBugsGetProperties
- delfunction s:SpotBugsHasProperty
- delfunction s:SpotBugsGetProperty
- unlet! s:request s:spotbugs_properties_scope
- endif
- function! JavaFileTypeCleanUp() abort
- setlocal suffixes< suffixesadd< formatoptions< comments< commentstring< path< includeexpr<
- unlet! b:browsefilter
- " The concatenated ":autocmd" removals may be misparsed as an ":autocmd".
- " A _once-only_ ShellCmdPost ":autocmd" is always a call-site definition.
- silent! autocmd! java_spotbugs User <buffer>
- silent! autocmd! java_spotbugs Syntax <buffer>
- silent! autocmd! java_spotbugs_post User <buffer>
- endfunction
- " Undo the stuff we changed.
- let b:undo_ftplugin = 'call JavaFileTypeCleanUp() | delfunction JavaFileTypeCleanUp'
- " See ":help vim9-mix".
- if !has("vim9script")
- let &cpo = s:save_cpo
- unlet s:save_cpo
- finish
- endif
- if exists("s:zip_func_upgradable")
- delfunction! JavaFileTypeZipFile
- def! s:JavaFileTypeZipFile(): string
- @/ = substitute(v:fname, '\.', '\\/', 'g') .. '.java'
- return get(zip_files, bufnr('%'), zip_files[0])
- enddef
- setlocal includeexpr=s:JavaFileTypeZipFile()
- setlocal suffixesadd<
- endif
- if exists("*s:DispatchAction")
- def! s:DispatchAction(paths_action_pairs: list<list<any>>)
- const name: string = expand('%:p')
- for [paths: list<string>, Action: func: any] in paths_action_pairs
- for path in paths
- if name =~# (path .. '.\{-}\.java\=$')
- Action()
- return
- endif
- endfor
- endfor
- enddef
- endif
- " Restore the saved compatibility options.
- let &cpo = s:save_cpo
- unlet s:save_cpo
- " vim: fdm=syntax sw=4 ts=8 noet sta
|