mirror of
https://github.com/amix/vimrc
synced 2025-07-07 08:45:00 +08:00
Update plugins using update_plugins.py
This commit is contained in:
@ -156,7 +156,7 @@ function! ale#Queue(delay, ...) abort
|
||||
endif
|
||||
endfunction
|
||||
|
||||
let s:current_ale_version = [2, 4, 0]
|
||||
let s:current_ale_version = [2, 5, 0]
|
||||
|
||||
" A function used to check for ALE features in files outside of the project.
|
||||
function! ale#Has(feature) abort
|
||||
|
41
sources_non_forked/ale/autoload/ale/ant.vim
Normal file
41
sources_non_forked/ale/autoload/ale/ant.vim
Normal file
@ -0,0 +1,41 @@
|
||||
" Author: Andrew Lee <andrewl@mbda.fun>.
|
||||
" Inspired by ale/gradle.vim by Michael Pardo <michael@michaelpardo.com>
|
||||
" Description: Functions for working with Ant projects.
|
||||
|
||||
" Given a buffer number, find an Ant project root
|
||||
function! ale#ant#FindProjectRoot(buffer) abort
|
||||
let l:build_xml_path = ale#path#FindNearestFile(a:buffer, 'build.xml')
|
||||
|
||||
if !empty(l:build_xml_path)
|
||||
return fnamemodify(l:build_xml_path, ':h')
|
||||
endif
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
" Given a buffer number, find the path to the `ant` executable. Returns an empty
|
||||
" string if cannot find the executable.
|
||||
function! ale#ant#FindExecutable(buffer) abort
|
||||
if executable('ant')
|
||||
return 'ant'
|
||||
endif
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
" Given a buffer number, build a command to print the classpath of the root
|
||||
" project. Returns an empty string if cannot build the command.
|
||||
function! ale#ant#BuildClasspathCommand(buffer) abort
|
||||
let l:executable = ale#ant#FindExecutable(a:buffer)
|
||||
let l:project_root = ale#ant#FindProjectRoot(a:buffer)
|
||||
|
||||
if !empty(l:executable) && !empty(l:project_root)
|
||||
return ale#path#CdString(l:project_root)
|
||||
\ . ale#Escape(l:executable)
|
||||
\ . ' classpath'
|
||||
\ . ' -S'
|
||||
\ . ' -q'
|
||||
endif
|
||||
|
||||
return ''
|
||||
endfunction
|
@ -52,6 +52,7 @@ let s:should_complete_map = {
|
||||
\ 'lisp': s:lisp_regex,
|
||||
\ 'typescript': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|''$|"$',
|
||||
\ 'rust': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|::$',
|
||||
\ 'cpp': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|::$|-\>$',
|
||||
\}
|
||||
|
||||
" Regular expressions for finding the start column to replace with completion.
|
||||
@ -64,6 +65,7 @@ let s:trigger_character_map = {
|
||||
\ '<default>': ['.'],
|
||||
\ 'typescript': ['.', '''', '"'],
|
||||
\ 'rust': ['.', '::'],
|
||||
\ 'cpp': ['.', '::', '->'],
|
||||
\}
|
||||
|
||||
function! s:GetFiletypeValue(map, filetype) abort
|
||||
|
@ -128,7 +128,7 @@ function! ale#events#Init() abort
|
||||
endif
|
||||
|
||||
if g:ale_lint_on_insert_leave
|
||||
autocmd InsertLeave * call ale#Queue(0)
|
||||
autocmd InsertLeave * if ale#Var(str2nr(expand('<abuf>')), 'lint_on_insert_leave') | call ale#Queue(0) | endif
|
||||
endif
|
||||
|
||||
if g:ale_echo_cursor || g:ale_cursor_detail
|
||||
|
@ -54,7 +54,7 @@ function! ale#fix#ApplyQueuedFixes(buffer) abort
|
||||
endif
|
||||
|
||||
if l:data.should_save
|
||||
let l:should_lint = g:ale_fix_on_save
|
||||
let l:should_lint = ale#Var(a:buffer, 'fix_on_save')
|
||||
\ && ale#Var(a:buffer, 'lint_on_save')
|
||||
else
|
||||
let l:should_lint = l:data.changes_made
|
||||
|
@ -145,6 +145,11 @@ let s:default_registry = {
|
||||
\ 'suggested_filetypes': ['php'],
|
||||
\ 'description': 'Fix PHP files with php-cs-fixer.',
|
||||
\ },
|
||||
\ 'clangtidy': {
|
||||
\ 'function': 'ale#fixers#clangtidy#Fix',
|
||||
\ 'suggested_filetypes': ['c', 'cpp', 'objc'],
|
||||
\ 'description': 'Fix C/C++ and ObjectiveC files with clang-tidy.',
|
||||
\ },
|
||||
\ 'clang-format': {
|
||||
\ 'function': 'ale#fixers#clangformat#Fix',
|
||||
\ 'suggested_filetypes': ['c', 'cpp', 'cuda'],
|
||||
@ -297,7 +302,7 @@ let s:default_registry = {
|
||||
\ },
|
||||
\ 'styler': {
|
||||
\ 'function': 'ale#fixers#styler#Fix',
|
||||
\ 'suggested_filetypes': ['r'],
|
||||
\ 'suggested_filetypes': ['r', 'rmarkdown'],
|
||||
\ 'description': 'Fix R files with styler.',
|
||||
\ },
|
||||
\ 'latexindent': {
|
||||
@ -310,6 +315,11 @@ let s:default_registry = {
|
||||
\ 'suggested_filetypes': ['sql'],
|
||||
\ 'description': 'A PostgreSQL SQL syntax beautifier',
|
||||
\ },
|
||||
\ 'reorder-python-imports': {
|
||||
\ 'function': 'ale#fixers#reorder_python_imports#Fix',
|
||||
\ 'suggested_filetypes': ['python'],
|
||||
\ 'description': 'Sort Python imports with reorder-python-imports.',
|
||||
\ },
|
||||
\}
|
||||
|
||||
" Reset the function registry to the default entries.
|
||||
|
52
sources_non_forked/ale/autoload/ale/fixers/clangtidy.vim
Normal file
52
sources_non_forked/ale/autoload/ale/fixers/clangtidy.vim
Normal file
@ -0,0 +1,52 @@
|
||||
scriptencoding utf-8
|
||||
" Author: ObserverOfTime <chronobserver@disroot.org>
|
||||
" Description: Fixing C/C++ files with clang-tidy.
|
||||
|
||||
function! s:set_variables() abort
|
||||
let l:use_global = get(g:, 'ale_use_global_executables', 0)
|
||||
|
||||
for l:ft in ['c', 'cpp']
|
||||
call ale#Set(l:ft . '_clangtidy_executable', 'clang-tidy')
|
||||
call ale#Set(l:ft . '_clangtidy_use_global', l:use_global)
|
||||
call ale#Set(l:ft . '_clangtidy_checks', [])
|
||||
call ale#Set(l:ft . '_clangtidy_options', '')
|
||||
call ale#Set(l:ft . '_clangtidy_extra_options', '')
|
||||
call ale#Set(l:ft . '_clangtidy_fix_errors', 1)
|
||||
endfor
|
||||
|
||||
call ale#Set('c_build_dir', '')
|
||||
endfunction
|
||||
|
||||
call s:set_variables()
|
||||
|
||||
function! ale#fixers#clangtidy#Var(buffer, name) abort
|
||||
let l:ft = getbufvar(str2nr(a:buffer), '&filetype')
|
||||
let l:ft = l:ft =~# 'cpp' ? 'cpp' : 'c'
|
||||
|
||||
return ale#Var(a:buffer, l:ft . '_clangtidy_' . a:name)
|
||||
endfunction
|
||||
|
||||
function! ale#fixers#clangtidy#GetCommand(buffer) abort
|
||||
let l:checks = join(ale#fixers#clangtidy#Var(a:buffer, 'checks'), ',')
|
||||
let l:extra_options = ale#fixers#clangtidy#Var(a:buffer, 'extra_options')
|
||||
let l:build_dir = ale#c#GetBuildDirectory(a:buffer)
|
||||
let l:options = empty(l:build_dir)
|
||||
\ ? ale#fixers#clangtidy#Var(a:buffer, 'options') : ''
|
||||
let l:fix_errors = ale#fixers#clangtidy#Var(a:buffer, 'fix_errors')
|
||||
|
||||
return ' -fix' . (l:fix_errors ? ' -fix-errors' : '')
|
||||
\ . (empty(l:checks) ? '' : ' -checks=' . ale#Escape(l:checks))
|
||||
\ . (empty(l:extra_options) ? '' : ' ' . l:extra_options)
|
||||
\ . (empty(l:build_dir) ? '' : ' -p ' . ale#Escape(l:build_dir))
|
||||
\ . ' %t' . (empty(l:options) ? '' : ' -- ' . l:options)
|
||||
endfunction
|
||||
|
||||
function! ale#fixers#clangtidy#Fix(buffer) abort
|
||||
let l:executable = ale#fixers#clangtidy#Var(a:buffer, 'executable')
|
||||
let l:command = ale#fixers#clangtidy#GetCommand(a:buffer)
|
||||
|
||||
return {
|
||||
\ 'command': ale#Escape(l:executable) . l:command,
|
||||
\ 'read_temporary_file': 1,
|
||||
\}
|
||||
endfunction
|
@ -39,9 +39,15 @@ function! ale#fixers#prettier#ApplyFixForVersion(buffer, version) abort
|
||||
let l:options = ale#Var(a:buffer, 'javascript_prettier_options')
|
||||
let l:parser = ''
|
||||
|
||||
let l:filetypes = split(getbufvar(a:buffer, '&filetype'), '\.')
|
||||
|
||||
if index(l:filetypes, 'handlebars') > -1
|
||||
let l:parser = 'glimmer'
|
||||
endif
|
||||
|
||||
" Append the --parser flag depending on the current filetype (unless it's
|
||||
" already set in g:javascript_prettier_options).
|
||||
if empty(expand('#' . a:buffer . ':e')) && match(l:options, '--parser') == -1
|
||||
if empty(expand('#' . a:buffer . ':e')) && l:parser is# '' && match(l:options, '--parser') == -1
|
||||
" Mimic Prettier's defaults. In cases without a file extension or
|
||||
" filetype (scratch buffer), Prettier needs `parser` set to know how
|
||||
" to process the buffer.
|
||||
@ -65,7 +71,7 @@ function! ale#fixers#prettier#ApplyFixForVersion(buffer, version) abort
|
||||
\ 'html': 'html',
|
||||
\}
|
||||
|
||||
for l:filetype in split(getbufvar(a:buffer, '&filetype'), '\.')
|
||||
for l:filetype in l:filetypes
|
||||
if has_key(l:prettier_parsers, l:filetype)
|
||||
let l:parser = l:prettier_parsers[l:filetype]
|
||||
break
|
||||
|
@ -0,0 +1,25 @@
|
||||
" Author: jake <me@jake.computer>
|
||||
" Description: Fixing Python imports with reorder-python-imports.
|
||||
|
||||
call ale#Set('python_reorder_python_imports_executable', 'reorder-python-imports')
|
||||
call ale#Set('python_reorder_python_imports_options', '')
|
||||
call ale#Set('python_reorder_python_imports_use_global', get(g:, 'ale_use_global_executables', 0))
|
||||
|
||||
function! ale#fixers#reorder_python_imports#Fix(buffer) abort
|
||||
let l:executable = ale#python#FindExecutable(
|
||||
\ a:buffer,
|
||||
\ 'python_reorder_python_imports',
|
||||
\ ['reorder-python-imports'],
|
||||
\)
|
||||
|
||||
if !executable(l:executable)
|
||||
return 0
|
||||
endif
|
||||
|
||||
let l:options = ale#Var(a:buffer, 'python_reorder_python_imports_options')
|
||||
|
||||
return {
|
||||
\ 'command': ale#Escape(l:executable)
|
||||
\ . (!empty(l:options) ? ' ' . l:options : '') . ' -',
|
||||
\}
|
||||
endfunction
|
@ -1,5 +1,46 @@
|
||||
" Description: Handle errors for cppcheck.
|
||||
|
||||
function! ale#handlers#cppcheck#GetCdCommand(buffer) abort
|
||||
let [l:dir, l:json_path] = ale#c#FindCompileCommands(a:buffer)
|
||||
let l:cd_command = !empty(l:dir) ? ale#path#CdString(l:dir) : ''
|
||||
|
||||
return l:cd_command
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#cppcheck#GetBufferPathIncludeOptions(buffer) abort
|
||||
let l:buffer_path_include = ''
|
||||
|
||||
" Get path to this buffer so we can include it into cppcheck with -I
|
||||
" This could be expanded to get more -I directives from the compile
|
||||
" command in compile_commands.json, if it's found.
|
||||
let l:buffer_path = fnamemodify(bufname(a:buffer), ':p:h')
|
||||
let l:buffer_path_include = ' -I' . ale#Escape(l:buffer_path)
|
||||
|
||||
return l:buffer_path_include
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#cppcheck#GetCompileCommandsOptions(buffer) abort
|
||||
" If the current buffer is modified, using compile_commands.json does no
|
||||
" good, so include the file's directory instead. It's not quite as good as
|
||||
" using --project, but is at least equivalent to running cppcheck on this
|
||||
" file manually from the file's directory.
|
||||
let l:modified = getbufvar(a:buffer, '&modified')
|
||||
|
||||
if l:modified
|
||||
return ''
|
||||
endif
|
||||
|
||||
" Search upwards from the file for compile_commands.json.
|
||||
"
|
||||
" If we find it, we'll `cd` to where the compile_commands.json file is,
|
||||
" then use the file to set up import paths, etc.
|
||||
let [l:dir, l:json_path] = ale#c#FindCompileCommands(a:buffer)
|
||||
|
||||
return !empty(l:json_path)
|
||||
\ ? '--project=' . ale#Escape(l:json_path[len(l:dir) + 1: ])
|
||||
\ : ''
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#cppcheck#HandleCppCheckFormat(buffer, lines) abort
|
||||
" Look for lines like the following.
|
||||
"
|
||||
|
@ -44,16 +44,9 @@ function! ale#handlers#eslint#GetCommand(buffer) abort
|
||||
|
||||
return ale#node#Executable(a:buffer, l:executable)
|
||||
\ . (!empty(l:options) ? ' ' . l:options : '')
|
||||
\ . ' -f unix --stdin --stdin-filename %s'
|
||||
\ . ' -f json --stdin --stdin-filename %s'
|
||||
endfunction
|
||||
|
||||
let s:col_end_patterns = [
|
||||
\ '\vParsing error: Unexpected token (.+) ?',
|
||||
\ '\v''(.+)'' is not defined.',
|
||||
\ '\v%(Unexpected|Redundant use of) [''`](.+)[''`]',
|
||||
\ '\vUnexpected (console) statement',
|
||||
\]
|
||||
|
||||
function! s:AddHintsForTypeScriptParsingErrors(output) abort
|
||||
for l:item in a:output
|
||||
let l:item.text = substitute(
|
||||
@ -90,22 +83,71 @@ function! s:CheckForBadConfig(buffer, lines) abort
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
if s:CheckForBadConfig(a:buffer, a:lines)
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(a:lines, "\n"),
|
||||
\}]
|
||||
function! s:parseJSON(buffer, lines) abort
|
||||
try
|
||||
let l:parsed = json_decode(a:lines[-1])
|
||||
catch
|
||||
return []
|
||||
endtry
|
||||
|
||||
if type(l:parsed) != v:t_list || empty(l:parsed)
|
||||
return []
|
||||
endif
|
||||
|
||||
if a:lines == ['Could not connect']
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'Could not connect to eslint_d. Try updating eslint_d or killing it.',
|
||||
\}]
|
||||
let l:errors = l:parsed[0]['messages']
|
||||
|
||||
if empty(l:errors)
|
||||
return []
|
||||
endif
|
||||
|
||||
let l:output = []
|
||||
|
||||
for l:error in l:errors
|
||||
let l:obj = ({
|
||||
\ 'lnum': get(l:error, 'line', 0),
|
||||
\ 'text': get(l:error, 'message', ''),
|
||||
\ 'type': 'E',
|
||||
\})
|
||||
|
||||
if get(l:error, 'severity', 0) is# 1
|
||||
let l:obj.type = 'W'
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'ruleId')
|
||||
let l:code = l:error['ruleId']
|
||||
|
||||
" Sometimes ESLint returns null here
|
||||
if !empty(l:code)
|
||||
let l:obj.code = l:code
|
||||
endif
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'column')
|
||||
let l:obj.col = l:error['column']
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'endColumn')
|
||||
let l:obj.end_col = l:error['endColumn'] - 1
|
||||
endif
|
||||
|
||||
if has_key(l:error, 'endLine')
|
||||
let l:obj.end_lnum = l:error['endLine']
|
||||
endif
|
||||
|
||||
call add(l:output, l:obj)
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
let s:col_end_patterns = [
|
||||
\ '\vParsing error: Unexpected token (.+) ?',
|
||||
\ '\v''(.+)'' is not defined.',
|
||||
\ '\v%(Unexpected|Redundant use of) [''`](.+)[''`]',
|
||||
\ '\vUnexpected (console) statement',
|
||||
\]
|
||||
|
||||
function! s:parseLines(buffer, lines) abort
|
||||
" Matches patterns line the following:
|
||||
"
|
||||
" /path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]
|
||||
@ -120,12 +162,6 @@ function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:parsing_pattern])
|
||||
let l:text = l:match[3]
|
||||
|
||||
if ale#Var(a:buffer, 'javascript_eslint_suppress_eslintignore')
|
||||
if l:text =~# '^File ignored'
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
|
||||
let l:obj = {
|
||||
\ 'lnum': l:match[1] + 0,
|
||||
\ 'col': l:match[2] + 0,
|
||||
@ -143,11 +179,6 @@ function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
" The code can be something like 'Error/foo/bar', or just 'Error'
|
||||
if !empty(get(l:split_code, 1))
|
||||
let l:obj.code = join(l:split_code[1:], '/')
|
||||
|
||||
if l:obj.code is# 'no-trailing-spaces'
|
||||
\&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
|
||||
continue
|
||||
endif
|
||||
endif
|
||||
|
||||
for l:col_match in ale#util#GetMatches(l:text, s:col_end_patterns)
|
||||
@ -157,9 +188,59 @@ function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
call add(l:output, l:obj)
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
function! s:FilterResult(buffer, obj) abort
|
||||
if ale#Var(a:buffer, 'javascript_eslint_suppress_eslintignore')
|
||||
if a:obj.text =~# '^File ignored'
|
||||
return 0
|
||||
endif
|
||||
endif
|
||||
|
||||
if has_key(a:obj, 'code') && a:obj.code is# 'no-trailing-spaces'
|
||||
\&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace')
|
||||
return 0
|
||||
endif
|
||||
|
||||
return 1
|
||||
endfunction
|
||||
|
||||
function! s:HandleESLintOutput(buffer, lines, type) abort
|
||||
if s:CheckForBadConfig(a:buffer, a:lines)
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'eslint configuration error (type :ALEDetail for more information)',
|
||||
\ 'detail': join(a:lines, "\n"),
|
||||
\}]
|
||||
endif
|
||||
|
||||
if a:lines == ['Could not connect']
|
||||
return [{
|
||||
\ 'lnum': 1,
|
||||
\ 'text': 'Could not connect to eslint_d. Try updating eslint_d or killing it.',
|
||||
\}]
|
||||
endif
|
||||
|
||||
if a:type is# 'json'
|
||||
let l:output = s:parseJSON(a:buffer, a:lines)
|
||||
else
|
||||
let l:output = s:parseLines(a:buffer, a:lines)
|
||||
endif
|
||||
|
||||
call filter(l:output, {idx, obj -> s:FilterResult(a:buffer, obj)})
|
||||
|
||||
if expand('#' . a:buffer . ':t') =~? '\.tsx\?$'
|
||||
call s:AddHintsForTypeScriptParsingErrors(l:output)
|
||||
endif
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#eslint#HandleJSON(buffer, lines) abort
|
||||
return s:HandleESLintOutput(a:buffer, a:lines, 'json')
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#eslint#Handle(buffer, lines) abort
|
||||
return s:HandleESLintOutput(a:buffer, a:lines, 'lines')
|
||||
endfunction
|
||||
|
@ -56,14 +56,20 @@ function! ale#handlers#rust#HandleRustErrors(buffer, lines) abort
|
||||
endif
|
||||
|
||||
if !empty(l:span)
|
||||
call add(l:output, {
|
||||
let l:output_line = {
|
||||
\ 'lnum': l:span.line_start,
|
||||
\ 'end_lnum': l:span.line_end,
|
||||
\ 'col': l:span.column_start,
|
||||
\ 'end_col': l:span.column_end-1,
|
||||
\ 'text': empty(l:span.label) ? l:error.message : printf('%s: %s', l:error.message, l:span.label),
|
||||
\ 'type': toupper(l:error.level[0]),
|
||||
\})
|
||||
\}
|
||||
|
||||
if has_key(l:error, 'rendered') && !empty(l:error.rendered)
|
||||
let l:output_line.detail = l:error.rendered
|
||||
endif
|
||||
|
||||
call add(l:output, l:output_line)
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
|
@ -52,7 +52,7 @@ endfunction
|
||||
|
||||
function! ale#highlight#RemoveHighlights() abort
|
||||
for l:match in getmatches()
|
||||
if l:match.group =~# '^ALE'
|
||||
if l:match.group =~? '\v^ALE(Style)?(Error|Warning|Info)(Line)?$'
|
||||
call matchdelete(l:match.id)
|
||||
endif
|
||||
endfor
|
||||
|
@ -16,5 +16,11 @@ function! ale#java#FindProjectRoot(buffer) abort
|
||||
return fnamemodify(l:maven_pom_file, ':h')
|
||||
endif
|
||||
|
||||
let l:ant_root = ale#ant#FindProjectRoot(a:buffer)
|
||||
|
||||
if !empty(l:ant_root)
|
||||
return l:ant_root
|
||||
endif
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
|
@ -13,10 +13,13 @@ let s:default_ale_linter_aliases = {
|
||||
\ 'Dockerfile': 'dockerfile',
|
||||
\ 'csh': 'sh',
|
||||
\ 'plaintex': 'tex',
|
||||
\ 'rmarkdown': 'r',
|
||||
\ 'systemverilog': 'verilog',
|
||||
\ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'],
|
||||
\ 'vimwiki': 'markdown',
|
||||
\ 'vue': ['vue', 'javascript'],
|
||||
\ 'xsd': ['xsd', 'xml'],
|
||||
\ 'xslt': ['xslt', 'xml'],
|
||||
\ 'zsh': 'sh',
|
||||
\}
|
||||
|
||||
@ -355,12 +358,14 @@ function! ale#linter#Define(filetype, linter) abort
|
||||
" This command will throw from the sandbox.
|
||||
let &l:equalprg=&l:equalprg
|
||||
|
||||
let l:new_linter = ale#linter#PreProcess(a:filetype, a:linter)
|
||||
|
||||
if !has_key(s:linters, a:filetype)
|
||||
let s:linters[a:filetype] = []
|
||||
endif
|
||||
|
||||
let l:new_linter = ale#linter#PreProcess(a:filetype, a:linter)
|
||||
|
||||
" Remove previously defined linters with the same name.
|
||||
call filter(s:linters[a:filetype], 'v:val.name isnot# a:linter.name')
|
||||
call add(s:linters[a:filetype], l:new_linter)
|
||||
endfunction
|
||||
|
||||
|
@ -71,8 +71,8 @@ function! s:FixList(buffer, list) abort
|
||||
return l:new_list
|
||||
endfunction
|
||||
|
||||
function! s:BufWinId(buffer) abort
|
||||
return exists('*bufwinid') ? bufwinid(str2nr(a:buffer)) : 0
|
||||
function! s:WinFindBuf(buffer) abort
|
||||
return exists('*win_findbuf') ? win_findbuf(str2nr(a:buffer)) : [0]
|
||||
endfunction
|
||||
|
||||
function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
||||
@ -88,17 +88,19 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
||||
call setqflist([], 'r', {'title': l:title})
|
||||
endif
|
||||
elseif g:ale_set_loclist
|
||||
" If windows support is off, bufwinid() may not exist.
|
||||
" If windows support is off, win_findbuf() may not exist.
|
||||
" We'll set result in the current window, which might not be correct,
|
||||
" but it's better than nothing.
|
||||
let l:id = s:BufWinId(a:buffer)
|
||||
let l:ids = s:WinFindBuf(a:buffer)
|
||||
|
||||
if has('nvim')
|
||||
call setloclist(l:id, s:FixList(a:buffer, a:loclist), ' ', l:title)
|
||||
else
|
||||
call setloclist(l:id, s:FixList(a:buffer, a:loclist))
|
||||
call setloclist(l:id, [], 'r', {'title': l:title})
|
||||
endif
|
||||
for l:id in l:ids
|
||||
if has('nvim')
|
||||
call setloclist(l:id, s:FixList(a:buffer, a:loclist), ' ', l:title)
|
||||
else
|
||||
call setloclist(l:id, s:FixList(a:buffer, a:loclist))
|
||||
call setloclist(l:id, [], 'r', {'title': l:title})
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
|
||||
" Open a window to show the problems if we need to.
|
||||
@ -108,8 +110,6 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
||||
if s:ShouldOpen(a:buffer) && !empty(a:loclist)
|
||||
let l:winnr = winnr()
|
||||
let l:mode = mode()
|
||||
let l:reset_visual_selection = l:mode is? 'v' || l:mode is# "\<c-v>"
|
||||
let l:reset_character_selection = l:mode is? 's' || l:mode is# "\<c-s>"
|
||||
|
||||
" open windows vertically instead of default horizontally
|
||||
let l:open_type = ''
|
||||
@ -131,12 +131,13 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
|
||||
wincmd p
|
||||
endif
|
||||
|
||||
if l:reset_visual_selection || l:reset_character_selection
|
||||
" If we were in a selection mode before, select the last selection.
|
||||
normal! gv
|
||||
|
||||
if l:reset_character_selection
|
||||
" Switch back to Select mode, if we were in that.
|
||||
" Return to original mode when applicable
|
||||
if mode() != l:mode
|
||||
if l:mode is? 'v' || l:mode is# "\<c-v>"
|
||||
" Reset our last visual selection
|
||||
normal! gv
|
||||
elseif l:mode is? 's' || l:mode is# "\<c-s>"
|
||||
" Reset our last character selection
|
||||
normal! "\<c-g>"
|
||||
endif
|
||||
endif
|
||||
@ -181,11 +182,13 @@ function! s:CloseWindowIfNeeded(buffer) abort
|
||||
cclose
|
||||
endif
|
||||
else
|
||||
let l:win_id = s:BufWinId(a:buffer)
|
||||
let l:win_ids = s:WinFindBuf(a:buffer)
|
||||
|
||||
if g:ale_set_loclist && empty(getloclist(l:win_id))
|
||||
lclose
|
||||
endif
|
||||
for l:win_id in l:win_ids
|
||||
if g:ale_set_loclist && empty(getloclist(l:win_id))
|
||||
lclose
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
" Ignore 'Cannot close last window' errors.
|
||||
catch /E444/
|
||||
|
@ -90,7 +90,7 @@ function! ale#lsp#response#ReadTSServerDiagnostics(response) abort
|
||||
\ 'lnum': l:diagnostic.start.line,
|
||||
\ 'col': l:diagnostic.start.offset,
|
||||
\ 'end_lnum': l:diagnostic.end.line,
|
||||
\ 'end_col': l:diagnostic.end.offset,
|
||||
\ 'end_col': l:diagnostic.end.offset - 1,
|
||||
\}
|
||||
|
||||
if has_key(l:diagnostic, 'code')
|
||||
|
@ -8,6 +8,9 @@ if !has_key(s:, 'lsp_linter_map')
|
||||
let s:lsp_linter_map = {}
|
||||
endif
|
||||
|
||||
" A Dictionary to track one-shot handlers for custom LSP requests
|
||||
let s:custom_handlers_map = get(s:, 'custom_handlers_map', {})
|
||||
|
||||
" Check if diagnostics for a particular linter should be ignored.
|
||||
function! s:ShouldIgnore(buffer, linter_name) abort
|
||||
" Ignore all diagnostics if LSP integration is disabled.
|
||||
@ -407,9 +410,57 @@ endfunction
|
||||
" Clear LSP linter data for the linting engine.
|
||||
function! ale#lsp_linter#ClearLSPData() abort
|
||||
let s:lsp_linter_map = {}
|
||||
let s:custom_handlers_map = {}
|
||||
endfunction
|
||||
|
||||
" Just for tests.
|
||||
function! ale#lsp_linter#SetLSPLinterMap(replacement_map) abort
|
||||
let s:lsp_linter_map = a:replacement_map
|
||||
endfunction
|
||||
|
||||
function! s:HandleLSPResponseToCustomRequests(conn_id, response) abort
|
||||
if has_key(a:response, 'id')
|
||||
\&& has_key(s:custom_handlers_map, a:response.id)
|
||||
let l:Handler = remove(s:custom_handlers_map, a:response.id)
|
||||
call l:Handler(a:response)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:OnReadyForCustomRequests(args, linter, lsp_details) abort
|
||||
let l:id = a:lsp_details.connection_id
|
||||
let l:request_id = ale#lsp#Send(l:id, a:args.message)
|
||||
|
||||
if l:request_id > 0 && has_key(a:args, 'handler')
|
||||
let l:Callback = function('s:HandleLSPResponseToCustomRequests')
|
||||
call ale#lsp#RegisterCallback(l:id, l:Callback)
|
||||
let s:custom_handlers_map[l:request_id] = a:args.handler
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Send a custom request to an LSP linter.
|
||||
function! ale#lsp_linter#SendRequest(buffer, linter_name, message, ...) abort
|
||||
let l:filetype = ale#linter#ResolveFiletype(getbufvar(a:buffer, '&filetype'))
|
||||
let l:linter_list = ale#linter#GetAll(l:filetype)
|
||||
let l:linter_list = filter(l:linter_list, {_, v -> v.name is# a:linter_name})
|
||||
|
||||
if len(l:linter_list) < 1
|
||||
throw 'Linter "' . a:linter_name . '" not found!'
|
||||
endif
|
||||
|
||||
let l:linter = l:linter_list[0]
|
||||
|
||||
if empty(l:linter.lsp)
|
||||
throw 'Linter "' . a:linter_name . '" does not support LSP!'
|
||||
endif
|
||||
|
||||
let l:is_notification = a:message[0]
|
||||
let l:callback_args = {'message': a:message}
|
||||
|
||||
if !l:is_notification && a:0
|
||||
let l:callback_args.handler = a:1
|
||||
endif
|
||||
|
||||
let l:Callback = function('s:OnReadyForCustomRequests', [l:callback_args])
|
||||
|
||||
return ale#lsp_linter#StartLSP(a:buffer, l:linter, l:Callback)
|
||||
endfunction
|
||||
|
@ -3,13 +3,20 @@
|
||||
|
||||
" simplify a path, and fix annoying issues with paths on Windows.
|
||||
"
|
||||
" Forward slashes are changed to back slashes so path equality works better.
|
||||
" Forward slashes are changed to back slashes so path equality works better
|
||||
" on Windows. Back slashes are changed to forward slashes on Unix.
|
||||
"
|
||||
" Unix paths can technically contain back slashes, but in practice no path
|
||||
" should, and replacing back slashes with forward slashes makes linters work
|
||||
" in environments like MSYS.
|
||||
"
|
||||
" Paths starting with more than one forward slash are changed to only one
|
||||
" forward slash, to prevent the paths being treated as special MSYS paths.
|
||||
function! ale#path#Simplify(path) abort
|
||||
if has('unix')
|
||||
return substitute(simplify(a:path), '^//\+', '/', 'g') " no-custom-checks
|
||||
let l:unix_path = substitute(a:path, '\\', '/', 'g')
|
||||
|
||||
return substitute(simplify(l:unix_path), '^//\+', '/', 'g') " no-custom-checks
|
||||
endif
|
||||
|
||||
let l:win_path = substitute(a:path, '/', '\\', 'g')
|
||||
|
Reference in New Issue
Block a user