Updated vim plugins

This commit is contained in:
Amir Salihefendic 2018-12-17 12:28:27 +01:00
parent d2d303593e
commit e99e9e9c3e
137 changed files with 2129 additions and 846 deletions

View file

@ -1,7 +1,8 @@
" Author: Jon Parise <jon@indelible.org> " Author: Jon Parise <jon@indelible.org>
" Description: elixir-ls integration (https://github.com/JakeBecker/elixir-ls) " Description: ElixirLS integration (https://github.com/JakeBecker/elixir-ls)
call ale#Set('elixir_elixir_ls_release', 'elixir-ls') call ale#Set('elixir_elixir_ls_release', 'elixir-ls')
call ale#Set('elixir_elixir_ls_config', {})
function! ale_linters#elixir#elixir_ls#GetExecutable(buffer) abort function! ale_linters#elixir#elixir_ls#GetExecutable(buffer) abort
let l:dir = ale#path#Simplify(ale#Var(a:buffer, 'elixir_elixir_ls_release')) let l:dir = ale#path#Simplify(ale#Var(a:buffer, 'elixir_elixir_ls_release'))
@ -15,5 +16,6 @@ call ale#linter#Define('elixir', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#elixir#elixir_ls#GetExecutable', \ 'executable_callback': 'ale_linters#elixir#elixir_ls#GetExecutable',
\ 'command_callback': 'ale_linters#elixir#elixir_ls#GetExecutable', \ 'command_callback': 'ale_linters#elixir#elixir_ls#GetExecutable',
\ 'project_root_callback': 'ale#handlers#elixir#FindMixProjectRoot', \ 'project_root_callback': 'ale#handlers#elixir#FindMixUmbrellaRoot',
\ 'lsp_config_callback': ale#VarFunc('elixir_elixir_ls_config'),
\}) \})

View file

@ -1,10 +1,21 @@
" Author: neersighted <bjorn@neersighted.com> " Author: neersighted <bjorn@neersighted.com>
" Description: golint for Go files " Description: golint for Go files
call ale#Set('go_golint_executable', 'golint')
call ale#Set('go_golint_options', '')
function! ale_linters#go#golint#GetCommand(buffer) abort
let l:options = ale#Var(a:buffer, 'go_golint_options')
return '%e'
\ . (!empty(l:options) ? ' ' . l:options : '')
\ . ' %t'
endfunction
call ale#linter#Define('go', { call ale#linter#Define('go', {
\ 'name': 'golint', \ 'name': 'golint',
\ 'output_stream': 'both', \ 'output_stream': 'both',
\ 'executable': 'golint', \ 'executable_callback': ale#VarFunc('go_golint_executable'),
\ 'command': 'golint %t', \ 'command_callback': 'ale_linters#go#golint#GetCommand',
\ 'callback': 'ale#handlers#unix#HandleAsWarning', \ 'callback': 'ale#handlers#unix#HandleAsWarning',
\}) \})

View file

@ -1,6 +1,12 @@
" Author: Patrick Lewis - https://github.com/patricklewis, thenoseman - https://github.com/thenoseman " Author: Patrick Lewis - https://github.com/patricklewis, thenoseman - https://github.com/thenoseman
" Description: haml-lint for Haml files " Description: haml-lint for Haml files
call ale#Set('haml_hamllint_executable', 'haml-lint')
function! ale_linters#haml#hamllint#GetExecutable(buffer) abort
return ale#Var(a:buffer, 'haml_hamllint_executable')
endfunction
function! ale_linters#haml#hamllint#GetCommand(buffer) abort function! ale_linters#haml#hamllint#GetCommand(buffer) abort
let l:prefix = '' let l:prefix = ''
@ -21,7 +27,7 @@ function! ale_linters#haml#hamllint#GetCommand(buffer) abort
endif endif
return (!empty(l:prefix) ? l:prefix . ' ' : '') return (!empty(l:prefix) ? l:prefix . ' ' : '')
\ . 'haml-lint' \ . ale_linters#haml#hamllint#GetExecutable(a:buffer)
\ . (!empty(l:hamllint_config_file_path) ? ' --config ' . ale#Escape(l:hamllint_config_file_path) : '') \ . (!empty(l:hamllint_config_file_path) ? ' --config ' . ale#Escape(l:hamllint_config_file_path) : '')
\ . ' %t' \ . ' %t'
endfunction endfunction
@ -45,7 +51,7 @@ endfunction
call ale#linter#Define('haml', { call ale#linter#Define('haml', {
\ 'name': 'hamllint', \ 'name': 'hamllint',
\ 'executable': 'haml-lint', \ 'executable_callback': 'ale_linters#haml#hamllint#GetExecutable',
\ 'command_callback': 'ale_linters#haml#hamllint#GetCommand', \ 'command_callback': 'ale_linters#haml#hamllint#GetCommand',
\ 'callback': 'ale_linters#haml#hamllint#Handle' \ 'callback': 'ale_linters#haml#hamllint#Handle'
\}) \})

View file

@ -2,9 +2,11 @@
" Description: checkstyle for Java files " Description: checkstyle for Java files
function! ale_linters#java#checkstyle#Handle(buffer, lines) abort function! ale_linters#java#checkstyle#Handle(buffer, lines) abort
let l:pattern = '\v\[(WARN|ERROR)\] [a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.*) \[(.+)\]$'
let l:output = [] let l:output = []
" modern checkstyle versions
let l:pattern = '\v\[(WARN|ERROR)\] [a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.*) \[(.+)\]$'
for l:match in ale#util#GetMatches(a:lines, l:pattern) for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, { call add(l:output, {
\ 'type': l:match[1] is? 'WARN' ? 'W' : 'E', \ 'type': l:match[1] is? 'WARN' ? 'W' : 'E',
@ -15,13 +17,24 @@ function! ale_linters#java#checkstyle#Handle(buffer, lines) abort
\}) \})
endfor endfor
" old checkstyle versions
let l:pattern = '\v(.+):(\d+): ([^:]+): (.+)$'
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'type': l:match[3] is? 'warning' ? 'W' : 'E',
\ 'lnum': l:match[2] + 0,
\ 'text': l:match[4],
\})
endfor
return l:output return l:output
endfunction endfunction
function! ale_linters#java#checkstyle#GetCommand(buffer) abort function! ale_linters#java#checkstyle#GetCommand(buffer) abort
return 'checkstyle ' return 'checkstyle '
\ . ale#Var(a:buffer, 'java_checkstyle_options') \ . ale#Var(a:buffer, 'java_checkstyle_options')
\ . ' %t' \ . ' %s'
endfunction endfunction
if !exists('g:ale_java_checkstyle_options') if !exists('g:ale_java_checkstyle_options')
@ -33,4 +46,5 @@ call ale#linter#Define('java', {
\ 'executable': 'checkstyle', \ 'executable': 'checkstyle',
\ 'command_callback': 'ale_linters#java#checkstyle#GetCommand', \ 'command_callback': 'ale_linters#java#checkstyle#GetCommand',
\ 'callback': 'ale_linters#java#checkstyle#Handle', \ 'callback': 'ale_linters#java#checkstyle#Handle',
\ 'lint_file': 1,
\}) \})

View file

@ -2,15 +2,17 @@
" Description: Support for the Java language server https://github.com/georgewfraser/vscode-javac " Description: Support for the Java language server https://github.com/georgewfraser/vscode-javac
call ale#Set('java_javalsp_jar', 'javacs.jar') call ale#Set('java_javalsp_jar', 'javacs.jar')
call ale#Set('java_javalsp_executable', 'java')
function! ale_linters#java#javalsp#Executable(buffer) abort function! ale_linters#java#javalsp#Executable(buffer) abort
return 'java' return ale#Var(a:buffer, 'java_javalsp_executable')
endfunction endfunction
function! ale_linters#java#javalsp#Command(buffer) abort function! ale_linters#java#javalsp#Command(buffer) abort
let l:jar = ale#Var(a:buffer, 'java_javalsp_jar') let l:jar = ale#Var(a:buffer, 'java_javalsp_jar')
let l:executable = ale_linters#java#javalsp#Executable(a:buffer)
return ale#Escape('java -cp ' . l:jar . ' -Xverify:none org.javacs.Main') return ale#Escape(l:executable) . ' -cp ' . l:jar . ' -Xverify:none org.javacs.Main'
endfunction endfunction
call ale#linter#Define('java', { call ale#linter#Define('java', {

View file

@ -1,6 +1,8 @@
" Author: Spencer Wood <https://github.com/scwood>, Adriaan Zonnenberg <amz@adriaan.xyz> " Author: Spencer Wood <https://github.com/scwood>, Adriaan Zonnenberg <amz@adriaan.xyz>
" Description: This file adds support for checking PHP with php-cli " Description: This file adds support for checking PHP with php-cli
call ale#Set('php_php_executable', 'php')
function! ale_linters#php#php#Handle(buffer, lines) abort function! ale_linters#php#php#Handle(buffer, lines) abort
" Matches patterns like the following: " Matches patterns like the following:
" "
@ -30,8 +32,8 @@ endfunction
call ale#linter#Define('php', { call ale#linter#Define('php', {
\ 'name': 'php', \ 'name': 'php',
\ 'executable': 'php', \ 'executable_callback': ale#VarFunc('php_php_executable'),
\ 'output_stream': 'stdout', \ 'output_stream': 'stdout',
\ 'command': 'php -l -d error_reporting=E_ALL -d display_errors=1 -d log_errors=0 --', \ 'command': '%e -l -d error_reporting=E_ALL -d display_errors=1 -d log_errors=0 --',
\ 'callback': 'ale_linters#php#php#Handle', \ 'callback': 'ale_linters#php#php#Handle',
\}) \})

View file

@ -6,15 +6,40 @@ let g:ale_php_phpstan_executable = get(g:, 'ale_php_phpstan_executable', 'phpsta
let g:ale_php_phpstan_level = get(g:, 'ale_php_phpstan_level', '4') let g:ale_php_phpstan_level = get(g:, 'ale_php_phpstan_level', '4')
let g:ale_php_phpstan_configuration = get(g:, 'ale_php_phpstan_configuration', '') let g:ale_php_phpstan_configuration = get(g:, 'ale_php_phpstan_configuration', '')
function! ale_linters#php#phpstan#GetCommand(buffer) abort function! ale_linters#php#phpstan#GetExecutable(buffer) abort
return ale#Var(a:buffer, 'php_phpstan_executable')
endfunction
function! ale_linters#php#phpstan#VersionCheck(buffer) abort
let l:executable = ale_linters#php#phpstan#GetExecutable(a:buffer)
" If we have previously stored the version number in a cache, then
" don't look it up again.
if ale#semver#HasVersion(l:executable)
" Returning an empty string skips this command.
return ''
endif
let l:executable = ale#Escape(l:executable)
return l:executable . ' --version'
endfunction
function! ale_linters#php#phpstan#GetCommand(buffer, version_output) abort
let l:configuration = ale#Var(a:buffer, 'php_phpstan_configuration') let l:configuration = ale#Var(a:buffer, 'php_phpstan_configuration')
let l:configuration_option = !empty(l:configuration) let l:configuration_option = !empty(l:configuration)
\ ? ' -c ' . l:configuration \ ? ' -c ' . l:configuration
\ : '' \ : ''
let l:executable = ale_linters#php#phpstan#GetExecutable(a:buffer)
let l:version = ale#semver#GetVersion(l:executable, a:version_output)
let l:error_format = ale#semver#GTE(l:version, [0, 10, 3])
\ ? ' --error-format raw'
\ : ' --errorFormat raw'
return '%e analyze -l' return '%e analyze -l'
\ . ale#Var(a:buffer, 'php_phpstan_level') \ . ale#Var(a:buffer, 'php_phpstan_level')
\ . ' --errorFormat raw' \ . l:error_format
\ . l:configuration_option \ . l:configuration_option
\ . ' %s' \ . ' %s'
endfunction endfunction
@ -40,7 +65,10 @@ endfunction
call ale#linter#Define('php', { call ale#linter#Define('php', {
\ 'name': 'phpstan', \ 'name': 'phpstan',
\ 'executable_callback': ale#VarFunc('php_phpstan_executable'), \ 'executable_callback': 'ale_linters#php#phpstan#GetExecutable',
\ 'command_callback': 'ale_linters#php#phpstan#GetCommand', \ 'command_chain': [
\ {'callback': 'ale_linters#php#phpstan#VersionCheck'},
\ {'callback': 'ale_linters#php#phpstan#GetCommand'},
\ ],
\ 'callback': 'ale_linters#php#phpstan#Handle', \ 'callback': 'ale_linters#php#phpstan#Handle',
\}) \})

View file

@ -110,6 +110,7 @@ function! ale_linters#python#flake8#Handle(buffer, lines) abort
let l:item = { let l:item = {
\ 'lnum': l:match[1] + 0, \ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 0, \ 'col': l:match[2] + 0,
\ 'vcol': 1,
\ 'text': l:match[4], \ 'text': l:match[4],
\ 'code': l:code, \ 'code': l:code,
\ 'type': 'W', \ 'type': 'W',

View file

@ -13,36 +13,6 @@ function! ale_linters#ruby#rubocop#GetCommand(buffer) abort
\ . ' --stdin ' . ale#Escape(expand('#' . a:buffer . ':p')) \ . ' --stdin ' . ale#Escape(expand('#' . a:buffer . ':p'))
endfunction endfunction
function! ale_linters#ruby#rubocop#Handle(buffer, lines) abort
try
let l:errors = json_decode(a:lines[0])
catch
return []
endtry
if !has_key(l:errors, 'summary')
\|| l:errors['summary']['offense_count'] == 0
\|| empty(l:errors['files'])
return []
endif
let l:output = []
for l:error in l:errors['files'][0]['offenses']
let l:start_col = l:error['location']['column'] + 0
call add(l:output, {
\ 'lnum': l:error['location']['line'] + 0,
\ 'col': l:start_col,
\ 'end_col': l:start_col + l:error['location']['length'] - 1,
\ 'code': l:error['cop_name'],
\ 'text': l:error['message'],
\ 'type': ale_linters#ruby#rubocop#GetType(l:error['severity']),
\})
endfor
return l:output
endfunction
function! ale_linters#ruby#rubocop#GetType(severity) abort function! ale_linters#ruby#rubocop#GetType(severity) abort
if a:severity is? 'convention' if a:severity is? 'convention'
\|| a:severity is? 'warning' \|| a:severity is? 'warning'
@ -57,5 +27,5 @@ call ale#linter#Define('ruby', {
\ 'name': 'rubocop', \ 'name': 'rubocop',
\ 'executable_callback': ale#VarFunc('ruby_rubocop_executable'), \ 'executable_callback': ale#VarFunc('ruby_rubocop_executable'),
\ 'command_callback': 'ale_linters#ruby#rubocop#GetCommand', \ 'command_callback': 'ale_linters#ruby#rubocop#GetCommand',
\ 'callback': 'ale_linters#ruby#rubocop#Handle', \ 'callback': 'ale#ruby#HandleRubocopOutput',
\}) \})

View file

@ -1,9 +1,28 @@
" Author: KabbAmine - https://github.com/KabbAmine, " Author: sQVe - https://github.com/sQVe
" Ben Falconer <ben@falconers.me.uk>
call ale#Set('sass_sasslint_executable', 'sass-lint')
call ale#Set('sass_sasslint_options', '')
call ale#Set('sass_sasslint_use_global', get(g:, 'ale_use_global_executables', 0))
function! ale_linters#sass#sasslint#GetExecutable(buffer) abort
return ale#node#FindExecutable(a:buffer, 'sass_sasslint', [
\ 'node_modules/sass-lint/bin/sass-lint.js',
\ 'node_modules/.bin/sass-lint',
\])
endfunction
function! ale_linters#sass#sasslint#GetCommand(buffer) abort
let l:executable = ale_linters#sass#sasslint#GetExecutable(a:buffer)
let l:options = ale#Var(a:buffer, 'sass_sasslint_options')
return ale#node#Executable(a:buffer, l:executable)
\ . (!empty(l:options) ? ' ' . l:options : '')
\ . ' -v -q -f compact %t'
endfunction
call ale#linter#Define('sass', { call ale#linter#Define('sass', {
\ 'name': 'sasslint', \ 'name': 'sasslint',
\ 'executable': 'sass-lint', \ 'executable_callback': 'ale_linters#sass#sasslint#GetExecutable',
\ 'command_callback': 'ale#handlers#sasslint#GetCommand', \ 'command_callback': 'ale_linters#sass#sasslint#GetCommand',
\ 'callback': 'ale#handlers#css#HandleCSSLintFormat', \ 'callback': 'ale#handlers#css#HandleCSSLintFormat',
\}) \})

View file

@ -1,18 +1,28 @@
" Author: KabbAmine - https://github.com/KabbAmine, Ben Falconer " Author: sQVe - https://github.com/sQVe
" <ben@falconers.me.uk>
call ale#Set('scss_sasslint_executable', 'sass-lint')
call ale#Set('scss_sasslint_options', '')
call ale#Set('scss_sasslint_use_global', get(g:, 'ale_use_global_executables', 0))
function! ale_linters#scss#sasslint#GetExecutable(buffer) abort
return ale#node#FindExecutable(a:buffer, 'scss_sasslint', [
\ 'node_modules/sass-lint/bin/sass-lint.js',
\ 'node_modules/.bin/sass-lint',
\])
endfunction
function! ale_linters#scss#sasslint#GetCommand(buffer) abort function! ale_linters#scss#sasslint#GetCommand(buffer) abort
return ale#path#BufferCdString(a:buffer) let l:executable = ale_linters#scss#sasslint#GetExecutable(a:buffer)
\ . ale#Escape('sass-lint') let l:options = ale#Var(a:buffer, 'scss_sasslint_options')
\ . ' -v'
\ . ' -q' return ale#node#Executable(a:buffer, l:executable)
\ . ' -f compact' \ . (!empty(l:options) ? ' ' . l:options : '')
\ . ' %t' \ . ' -v -q -f compact %t'
endfunction endfunction
call ale#linter#Define('scss', { call ale#linter#Define('scss', {
\ 'name': 'sasslint', \ 'name': 'sasslint',
\ 'executable': 'sass-lint', \ 'executable_callback': 'ale_linters#scss#sasslint#GetExecutable',
\ 'command_callback': 'ale_linters#scss#sasslint#GetCommand', \ 'command_callback': 'ale_linters#scss#sasslint#GetCommand',
\ 'callback': 'ale#handlers#css#HandleCSSLintFormat', \ 'callback': 'ale#handlers#css#HandleCSSLintFormat',
\}) \})

View file

@ -1,6 +1,24 @@
" Author: David Mohundro <david@mohundro.com> " Author: David Mohundro <david@mohundro.com>, Gordon Fontenot <gordon@fonten.io>
" Description: swiftlint for swift files " Description: swiftlint for swift files
call ale#Set('swift_swiftlint_executable', 'swiftlint')
call ale#Set('swift_swiftlint_use_global', get(g:, 'ale_use_global_executables', 0))
function! ale_linters#swift#swiftlint#GetExecutable(buffer) abort
return ale#node#FindExecutable(a:buffer, 'swift_swiftlint', [
\ 'Pods/SwiftLint/swiftlint',
\ 'ios/Pods/SwiftLint/swiftlint',
\ 'swiftlint',
\])
endfunction
function! ale_linters#swift#swiftlint#GetCommand(buffer) abort
let l:executable = ale_linters#swift#swiftlint#GetExecutable(a:buffer)
let l:args = 'lint --use-stdin'
return ale#Escape(l:executable)
\ . ' ' .l:args
endfunction
function! ale_linters#swift#swiftlint#Handle(buffer, lines) abort function! ale_linters#swift#swiftlint#Handle(buffer, lines) abort
let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$' let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$'
@ -45,7 +63,7 @@ endfunction
call ale#linter#Define('swift', { call ale#linter#Define('swift', {
\ 'name': 'swiftlint', \ 'name': 'swiftlint',
\ 'executable': 'swiftlint', \ 'executable_callback': 'ale_linters#swift#swiftlint#GetExecutable',
\ 'command': 'swiftlint lint --use-stdin', \ 'command_callback': 'ale_linters#swift#swiftlint#GetCommand',
\ 'callback': 'ale_linters#swift#swiftlint#Handle', \ 'callback': 'ale_linters#swift#swiftlint#Handle',
\}) \})

View file

@ -8,20 +8,26 @@ function! ale_linters#tex#lacheck#Handle(buffer, lines) abort
" "
" "book.tex", line 37: possible unwanted space at "{" " "book.tex", line 37: possible unwanted space at "{"
" "book.tex", line 38: missing `\ ' after "etc." " "book.tex", line 38: missing `\ ' after "etc."
let l:pattern = '^".\+", line \(\d\+\): \(.\+\)$' let l:pattern = '^"\(.\+\)", line \(\d\+\): \(.\+\)$'
let l:output = [] let l:output = []
for l:match in ale#util#GetMatches(a:lines, l:pattern) for l:match in ale#util#GetMatches(a:lines, l:pattern)
" lacheck follows `\input{}` commands. If the cwd is not the same as the " lacheck follows `\input{}` commands. If the cwd is not the same as the
" file in the buffer then it will fail to find the inputed items. We do not " file in the buffer then it will fail to find the inputed items. We do not
" want warnings from those items anyway " want warnings from those items anyway
if !empty(matchstr(l:match[2], '^Could not open ".\+"$')) if !empty(matchstr(l:match[3], '^Could not open ".\+"$'))
continue
endif
" lacheck follows `\input{}` commands. We are only interested in
" reporting errors for the current buffer only.
if empty(matchstr(fnamemodify(l:match[1], ':t'), fnamemodify(bufname(a:buffer), ':t')))
continue continue
endif endif
call add(l:output, { call add(l:output, {
\ 'lnum': l:match[1] + 0, \ 'lnum': l:match[2] + 0,
\ 'text': l:match[2], \ 'text': l:match[3],
\ 'type': 'W', \ 'type': 'W',
\}) \})
endfor endfor

View file

@ -50,12 +50,17 @@ function! ale#c#ParseCFlags(path_prefix, cflag_line) abort
let l:cflags_list = [] let l:cflags_list = []
let l:previous_options = [] let l:previous_options = []
for l:option in split(a:cflag_line, '-') let l:split_lines = split(a:cflag_line, '-')
let l:option_index = 0
while l:option_index < len(l:split_lines)
let l:option = l:split_lines[l:option_index]
let l:option_index = l:option_index + 1
call add(l:previous_options, l:option) call add(l:previous_options, l:option)
" Check if cflag contained a '-' and should not have been splitted " Check if cflag contained a '-' and should not have been splitted
let l:option_list = split(l:option, '\zs') let l:option_list = split(l:option, '\zs')
if len(l:option_list) > 0 && l:option_list[-1] isnot# ' ' if len(l:option_list) > 0 && l:option_list[-1] isnot# ' ' && l:option_index < len(l:split_lines)
continue continue
endif endif
@ -81,7 +86,7 @@ function! ale#c#ParseCFlags(path_prefix, cflag_line) abort
call add(l:cflags_list, l:option) call add(l:cflags_list, l:option)
endif endif
endif endif
endfor endwhile
return join(l:cflags_list, ' ') return join(l:cflags_list, ' ')
endfunction endfunction

View file

@ -52,16 +52,6 @@ function! ale#cursor#TruncatedEcho(original_message) abort
endtry endtry
endfunction endfunction
function! s:FindItemAtCursor(buffer) abort
let l:info = get(g:ale_buffer_info, a:buffer, {})
let l:loclist = get(l:info, 'loclist', [])
let l:pos = getcurpos()
let l:index = ale#util#BinarySearch(l:loclist, a:buffer, l:pos[1], l:pos[2])
let l:loc = l:index >= 0 ? l:loclist[l:index] : {}
return [l:info, l:loc]
endfunction
function! s:StopCursorTimer() abort function! s:StopCursorTimer() abort
if s:cursor_timer != -1 if s:cursor_timer != -1
call timer_stop(s:cursor_timer) call timer_stop(s:cursor_timer)
@ -85,7 +75,7 @@ function! ale#cursor#EchoCursorWarning(...) abort
return return
endif endif
let [l:info, l:loc] = s:FindItemAtCursor(l:buffer) let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer)
if g:ale_echo_cursor if g:ale_echo_cursor
if !empty(l:loc) if !empty(l:loc)
@ -169,7 +159,7 @@ function! ale#cursor#ShowCursorDetail() abort
call s:StopCursorTimer() call s:StopCursorTimer()
let [l:info, l:loc] = s:FindItemAtCursor(l:buffer) let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer)
if !empty(l:loc) if !empty(l:loc)
call s:ShowCursorDetailForItem(l:loc, {'stay_here': 0}) call s:ShowCursorDetailForItem(l:loc, {'stay_here': 0})

View file

@ -22,14 +22,14 @@ let s:global_variable_list = [
\ 'ale_lint_delay', \ 'ale_lint_delay',
\ 'ale_lint_on_enter', \ 'ale_lint_on_enter',
\ 'ale_lint_on_filetype_changed', \ 'ale_lint_on_filetype_changed',
\ 'ale_lint_on_insert_leave',
\ 'ale_lint_on_save', \ 'ale_lint_on_save',
\ 'ale_lint_on_text_changed', \ 'ale_lint_on_text_changed',
\ 'ale_lint_on_insert_leave',
\ 'ale_linter_aliases', \ 'ale_linter_aliases',
\ 'ale_linters', \ 'ale_linters',
\ 'ale_linters_explicit', \ 'ale_linters_explicit',
\ 'ale_list_window_size',
\ 'ale_list_vertical', \ 'ale_list_vertical',
\ 'ale_list_window_size',
\ 'ale_loclist_msg_format', \ 'ale_loclist_msg_format',
\ 'ale_max_buffer_history_size', \ 'ale_max_buffer_history_size',
\ 'ale_max_signs', \ 'ale_max_signs',
@ -52,6 +52,7 @@ let s:global_variable_list = [
\ 'ale_statusline_format', \ 'ale_statusline_format',
\ 'ale_type_map', \ 'ale_type_map',
\ 'ale_use_global_executables', \ 'ale_use_global_executables',
\ 'ale_virtualtext_cursor',
\ 'ale_warn_about_trailing_blank_lines', \ 'ale_warn_about_trailing_blank_lines',
\ 'ale_warn_about_trailing_whitespace', \ 'ale_warn_about_trailing_whitespace',
\] \]
@ -236,10 +237,11 @@ function! ale#debugging#Info() abort
endfunction endfunction
function! ale#debugging#InfoToClipboard() abort function! ale#debugging#InfoToClipboard() abort
redir @+> redir => l:output
silent call ale#debugging#Info() silent call ale#debugging#Info()
redir END redir END
let @+ = l:output
call s:Echo('ALEInfo copied to your clipboard') call s:Echo('ALEInfo copied to your clipboard')
endfunction endfunction

View file

@ -304,6 +304,12 @@ function! ale#engine#SetResults(buffer, loclist) abort
call ale#cursor#EchoCursorWarning() call ale#cursor#EchoCursorWarning()
endif endif
if g:ale_virtualtext_cursor
" Try and show the warning now.
" This will only do something meaningful if we're in normal mode.
call ale#virtualtext#ShowCursorWarning()
endif
" Reset the save event marker, used for opening windows, etc. " Reset the save event marker, used for opening windows, etc.
call setbufvar(a:buffer, 'ale_save_event_fired', 0) call setbufvar(a:buffer, 'ale_save_event_fired', 0)
" Set a marker showing how many times a buffer has been checked. " Set a marker showing how many times a buffer has been checked.

View file

@ -29,7 +29,7 @@ function! ale#events#SaveEvent(buffer) abort
call setbufvar(a:buffer, 'ale_save_event_fired', 1) call setbufvar(a:buffer, 'ale_save_event_fired', 1)
endif endif
if ale#Var(a:buffer, 'fix_on_save') if ale#Var(a:buffer, 'fix_on_save') && !ale#events#QuitRecently(a:buffer)
let l:will_fix = ale#fix#Fix(a:buffer, 'save_file') let l:will_fix = ale#fix#Fix(a:buffer, 'save_file')
let l:should_lint = l:should_lint && !l:will_fix let l:should_lint = l:should_lint && !l:will_fix
endif endif
@ -139,6 +139,14 @@ function! ale#events#Init() abort
autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarning() | endif autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarning() | endif
endif endif
if g:ale_virtualtext_cursor
autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarningWithDelay() | endif
" Look for a warning to echo as soon as we leave Insert mode.
" The script's position variable used when moving the cursor will
" not be changed here.
autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarning() | endif
endif
if g:ale_close_preview_on_insert if g:ale_close_preview_on_insert
autocmd InsertEnter * if exists('*ale#preview#CloseIfTypeMatches') | call ale#preview#CloseIfTypeMatches('ale-preview') | endif autocmd InsertEnter * if exists('*ale#preview#CloseIfTypeMatches') | call ale#preview#CloseIfTypeMatches('ale-preview') | endif
endif endif

View file

@ -17,6 +17,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['python'], \ 'suggested_filetypes': ['python'],
\ 'description': 'Fix PEP8 issues with autopep8.', \ 'description': 'Fix PEP8 issues with autopep8.',
\ }, \ },
\ 'bibclean': {
\ 'function': 'ale#fixers#bibclean#Fix',
\ 'suggested_filetypes': ['bib'],
\ 'description': 'Format bib files using bibclean.',
\ },
\ 'black': { \ 'black': {
\ 'function': 'ale#fixers#black#Fix', \ 'function': 'ale#fixers#black#Fix',
\ 'suggested_filetypes': ['python'], \ 'suggested_filetypes': ['python'],
@ -56,7 +61,7 @@ let s:default_registry = {
\ }, \ },
\ 'prettier': { \ 'prettier': {
\ 'function': 'ale#fixers#prettier#Fix', \ 'function': 'ale#fixers#prettier#Fix',
\ 'suggested_filetypes': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'json5', 'graphql', 'markdown', 'vue'], \ 'suggested_filetypes': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'json5', 'graphql', 'markdown', 'vue', 'html', 'yaml'],
\ 'description': 'Apply prettier to a file.', \ 'description': 'Apply prettier to a file.',
\ }, \ },
\ 'prettier_eslint': { \ 'prettier_eslint': {
@ -110,6 +115,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['javascript'], \ 'suggested_filetypes': ['javascript'],
\ 'description': 'Fix JavaScript files using standard --fix', \ 'description': 'Fix JavaScript files using standard --fix',
\ }, \ },
\ 'standardrb': {
\ 'function': 'ale#fixers#standardrb#Fix',
\ 'suggested_filetypes': ['ruby'],
\ 'description': 'Fix ruby files with standardrb --fix',
\ },
\ 'stylelint': { \ 'stylelint': {
\ 'function': 'ale#fixers#stylelint#Fix', \ 'function': 'ale#fixers#stylelint#Fix',
\ 'suggested_filetypes': ['css', 'sass', 'scss', 'stylus'], \ 'suggested_filetypes': ['css', 'sass', 'scss', 'stylus'],

View file

@ -5,14 +5,14 @@ call ale#Set('ocaml_ocamlformat_executable', 'ocamlformat')
call ale#Set('ocaml_ocamlformat_options', '') call ale#Set('ocaml_ocamlformat_options', '')
function! ale#fixers#ocamlformat#Fix(buffer) abort function! ale#fixers#ocamlformat#Fix(buffer) abort
let l:filename = expand('#' . a:buffer . ':p')
let l:executable = ale#Var(a:buffer, 'ocaml_ocamlformat_executable') let l:executable = ale#Var(a:buffer, 'ocaml_ocamlformat_executable')
let l:options = ale#Var(a:buffer, 'ocaml_ocamlformat_options') let l:options = ale#Var(a:buffer, 'ocaml_ocamlformat_options')
return { return {
\ 'command': ale#Escape(l:executable) \ 'command': ale#Escape(l:executable)
\ . (empty(l:options) ? '' : ' ' . l:options) \ . (empty(l:options) ? '' : ' ' . l:options)
\ . ' --inplace' \ . ' --name=' . ale#Escape(l:filename)
\ . ' %t', \ . ' -'
\ 'read_temporary_file': 1,
\} \}
endfunction endfunction

View file

@ -58,6 +58,7 @@ function! ale#fixers#prettier#ApplyFixForVersion(buffer, version_output) abort
\ 'markdown': 'markdown', \ 'markdown': 'markdown',
\ 'vue': 'vue', \ 'vue': 'vue',
\ 'yaml': 'yaml', \ 'yaml': 'yaml',
\ 'html': 'html',
\} \}
let l:parser = '' let l:parser = ''

View file

@ -1,7 +1,8 @@
" Author: Matteo Centenaro (bugant) - https://github.com/bugant " Author: Matteo Centenaro (bugant) - https://github.com/bugant
" " Author: Jon Parise <jon@indelible.org>
" Description: find the root directory for an elixir project that uses mix " Description: Functions for working with Elixir projects
" Find the root directory for an elixir project that uses mix.
function! ale#handlers#elixir#FindMixProjectRoot(buffer) abort function! ale#handlers#elixir#FindMixProjectRoot(buffer) abort
let l:mix_file = ale#path#FindNearestFile(a:buffer, 'mix.exs') let l:mix_file = ale#path#FindNearestFile(a:buffer, 'mix.exs')
@ -11,3 +12,17 @@ function! ale#handlers#elixir#FindMixProjectRoot(buffer) abort
return '.' return '.'
endfunction endfunction
" Similar to ale#handlers#elixir#FindMixProjectRoot but also continue the
" search upward for a potential umbrella project root. If an umbrella root
" does not exist, the initial project root will be returned.
function! ale#handlers#elixir#FindMixUmbrellaRoot(buffer) abort
let l:app_root = ale#handlers#elixir#FindMixProjectRoot(a:buffer)
let l:umbrella_root = fnamemodify(l:app_root, ':h:h')
if filereadable(l:umbrella_root . '/mix.exs')
return l:umbrella_root
endif
return l:app_root
endfunction

View file

@ -1,8 +0,0 @@
" Author: KabbAmine - https://github.com/KabbAmine,
" Ben Falconer <ben@falconers.me.uk>
function! ale#handlers#sasslint#GetCommand(buffer) abort
return ale#path#BufferCdString(a:buffer)
\ . ale#Escape('sass-lint')
\ . ' -v -q -f compact %t'
endfunction

View file

@ -24,7 +24,21 @@ function! ale#hover#HandleTSServerResponse(conn_id, response) abort
if get(a:response, 'success', v:false) is v:true if get(a:response, 'success', v:false) is v:true
\&& get(a:response, 'body', v:null) isnot v:null \&& get(a:response, 'body', v:null) isnot v:null
if get(l:options, 'hover_from_balloonexpr', 0) " If we pass the show_documentation flag, we should show the full
" documentation, and always in the preview window.
if get(l:options, 'show_documentation', 0)
let l:documentation = get(a:response.body, 'documentation', '')
" displayString is not included here, because it can be very
" noisy and run on for many lines for complex types. A less
" verbose alternative may be nice in future.
if !empty(l:documentation)
call ale#preview#Show(split(l:documentation, "\n"), {
\ 'filetype': 'ale-preview.message',
\ 'stay_here': 1,
\})
endif
elseif get(l:options, 'hover_from_balloonexpr', 0)
\&& exists('*balloon_show') \&& exists('*balloon_show')
\&& ale#Var(l:options.buffer, 'set_balloons') \&& ale#Var(l:options.buffer, 'set_balloons')
call balloon_show(a:response.body.displayString) call balloon_show(a:response.body.displayString)
@ -126,6 +140,7 @@ function! s:OnReady(linter, lsp_details, line, column, opt, ...) abort
\ 'line': a:line, \ 'line': a:line,
\ 'column': l:column, \ 'column': l:column,
\ 'hover_from_balloonexpr': get(a:opt, 'called_from_balloonexpr', 0), \ 'hover_from_balloonexpr': get(a:opt, 'called_from_balloonexpr', 0),
\ 'show_documentation': get(a:opt, 'show_documentation', 0),
\} \}
endfunction endfunction
@ -153,9 +168,30 @@ endfunction
" - in the balloon if opt.called_from_balloonexpr and balloon_show is detected " - in the balloon if opt.called_from_balloonexpr and balloon_show is detected
" - as status message otherwise " - as status message otherwise
function! ale#hover#Show(buffer, line, col, opt) abort function! ale#hover#Show(buffer, line, col, opt) abort
let l:show_documentation = get(a:opt, 'show_documentation', 0)
for l:linter in ale#linter#Get(getbufvar(a:buffer, '&filetype')) for l:linter in ale#linter#Get(getbufvar(a:buffer, '&filetype'))
" Only tsserver supports documentation requests at the moment.
if !empty(l:linter.lsp) if !empty(l:linter.lsp)
\&& (!l:show_documentation || l:linter.lsp is# 'tsserver')
call s:ShowDetails(l:linter, a:buffer, a:line, a:col, a:opt) call s:ShowDetails(l:linter, a:buffer, a:line, a:col, a:opt)
endif endif
endfor endfor
endfunction endfunction
" This function implements the :ALEHover command.
function! ale#hover#ShowAtCursor() abort
let l:buffer = bufnr('')
let l:pos = getcurpos()
call ale#hover#Show(l:buffer, l:pos[1], l:pos[2], {})
endfunction
" This function implements the :ALEDocumentation command.
function! ale#hover#ShowDocumentationAtCursor() abort
let l:buffer = bufnr('')
let l:pos = getcurpos()
let l:options = {'show_documentation': 1}
call ale#hover#Show(l:buffer, l:pos[1], l:pos[2], l:options)
endfunction

View file

@ -16,6 +16,7 @@ let s:default_ale_linter_aliases = {
\ 'systemverilog': 'verilog', \ 'systemverilog': 'verilog',
\ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'], \ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'],
\ 'vimwiki': 'markdown', \ 'vimwiki': 'markdown',
\ 'vue': ['vue', 'javascript'],
\ 'zsh': 'sh', \ 'zsh': 'sh',
\} \}
@ -31,6 +32,7 @@ let s:default_ale_linter_aliases = {
" NOTE: Update the g:ale_linters documentation when modifying this. " NOTE: Update the g:ale_linters documentation when modifying this.
let s:default_ale_linters = { let s:default_ale_linters = {
\ 'csh': ['shell'], \ 'csh': ['shell'],
\ 'elixir': ['credo', 'dialyxir', 'dogma', 'elixir-ls'],
\ 'go': ['gofmt', 'golint', 'go vet'], \ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'], \ 'hack': ['hack'],
\ 'help': [], \ 'help': [],
@ -40,6 +42,7 @@ let s:default_ale_linters = {
\ 'rust': ['cargo'], \ 'rust': ['cargo'],
\ 'spec': [], \ 'spec': [],
\ 'text': [], \ 'text': [],
\ 'vue': ['eslint', 'vls'],
\ 'zsh': ['shell'], \ 'zsh': ['shell'],
\} \}

View file

@ -66,6 +66,10 @@ function! ale#lsp#response#ReadDiagnostics(response) abort
let l:loclist_item.detail = l:diagnostic.message . "\n" . join(l:related, "\n") let l:loclist_item.detail = l:diagnostic.message . "\n" . join(l:related, "\n")
endif endif
if has_key(l:diagnostic, 'source')
let l:loclist_item.detail = printf('[%s] %s', l:diagnostic.source, l:diagnostic.message)
endif
call add(l:loclist, l:loclist_item) call add(l:loclist, l:loclist_item)
endfor endfor

View file

@ -42,3 +42,35 @@ function! ale#ruby#FindProjectRoot(buffer) abort
return '' return ''
endfunction endfunction
" Handle output from rubocop and linters that depend on it (e.b. standardrb)
function! ale#ruby#HandleRubocopOutput(buffer, lines) abort
try
let l:errors = json_decode(a:lines[0])
catch
return []
endtry
if !has_key(l:errors, 'summary')
\|| l:errors['summary']['offense_count'] == 0
\|| empty(l:errors['files'])
return []
endif
let l:output = []
for l:error in l:errors['files'][0]['offenses']
let l:start_col = l:error['location']['column'] + 0
call add(l:output, {
\ 'lnum': l:error['location']['line'] + 0,
\ 'col': l:start_col,
\ 'end_col': l:start_col + l:error['location']['length'] - 1,
\ 'code': l:error['cop_name'],
\ 'text': l:error['message'],
\ 'type': ale_linters#ruby#rubocop#GetType(l:error['severity']),
\})
endfor
return l:output
endfunction

View file

@ -75,3 +75,13 @@ function! ale#test#GetQflistWithoutModule() abort
return l:results return l:results
endfunction endfunction
function! ale#test#GetPreviewWindowText() abort
for l:window in range(1, winnr('$'))
if getwinvar(l:window, '&previewwindow', 0)
let l:buffer = winbufnr(l:window)
return getbufline(l:buffer, 1, '$')
endif
endfor
endfunction

View file

@ -452,3 +452,14 @@ function! ale#util#Col(str, chr) abort
return strlen(join(split(a:str, '\zs')[0:a:chr - 2], '')) + 1 return strlen(join(split(a:str, '\zs')[0:a:chr - 2], '')) + 1
endfunction endfunction
function! ale#util#FindItemAtCursor(buffer) abort
let l:info = get(g:ale_buffer_info, a:buffer, {})
let l:loclist = get(l:info, 'loclist', [])
let l:pos = getcurpos()
let l:index = ale#util#BinarySearch(l:loclist, a:buffer, l:pos[1], l:pos[2])
let l:loc = l:index >= 0 ? l:loclist[l:index] : {}
return [l:info, l:loc]
endfunction

View file

@ -5,6 +5,11 @@ ALE Elixir Integration *ale-elixir-options*
=============================================================================== ===============================================================================
mix *ale-elixir-mix* mix *ale-elixir-mix*
The `mix` linter is disabled by default, as it can bee too expensive to run.
See `:help g:ale_linters`
g:ale_elixir_mix_options *g:ale_elixir_mix_options* g:ale_elixir_mix_options *g:ale_elixir_mix_options*
*b:ale_elixir_mix_options* *b:ale_elixir_mix_options*
Type: |String| Type: |String|
@ -53,5 +58,20 @@ g:ale_elixir_elixir_ls_release *g:ale_elixir_elixir_ls_release*
Location of the elixir-ls release directory. This directory must contain Location of the elixir-ls release directory. This directory must contain
the language server scripts (language_server.sh and language_server.bat). the language server scripts (language_server.sh and language_server.bat).
g:ale_elixir_elixir_ls_config *g:ale_elixir_elixir_ls_config*
*b:ale_elixir_elixir_ls_config*
Type: |Dictionary|
Default: `{}`
Dictionary containing configuration settings that will be passed to the
language server. For example, to disable Dialyzer: >
{
\ 'elixirLS': {
\ 'dialyzerEnabled': v:false,
\ },
\ }
<
Consult the ElixirLS documentation for more information about settings.
=============================================================================== ===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:

View file

@ -1,15 +1,37 @@
=============================================================================== ===============================================================================
ALE Eruby Integration *ale-eruby-options* ALE Eruby Integration *ale-eruby-options*
There are three linters for `eruby` files: There are four linters for `eruby` files:
- `erb` - `erb`
- `erubis` - `erubis`
- `erubi` - `erubi`
- `ruumba`
`erb` is in the Ruby standard library and is mostly universal. `erubis` is the `erb` is in the Ruby standard library and is mostly universal. `erubis` is the
default parser in Rails between 3.0 and 5.1. `erubi` is the default in Rails default parser in Rails between 3.0 and 5.1. `erubi` is the default in Rails
5.1 and later. To selectively enable a subset, see |g:ale_linters|. 5.1 and later. `ruumba` can extract Ruby from eruby files and run rubocop on
the result. To selectively enable a subset, see |g:ale_linters|.
===============================================================================
ruumba *ale-eruby-ruumba*
g:ale_eruby_ruumba_executable *g:ale_eruby_ruumba_executable*
*b:ale_eruby_ruumba_executable*
Type: String
Default: `'ruumba`
Override the invoked ruumba binary. This is useful for running ruumba
from binstubs or a bundle.
g:ale_eruby_ruumba_options *g:ale_ruby_ruumba_options*
*b:ale_ruby_ruumba_options*
Type: |String|
Default: `''`
This variable can be change to modify flags given to ruumba.
=============================================================================== ===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:

View file

@ -27,7 +27,7 @@ g:ale_go_go_executable *g:ale_go_go_options*
Default: `'go'` Default: `'go'`
The executable that will be run for the `gobuild` and `govet` linters, and The executable that will be run for the `gobuild` and `govet` linters, and
the gomod` fixer. the `gomod` fixer.
=============================================================================== ===============================================================================
@ -53,6 +53,25 @@ g:ale_go_gofmt_options *g:ale_go_gofmt_options*
This variable can be set to pass additional options to the gofmt fixer. This variable can be set to pass additional options to the gofmt fixer.
===============================================================================
golint *ale-go-golint*
g:ale_go_golint_executable *g:ale_go_golint_executable*
*b:ale_go_golint_executable*
Type: |String|
Default: `'golint'`
This variable can be set to change the golint executable path.
g:ale_go_golint_options *g:ale_go_golint_options*
*b:ale_go_golint_options*
Type: |String|
Default: `''`
This variable can be set to pass additional options to the golint linter.
=============================================================================== ===============================================================================
govet *ale-go-govet* govet *ale-go-govet*

View file

@ -79,6 +79,12 @@ g:ale_html_tidy_use_global *g:html_tidy_use_global*
See |ale-integrations-local-executables| See |ale-integrations-local-executables|
===============================================================================
prettier *ale-html-prettier*
See |ale-javascript-prettier| for information about the available options.
=============================================================================== ===============================================================================
stylelint *ale-html-stylelint* stylelint *ale-html-stylelint*

View file

@ -88,14 +88,20 @@ This generates a out/fat-jar.jar file that contains the language server. To
let ALE use this language server you need to set the g:ale_java_javalsp_jar let ALE use this language server you need to set the g:ale_java_javalsp_jar
variable to the absolute path of this jar file. variable to the absolute path of this jar file.
g:ale_java_javalsp_executable *g:ale_java_javalsp_executable*
*b:ale_java_javalsp_executable*
Type: |String|
Default: `'java'`
This variable can be changed to use a different executable for java.
g:ale_java_javalsp_jar *g:ale_java_javalsp_jar* g:ale_java_javalsp_jar *g:ale_java_javalsp_jar*
*b:ale_java_javalsp_jar* *b:ale_java_javalsp_jar*
Type: String Type: |String|
Default: 'fat-jar.jar Default: `'fat-jar.jar'`
Path to the location of the vscode-javac language server plugin. Path to the location of the vscode-javac language server plugin.
and -d. They are added automatically.
=============================================================================== ===============================================================================

View file

@ -203,5 +203,15 @@ g:ale_php_cs_fixer_options *g:ale_php_cs_fixer_options*
This variable can be set to pass additional options to php-cs-fixer. This variable can be set to pass additional options to php-cs-fixer.
===============================================================================
php *ale-php-php*
g:ale_php_php_executable *g:ale_php_php_executable*
*b:ale_php_php_executable*
Type: |String|
Default: `'php'`
This variable sets the executable used for php.
=============================================================================== ===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:

View file

@ -328,6 +328,46 @@ g:ale_python_pycodestyle_auto_pipenv *g:ale_python_pycodestyle_auto_pipenv*
if true. This is overridden by a manually-set executable. if true. This is overridden by a manually-set executable.
===============================================================================
pydocstyle *ale-python-pydocstyle*
g:ale_python_pydocstyle_executable *g:ale_python_pydocstyle_executable*
*b:ale_python_pydocstyle_executable*
Type: |String|
Default: `'pydocstyle'`
See |ale-integrations-local-executables|
Set this to `'pipenv'` to invoke `'pipenv` `run` `pydocstyle'`.
g:ale_python_pydocstyle_options *g:ale_python_pydocstyle_options*
*b:ale_python_pydocstyle_options*
Type: |String|
Default: `''`
This variable can be changed to add command-line arguments to the
pydocstyle invocation.
g:ale_python_pydocstyle_use_global *g:ale_python_pydocstyle_use_global*
*b:ale_python_pydocstyle_use_global*
Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)`
See |ale-integrations-local-executables|
g:ale_python_pydocstyle_auto_pipenv *g:ale_python_pydocstyle_auto_pipenv*
*b:ale_python_pydocstyle_auto_pipenv*
Type: |Number|
Default: `0`
Detect whether the file is inside a pipenv, and set the executable to `pipenv`
if true. This is overridden by a manually-set executable.
=============================================================================== ===============================================================================
pyflakes *ale-python-pyflakes* pyflakes *ale-python-pyflakes*

View file

@ -129,5 +129,27 @@ g:ale_ruby_solargraph_executable *g:ale_ruby_solargraph_executable*
from binstubs or a bundle. from binstubs or a bundle.
===============================================================================
standardrb *ale-ruby-standardrb*
g:ale_ruby_standardrb_executable *g:ale_ruby_standardrb_executable*
*b:ale_ruby_standardrb_executable*
Type: String
Default: `'standardrb'`
Override the invoked standardrb binary. Set this to `'bundle'` to invoke
`'bundle` `exec` standardrb'.
g:ale_ruby_standardrb_options *g:ale_ruby_standardrb_options*
*b:ale_ruby_standardrb_options*
Type: |String|
Default: `''`
This variable can be change to modify flags given to standardrb.
===============================================================================
=============================================================================== ===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:

View file

@ -2,6 +2,12 @@
ALE SASS Integration *ale-sass-options* ALE SASS Integration *ale-sass-options*
===============================================================================
sasslint *ale-sass-sasslint*
See |ale-scss-sasslint| for information about the available options.
=============================================================================== ===============================================================================
stylelint *ale-sass-stylelint* stylelint *ale-sass-stylelint*

View file

@ -8,6 +8,33 @@ prettier *ale-scss-prettier*
See |ale-javascript-prettier| for information about the available options. See |ale-javascript-prettier| for information about the available options.
===============================================================================
sasslint *ale-scss-sasslint*
g:ale_scss_sasslint_executable *g:ale_scss_sasslint_executable*
*b:ale_scss_sasslint_executable*
Type: |String|
Default: `'sass-lint'`
See |ale-integrations-local-executables|
g:ale_scss_sasslint_options *g:ale_scss_sasslint_options*
*b:ale_scss_sasslint_options*
Type: |String|
Default: `''`
This variable can be set to pass additional options to sass-lint.
g:ale_scss_sasslint_use_global *g:ale_scss_sasslint_use_global*
*b:ale_scss_sasslint_use_global*
Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)`
See |ale-integrations-local-executables|
=============================================================================== ===============================================================================
stylelint *ale-scss-stylelint* stylelint *ale-scss-stylelint*

View file

@ -21,9 +21,11 @@ tslint *ale-typescript-tslint*
This linter isn't recommended, because TSLint can't be used for checking for This linter isn't recommended, because TSLint can't be used for checking for
problems while you type. You should probably use the tsserver plugin instead. problems while you type. You should probably use the tsserver plugin instead.
tsserver plugins are described here:
https://github.com/Microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin
Follow the instructions on the plugin website for installing it: Follow the instructions on the plugin website for installing it:
https://github.com/angelozerr/tsserver-plugins https://github.com/Microsoft/typescript-tslint-plugin
Then disable TSLint in vimrc or any other Vim configuration file. > Then disable TSLint in vimrc or any other Vim configuration file. >
let g:ale_linters_ignore = {'typescript': ['tslint']} let g:ale_linters_ignore = {'typescript': ['tslint']}

View file

@ -21,6 +21,8 @@ CONTENTS *ale-contents*
6.1 Highlights........................|ale-highlights| 6.1 Highlights........................|ale-highlights|
6.2 Options for write-good Linter.....|ale-write-good-options| 6.2 Options for write-good Linter.....|ale-write-good-options|
7. Integration Documentation............|ale-integrations| 7. Integration Documentation............|ale-integrations|
ada...................................|ale-ada-options|
gcc.................................|ale-ada-gcc|
ansible...............................|ale-ansible-options| ansible...............................|ale-ansible-options|
ansible-lint........................|ale-ansible-ansible-lint| ansible-lint........................|ale-ansible-ansible-lint|
asciidoc..............................|ale-asciidoc-options| asciidoc..............................|ale-asciidoc-options|
@ -29,6 +31,8 @@ CONTENTS *ale-contents*
gcc.................................|ale-asm-gcc| gcc.................................|ale-asm-gcc|
awk...................................|ale-awk-options| awk...................................|ale-awk-options|
gawk................................|ale-awk-gawk| gawk................................|ale-awk-gawk|
bib...................................|ale-bib-options|
bibclean............................|ale-bib-bibclean|
c.....................................|ale-c-options| c.....................................|ale-c-options|
clang...............................|ale-c-clang| clang...............................|ale-c-clang|
clangd..............................|ale-c-clangd| clangd..............................|ale-c-clangd|
@ -92,6 +96,7 @@ CONTENTS *ale-contents*
erlc................................|ale-erlang-erlc| erlc................................|ale-erlang-erlc|
syntaxerl...........................|ale-erlang-syntaxerl| syntaxerl...........................|ale-erlang-syntaxerl|
eruby.................................|ale-eruby-options| eruby.................................|ale-eruby-options|
ruumba..............................|ale-eruby-ruumba|
fish..................................|ale-fish-options| fish..................................|ale-fish-options|
fortran...............................|ale-fortran-options| fortran...............................|ale-fortran-options|
gcc.................................|ale-fortran-gcc| gcc.................................|ale-fortran-gcc|
@ -107,6 +112,7 @@ CONTENTS *ale-contents*
go....................................|ale-go-options| go....................................|ale-go-options|
gobuild.............................|ale-go-gobuild| gobuild.............................|ale-go-gobuild|
gofmt...............................|ale-go-gofmt| gofmt...............................|ale-go-gofmt|
golint..............................|ale-go-golint|
govet...............................|ale-go-govet| govet...............................|ale-go-govet|
gometalinter........................|ale-go-gometalinter| gometalinter........................|ale-go-gometalinter|
staticcheck.........................|ale-go-staticcheck| staticcheck.........................|ale-go-staticcheck|
@ -138,10 +144,13 @@ CONTENTS *ale-contents*
html..................................|ale-html-options| html..................................|ale-html-options|
htmlhint............................|ale-html-htmlhint| htmlhint............................|ale-html-htmlhint|
tidy................................|ale-html-tidy| tidy................................|ale-html-tidy|
prettier............................|ale-html-prettier|
stylelint...........................|ale-html-stylelint| stylelint...........................|ale-html-stylelint|
write-good..........................|ale-html-write-good| write-good..........................|ale-html-write-good|
idris.................................|ale-idris-options| idris.................................|ale-idris-options|
idris...............................|ale-idris-idris| idris...............................|ale-idris-idris|
ispc..................................|ale-ispc-options|
ispc................................|ale-ispc-ispc|
java..................................|ale-java-options| java..................................|ale-java-options|
checkstyle..........................|ale-java-checkstyle| checkstyle..........................|ale-java-checkstyle|
javac...............................|ale-java-javac| javac...............................|ale-java-javac|
@ -224,6 +233,7 @@ CONTENTS *ale-contents*
phpstan.............................|ale-php-phpstan| phpstan.............................|ale-php-phpstan|
psalm...............................|ale-php-psalm| psalm...............................|ale-php-psalm|
php-cs-fixer........................|ale-php-php-cs-fixer| php-cs-fixer........................|ale-php-php-cs-fixer|
php.................................|ale-php-php|
po....................................|ale-po-options| po....................................|ale-po-options|
write-good..........................|ale-po-write-good| write-good..........................|ale-po-write-good|
pod...................................|ale-pod-options| pod...................................|ale-pod-options|
@ -250,6 +260,7 @@ CONTENTS *ale-contents*
mypy................................|ale-python-mypy| mypy................................|ale-python-mypy|
prospector..........................|ale-python-prospector| prospector..........................|ale-python-prospector|
pycodestyle.........................|ale-python-pycodestyle| pycodestyle.........................|ale-python-pycodestyle|
pydocstyle..........................|ale-python-pydocstyle|
pyflakes............................|ale-python-pyflakes| pyflakes............................|ale-python-pyflakes|
pylint..............................|ale-python-pylint| pylint..............................|ale-python-pylint|
pyls................................|ale-python-pyls| pyls................................|ale-python-pyls|
@ -274,12 +285,14 @@ CONTENTS *ale-contents*
ruby................................|ale-ruby-ruby| ruby................................|ale-ruby-ruby|
rufo................................|ale-ruby-rufo| rufo................................|ale-ruby-rufo|
solargraph..........................|ale-ruby-solargraph| solargraph..........................|ale-ruby-solargraph|
standardrb..........................|ale-ruby-standardrb|
rust..................................|ale-rust-options| rust..................................|ale-rust-options|
cargo...............................|ale-rust-cargo| cargo...............................|ale-rust-cargo|
rls.................................|ale-rust-rls| rls.................................|ale-rust-rls|
rustc...............................|ale-rust-rustc| rustc...............................|ale-rust-rustc|
rustfmt.............................|ale-rust-rustfmt| rustfmt.............................|ale-rust-rustfmt|
sass..................................|ale-sass-options| sass..................................|ale-sass-options|
sasslint............................|ale-sass-sasslint|
stylelint...........................|ale-sass-stylelint| stylelint...........................|ale-sass-stylelint|
scala.................................|ale-scala-options| scala.................................|ale-scala-options|
sbtserver...........................|ale-scala-sbtserver| sbtserver...........................|ale-scala-sbtserver|
@ -287,6 +300,7 @@ CONTENTS *ale-contents*
scalastyle..........................|ale-scala-scalastyle| scalastyle..........................|ale-scala-scalastyle|
scss..................................|ale-scss-options| scss..................................|ale-scss-options|
prettier............................|ale-scss-prettier| prettier............................|ale-scss-prettier|
sasslint............................|ale-scss-sasslint|
stylelint...........................|ale-scss-stylelint| stylelint...........................|ale-scss-stylelint|
sh....................................|ale-sh-options| sh....................................|ale-sh-options|
sh-language-server..................|ale-sh-language-server| sh-language-server..................|ale-sh-language-server|
@ -388,12 +402,14 @@ Notes:
`^` No linters for text or Vim help filetypes are enabled by default. `^` No linters for text or Vim help filetypes are enabled by default.
`!!` These linters check only files on disk. See |ale-lint-file-linters| `!!` These linters check only files on disk. See |ale-lint-file-linters|
* Ada: `gcc`
* ASM: `gcc` * ASM: `gcc`
* Ansible: `ansible-lint` * Ansible: `ansible-lint`
* API Blueprint: `drafter` * API Blueprint: `drafter`
* AsciiDoc: `alex`!!, `proselint`, `redpen`, `write-good` * AsciiDoc: `alex`!!, `proselint`, `redpen`, `write-good`, `vale`
* Awk: `gawk` * Awk: `gawk`
* Bash: `language-server`, `shell` (-n flag), `shellcheck`, `shfmt` * Bash: `language-server`, `shell` (-n flag), `shellcheck`, `shfmt`
* BibTeX: `bibclean`
* Bourne Shell: `shell` (-n flag), `shellcheck`, `shfmt` * Bourne Shell: `shell` (-n flag), `shellcheck`, `shfmt`
* C: `cppcheck`, `cpplint`!!, `clang`, `clangd`, `clangtidy`!!, `clang-format`, `cquery`, `flawfinder`, `gcc`, `uncrustify`, `ccls` * C: `cppcheck`, `cpplint`!!, `clang`, `clangd`, `clangtidy`!!, `clang-format`, `cquery`, `flawfinder`, `gcc`, `uncrustify`, `ccls`
* C++ (filetype cpp): `clang`, `clangd`, `clangcheck`!!, `clangtidy`!!, `clang-format`, `clazy`!!, `cppcheck`, `cpplint`!!, `cquery`, `flawfinder`, `gcc`, `uncrustify`, `ccls` * C++ (filetype cpp): `clang`, `clangd`, `clangcheck`!!, `clangtidy`!!, `clang-format`, `clazy`!!, `cppcheck`, `cpplint`!!, `cquery`, `flawfinder`, `gcc`, `uncrustify`, `ccls`
@ -414,7 +430,7 @@ Notes:
* Dockerfile: `dockerfile_lint`, `hadolint` * Dockerfile: `dockerfile_lint`, `hadolint`
* Elixir: `credo`, `dialyxir`, `dogma`, `mix`!!, `elixir-ls` * Elixir: `credo`, `dialyxir`, `dogma`, `mix`!!, `elixir-ls`
* Elm: `elm-format, elm-make` * Elm: `elm-format, elm-make`
* Erb: `erb`, `erubi`, `erubis` * Erb: `erb`, `erubi`, `erubis`, `ruumba`
* Erlang: `erlc`, `SyntaxErl` * Erlang: `erlc`, `SyntaxErl`
* Fish: `fish` (-n flag) * Fish: `fish` (-n flag)
* Fortran: `gcc`, `language_server` * Fortran: `gcc`, `language_server`
@ -429,8 +445,9 @@ Notes:
* Handlebars: `ember-template-lint` * Handlebars: `ember-template-lint`
* Haskell: `brittany`, `ghc`, `cabal-ghc`, `stylish-haskell`, `stack-ghc`, `stack-build`!!, `ghc-mod`, `hlint`, `hdevtools`, `hfmt`, `hie` * Haskell: `brittany`, `ghc`, `cabal-ghc`, `stylish-haskell`, `stack-ghc`, `stack-build`!!, `ghc-mod`, `hlint`, `hdevtools`, `hfmt`, `hie`
* HCL: `terraform-fmt` * HCL: `terraform-fmt`
* HTML: `alex`!!, `HTMLHint`, `proselint`, `tidy`, `write-good` * HTML: `alex`!!, `HTMLHint`, `proselint`, `tidy`, `prettier`, `write-good`
* Idris: `idris` * Idris: `idris`
* ISPC: `ispc`!!
* Java: `checkstyle`, `javac`, `google-java-format`, `PMD`, `javalsp`, `uncrustify` * Java: `checkstyle`, `javac`, `google-java-format`, `PMD`, `javalsp`, `uncrustify`
* JavaScript: `eslint`, `flow`, `jscs`, `jshint`, `prettier`, `prettier-eslint`, `prettier-standard`, `standard`, `xo` * JavaScript: `eslint`, `flow`, `jscs`, `jshint`, `prettier`, `prettier-eslint`, `prettier-standard`, `standard`, `xo`
* JSON: `fixjson`, `jsonlint`, `jq`, `prettier` * JSON: `fixjson`, `jsonlint`, `jq`, `prettier`
@ -463,14 +480,14 @@ Notes:
* proto: `protoc-gen-lint` * proto: `protoc-gen-lint`
* Pug: `pug-lint` * Pug: `pug-lint`
* Puppet: `languageserver`, `puppet`, `puppet-lint` * Puppet: `languageserver`, `puppet`, `puppet-lint`
* Python: `autopep8`, `black`, `flake8`, `isort`, `mypy`, `prospector`, `pycodestyle`, `pyls`, `pyre`, `pylint`!!, `vulture`!!, `yapf` * Python: `autopep8`, `black`, `flake8`, `isort`, `mypy`, `prospector`, `pycodestyle`, `pydocstyle`, `pyls`, `pyre`, `pylint`!!, `vulture`!!, `yapf`
* QML: `qmlfmt`, `qmllint` * QML: `qmlfmt`, `qmllint`
* R: `lintr` * R: `lintr`
* ReasonML: `merlin`, `ols`, `refmt` * ReasonML: `merlin`, `ols`, `refmt`
* reStructuredText: `alex`!!, `proselint`, `redpen`, `rstcheck`, `vale`, `write-good` * reStructuredText: `alex`!!, `proselint`, `redpen`, `rstcheck`, `vale`, `write-good`
* Re:VIEW: `redpen` * Re:VIEW: `redpen`
* RPM spec: `rpmlint` * RPM spec: `rpmlint`
* Ruby: `brakeman`, `rails_best_practices`!!, `reek`, `rubocop`, `ruby`, `rufo`, `solargraph` * Ruby: `brakeman`, `rails_best_practices`!!, `reek`, `rubocop`, `ruby`, `rufo`, `solargraph`, `standardrb`
* Rust: `cargo`!!, `rls`, `rustc` (see |ale-integration-rust|), `rustfmt` * Rust: `cargo`!!, `rls`, `rustc` (see |ale-integration-rust|), `rustfmt`
* SASS: `sass-lint`, `stylelint` * SASS: `sass-lint`, `stylelint`
* SCSS: `prettier`, `sass-lint`, `scss-lint`, `stylelint` * SCSS: `prettier`, `sass-lint`, `scss-lint`, `stylelint`
@ -555,6 +572,7 @@ their relevant options.
* By setting error highlights. - |g:ale_set_highlights| * By setting error highlights. - |g:ale_set_highlights|
* By creating signs in the sign column. - |g:ale_set_signs| * By creating signs in the sign column. - |g:ale_set_signs|
* By echoing messages based on your cursor. - |g:ale_echo_cursor| * By echoing messages based on your cursor. - |g:ale_echo_cursor|
* By inline text based on your cursor. - |g:ale_virtualtext_cursor|
* By displaying the preview based on your cursor. - |g:ale_cursor_detail| * By displaying the preview based on your cursor. - |g:ale_cursor_detail|
* By showing balloons for your mouse cursor - |g:ale_set_balloons| * By showing balloons for your mouse cursor - |g:ale_set_balloons|
@ -859,6 +877,9 @@ settings. For example: >
set ttymouse=xterm set ttymouse=xterm
< <
Documentation for symbols at the cursor can be retrieved using the
|ALEDocumentation| command. This command is only available for `tsserver`.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
5.5 Symbol Search *ale-symbol-search* 5.5 Symbol Search *ale-symbol-search*
@ -1184,6 +1205,9 @@ b:ale_fix_on_save *b:ale_fix_on_save*
after files are fixed, only when the buffer is open, or re-opened. Changes after files are fixed, only when the buffer is open, or re-opened. Changes
to the file will be saved to the file on disk. to the file will be saved to the file on disk.
Files will not be fixed on `:wq`, so you should check your code before
closing a buffer.
Fixing files can be disabled or enabled for individual buffers by setting Fixing files can be disabled or enabled for individual buffers by setting
`b:ale_fix_on_save` to `0` or `1`. `b:ale_fix_on_save` to `0` or `1`.
@ -1362,6 +1386,7 @@ g:ale_linter_aliases *g:ale_linter_aliases*
\ 'systemverilog': 'verilog', \ 'systemverilog': 'verilog',
\ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'], \ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'],
\ 'vimwiki': 'markdown', \ 'vimwiki': 'markdown',
\ 'vue': ['vue', 'javascript'],
\ 'zsh': 'sh', \ 'zsh': 'sh',
\} \}
< <
@ -1410,6 +1435,7 @@ g:ale_linters *g:ale_linters*
{ {
\ 'csh': ['shell'], \ 'csh': ['shell'],
\ 'elixir': ['credo', 'dialyxir', 'dogma', 'elixir-ls'],
\ 'go': ['gofmt', 'golint', 'go vet'], \ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'], \ 'hack': ['hack'],
\ 'help': [], \ 'help': [],
@ -1419,6 +1445,7 @@ g:ale_linters *g:ale_linters*
\ 'rust': ['cargo'], \ 'rust': ['cargo'],
\ 'spec': [], \ 'spec': [],
\ 'text': [], \ 'text': [],
\ 'vue': ['eslint', 'vls'],
\ 'zsh': ['shell'], \ 'zsh': ['shell'],
\} \}
< <
@ -1866,6 +1893,49 @@ g:ale_use_global_executables *g:ale_use_global_executables*
options. options.
g:ale_virtualtext_cursor *g:ale_virtualtext_cursor*
Type: |Number|
Default: `0`
When this option is set to `1`, a message will be shown when a cursor is
near a warning or error. ALE will attempt to find the warning or error at a
column nearest to the cursor when the cursor is resting on a line which
contains a warning or error. This option can be set to `0` to disable this
behavior.
Messages are only displayed after a short delay. See |g:ale_virtualtext_delay|.
Messages can be prefixed prefixed with a string. See |g:ale_virtualtext_prefix|.
ALE will use the following highlight groups for problems:
|ALEVirtualTextError| - Items with `'type': 'E'`
|ALEVirtualTextWarning| - Items with `'type': 'W'`
|ALEVirtualTextInfo| - Items with `'type': 'I'`
|ALEVirtualTextStyleError| - Items with `'type': 'E'` and `'sub_type': 'style'`
|ALEVirtualTextStyleWarning| - Items with `'type': 'W'` and `'sub_type': 'style'`
g:ale_virtualtext_delay *g:ale_virtualtext_delay*
b:ale_virtualtext_delay *b:ale_virtualtext_delay*
Type: |Number|
Default: `10`
Given any integer, this option controls the number of milliseconds before
ALE will show a message for a problem near the cursor.
The value can be increased to decrease the amount of processing ALE will do
for files displaying a large number of problems.
g:ale_virtualtext_prefix *g:ale_virtualtext_prefix*
Type: |String|
Default: `'> '`
Prefix to be used with |g:ale_virtualtext_cursor|.
g:ale_virtualenv_dir_names *g:ale_virtualenv_dir_names* g:ale_virtualenv_dir_names *g:ale_virtualenv_dir_names*
b:ale_virtualenv_dir_names *b:ale_virtualenv_dir_names* b:ale_virtualenv_dir_names *b:ale_virtualenv_dir_names*
@ -1932,7 +2002,7 @@ ALEError *ALEError*
Default: `highlight link ALEError SpellBad` Default: `highlight link ALEError SpellBad`
The highlight used for highlighted errors. See |g:ale_set_highlights|. The highlight for highlighted errors. See |g:ale_set_highlights|.
ALEErrorLine *ALEErrorLine* ALEErrorLine *ALEErrorLine*
@ -1949,21 +2019,21 @@ ALEErrorSign *ALEErrorSign*
Default: `highlight link ALEErrorSign error` Default: `highlight link ALEErrorSign error`
The highlight used for error signs. See |g:ale_set_signs|. The highlight for error signs. See |g:ale_set_signs|.
ALEInfo *ALEInfo.* ALEInfo *ALEInfo.*
*ALEInfo-highlight* *ALEInfo-highlight*
Default: `highlight link ALEInfo ALEWarning` Default: `highlight link ALEInfo ALEWarning`
The highlight used for highlighted info messages. See |g:ale_set_highlights|. The highlight for highlighted info messages. See |g:ale_set_highlights|.
ALEInfoSign *ALEInfoSign* ALEInfoSign *ALEInfoSign*
Default: `highlight link ALEInfoSign ALEWarningSign` Default: `highlight link ALEInfoSign ALEWarningSign`
The highlight used for info message signs. See |g:ale_set_signs|. The highlight for info message signs. See |g:ale_set_signs|.
ALEInfoLine *ALEInfoLine* ALEInfoLine *ALEInfoLine*
@ -1980,35 +2050,70 @@ ALEStyleError *ALEStyleError*
Default: `highlight link ALEStyleError ALEError` Default: `highlight link ALEStyleError ALEError`
The highlight used for highlighted style errors. See |g:ale_set_highlights|. The highlight for highlighted style errors. See |g:ale_set_highlights|.
ALEStyleErrorSign *ALEStyleErrorSign* ALEStyleErrorSign *ALEStyleErrorSign*
Default: `highlight link ALEStyleErrorSign ALEErrorSign` Default: `highlight link ALEStyleErrorSign ALEErrorSign`
The highlight used for style error signs. See |g:ale_set_signs|. The highlight for style error signs. See |g:ale_set_signs|.
ALEStyleWarning *ALEStyleWarning* ALEStyleWarning *ALEStyleWarning*
Default: `highlight link ALEStyleWarning ALEError` Default: `highlight link ALEStyleWarning ALEError`
The highlight used for highlighted style warnings. See |g:ale_set_highlights|. The highlight for highlighted style warnings. See |g:ale_set_highlights|.
ALEStyleWarningSign *ALEStyleWarningSign* ALEStyleWarningSign *ALEStyleWarningSign*
Default: `highlight link ALEStyleWarningSign ALEWarningSign` Default: `highlight link ALEStyleWarningSign ALEWarningSign`
The highlight used for style warning signs. See |g:ale_set_signs|. The highlight for style warning signs. See |g:ale_set_signs|.
ALEVirtualTextError *ALEVirtualTextError*
Default: `highlight link ALEVirtualTextError ALEError`
The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|.
ALEVirtualTextInfo *ALEVirtualTextInfo*
Default: `highlight link ALEVirtualTextInfo ALEVirtualTextWarning`
The highlight for virtualtext info. See |g:ale_virtualtext_cursor|.
ALEVirtualTextStyleError *ALEVirtualTextStyleError*
Default: `highlight link ALEVirtualTextStyleError ALEVirtualTextError`
The highlight for virtualtext style errors. See |g:ale_virtualtext_cursor|.
ALEVirtualTextStyleWarning *ALEVirtualTextStyleWarning*
Default: `highlight link ALEVirtualTextStyleWarning ALEVirtualTextWarning`
The highlight for virtualtext style warnings. See |g:ale_virtualtext_cursor|.
ALEVirtualTextWarning *ALEVirtualTextWarning*
Default: `highlight link ALEVirtualTextWarning ALEWarning`
The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|.
ALEWarning *ALEWarning* ALEWarning *ALEWarning*
Default: `highlight link ALEWarning SpellCap` Default: `highlight link ALEWarning SpellCap`
The highlight used for highlighted warnings. See |g:ale_set_highlights|. The highlight for highlighted warnings. See |g:ale_set_highlights|.
ALEWarningLine *ALEWarningLine* ALEWarningLine *ALEWarningLine*
@ -2025,7 +2130,7 @@ ALEWarningSign *ALEWarningSign*
Default: `highlight link ALEWarningSign todo` Default: `highlight link ALEWarningSign todo`
The highlight used for warning signs. See |g:ale_set_signs|. The highlight for warning signs. See |g:ale_set_signs|.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -2097,6 +2202,17 @@ ALE will use to search for Python executables.
=============================================================================== ===============================================================================
8. Commands/Keybinds *ale-commands* 8. Commands/Keybinds *ale-commands*
ALEDocumentation *ALEDocumentation*
Similar to the |ALEHover| command, retrieve documentation information for
the symbol at the cursor. Documentation data will always be shown in a
preview window, no matter how small the documentation content is.
NOTE: This command is only available for `tsserver`.
A plug mapping `<Plug>(ale_documentation)` is defined for this command.
ALEFindReferences *ALEFindReferences* ALEFindReferences *ALEFindReferences*
Find references in the codebase for the symbol under the cursor using the Find references in the codebase for the symbol under the cursor using the

View file

@ -112,6 +112,9 @@ let g:ale_echo_cursor = get(g:, 'ale_echo_cursor', 1)
" This flag can be set to 1 to automatically show errors in the preview window. " This flag can be set to 1 to automatically show errors in the preview window.
let g:ale_cursor_detail = get(g:, 'ale_cursor_detail', 0) let g:ale_cursor_detail = get(g:, 'ale_cursor_detail', 0)
" This flag can be set to 1 to enable virtual text when the cursor moves.
let g:ale_virtualtext_cursor = get(g:, 'ale_virtualtext_cursor', 0)
" This flag can be set to 1 to automatically close the preview window upon " This flag can be set to 1 to automatically close the preview window upon
" entering Insert Mode. " entering Insert Mode.
let g:ale_close_preview_on_insert = get(g:, 'ale_close_preview_on_insert', 0) let g:ale_close_preview_on_insert = get(g:, 'ale_close_preview_on_insert', 0)
@ -190,9 +193,11 @@ command! -bar ALEGoToDefinitionInTab :call ale#definition#GoTo({'open_in_tab': 1
" Find references for tsserver and LSP " Find references for tsserver and LSP
command! -bar ALEFindReferences :call ale#references#Find() command! -bar ALEFindReferences :call ale#references#Find()
" Get information for the cursor. " Show summary information for the cursor.
command! -bar ALEHover :call ale#hover#Show(bufnr(''), getcurpos()[1], command! -bar ALEHover :call ale#hover#ShowAtCursor()
\ getcurpos()[2], {})
" Show documentation for the cursor.
command! -bar ALEDocumentation :call ale#hover#ShowDocumentationAtCursor()
" Search for appearances of a symbol, such as a type name or function name. " Search for appearances of a symbol, such as a type name or function name.
command! -nargs=1 ALESymbolSearch :call ale#symbol#Search(<q-args>) command! -nargs=1 ALESymbolSearch :call ale#symbol#Search(<q-args>)
@ -219,6 +224,7 @@ nnoremap <silent> <Plug>(ale_go_to_definition) :ALEGoToDefinition<Return>
nnoremap <silent> <Plug>(ale_go_to_definition_in_tab) :ALEGoToDefinitionInTab<Return> nnoremap <silent> <Plug>(ale_go_to_definition_in_tab) :ALEGoToDefinitionInTab<Return>
nnoremap <silent> <Plug>(ale_find_references) :ALEFindReferences<Return> nnoremap <silent> <Plug>(ale_find_references) :ALEFindReferences<Return>
nnoremap <silent> <Plug>(ale_hover) :ALEHover<Return> nnoremap <silent> <Plug>(ale_hover) :ALEHover<Return>
nnoremap <silent> <Plug>(ale_documentation) :ALEDocumentation<Return>
" Set up autocmd groups now. " Set up autocmd groups now.
call ale#events#Init() call ale#events#Init()

View file

@ -2567,9 +2567,13 @@ fu! ctrlp#getvar(var)
endf endf
"}}}1 "}}}1
" * Initialization {{{1 " * Initialization {{{1
fu! ctrlp#setlines(...) fu! s:setlines_pre(...)
if a:0 | let s:itemtype = a:1 | en if a:0 | let s:itemtype = a:1 | en
cal s:modevar() cal s:modevar()
let g:ctrlp_lines = []
endf
fu! s:setlines_post()
let inits = {'fil': 'ctrlp#files()', 'buf': 'ctrlp#buffers()', 'mru': 'ctrlp#mrufiles#list()'} let inits = {'fil': 'ctrlp#files()', 'buf': 'ctrlp#buffers()', 'mru': 'ctrlp#mrufiles#list()'}
let types = map(copy(g:ctrlp_types), 'inits[v:val]') let types = map(copy(g:ctrlp_types), 'inits[v:val]')
if !empty(g:ctrlp_ext_vars) if !empty(g:ctrlp_ext_vars)
@ -2578,6 +2582,11 @@ fu! ctrlp#setlines(...)
let g:ctrlp_lines = eval(types[s:itemtype]) let g:ctrlp_lines = eval(types[s:itemtype])
endf endf
fu! ctrlp#setlines(...)
cal call('s:setlines_pre', a:000)
cal s:setlines_post()
endf
" Returns [lname, sname] " Returns [lname, sname]
fu! s:CurTypeName() fu! s:CurTypeName()
if s:itemtype < len(s:coretypes) if s:itemtype < len(s:coretypes)
@ -2632,8 +2641,16 @@ fu! ctrlp#init(type, ...)
retu retu
en en
en en
cal ctrlp#setlines(s:settype(type)) " Fixed issue ctrlpvim/ctrlp.vim#463 : Opening 'ctrlp' in certain modes
" (':CtrlPBufTag', ':CtrlPLine') seems to trigger a partially deffective
" intialisation (for example, syntax highlighting not working as expected).
" Fix: ctrlp#setlines() split in two, as the second part (now in
" s:setlines_post()) seems to need '&filetype', and s:DetectFileType() seems
" to need the first part of the old ctrlp#setlines() (now in
" s:setlines_pre()).
cal s:setlines_pre(s:settype(type))
let &filetype = s:DetectFileType(type, &filetype) let &filetype = s:DetectFileType(type, &filetype)
cal s:setlines_post()
cal ctrlp#syntax() cal ctrlp#syntax()
cal s:SetDefTxt() cal s:SetDefTxt()
let curName = s:CurTypeName() let curName = s:CurTypeName()

View file

@ -2,16 +2,17 @@
" Filename: autoload/lightline.vim " Filename: autoload/lightline.vim
" Author: itchyny " Author: itchyny
" License: MIT License " License: MIT License
" Last Change: 2018/09/17 12:00:00. " Last Change: 2018/11/24 12:00:00.
" ============================================================================= " =============================================================================
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim
let s:_ = 1 let s:_ = 1 " 1: uninitialized, 2: disabled
function! lightline#update() abort function! lightline#update() abort
if s:_ if s:_
if s:_ == 2 | return | endif
call lightline#init() call lightline#init()
call lightline#colorscheme() call lightline#colorscheme()
endif endif
@ -40,11 +41,8 @@ function! lightline#update_disable() abort
endfunction endfunction
function! lightline#enable() abort function! lightline#enable() abort
call lightline#colorscheme() let s:_ = 1
call lightline#update() call lightline#update()
if s:lightline.enable.tabline
set tabline=%!lightline#tabline()
endif
augroup lightline augroup lightline
autocmd! autocmd!
autocmd WinEnter,BufWinEnter,FileType,SessionLoadPost * call lightline#update() autocmd WinEnter,BufWinEnter,FileType,SessionLoadPost * call lightline#update()
@ -74,6 +72,7 @@ function! lightline#disable() abort
autocmd! autocmd!
autocmd WinEnter * call lightline#update_disable() autocmd WinEnter * call lightline#update_disable()
augroup END augroup END
let s:_ = 2
endfunction endfunction
function! lightline#toggle() abort function! lightline#toggle() abort

View file

@ -452,13 +452,9 @@ In order to change the syntastic component more outstanding, you have to use
\ 'syntastic': 'error', \ 'syntastic': 'error',
\ } \ }
\ } \ }
let g:syntastic_mode_map = { 'mode': 'passive' } " Syntastic can call a post-check hook, let's update lightline there
augroup AutoSyntastic " For more information: :help syntastic-loclist-callback
autocmd! function! SyntasticCheckHook(errors)
autocmd BufWritePost *.c,*.cpp call s:syntastic()
augroup END
function! s:syntastic()
SyntasticCheck
call lightline#update() call lightline#update()
endfunction endfunction
< <
@ -908,12 +904,9 @@ For users who uses lots of plugins:
return lightline#statusline(0) return lightline#statusline(0)
endfunction endfunction
augroup AutoSyntastic " Syntastic can call a post-check hook, let's update lightline there
autocmd! " For more information: :help syntastic-loclist-callback
autocmd BufWritePost *.c,*.cpp call s:syntastic() function! SyntasticCheckHook(errors)
augroup END
function! s:syntastic()
SyntasticCheck
call lightline#update() call lightline#update()
endfunction endfunction

View file

@ -11,6 +11,7 @@ endfunction
function! s:suite.default() function! s:suite.default()
call s:assert.equals(exists('#lightline'), 1) call s:assert.equals(exists('#lightline'), 1)
call s:assert.equals(exists('#lightline-disable'), 0) call s:assert.equals(exists('#lightline-disable'), 0)
call s:assert.not_equals(&statusline, '')
call s:assert.not_equals(&tabline, '') call s:assert.not_equals(&tabline, '')
endfunction endfunction
@ -18,10 +19,15 @@ function! s:suite.disable_enable()
call lightline#disable() call lightline#disable()
call s:assert.equals(exists('#lightline'), 0) call s:assert.equals(exists('#lightline'), 0)
call s:assert.equals(exists('#lightline-disable'), 1) call s:assert.equals(exists('#lightline-disable'), 1)
call s:assert.equals(&statusline, '')
call s:assert.equals(&tabline, '')
call lightline#update()
call s:assert.equals(&statusline, '')
call s:assert.equals(&tabline, '') call s:assert.equals(&tabline, '')
call lightline#enable() call lightline#enable()
call s:assert.equals(exists('#lightline'), 1) call s:assert.equals(exists('#lightline'), 1)
call s:assert.equals(exists('#lightline-disable'), 0) call s:assert.equals(exists('#lightline-disable'), 0)
call s:assert.not_equals(&statusline, '')
call s:assert.not_equals(&tabline, '') call s:assert.not_equals(&tabline, '')
endfunction endfunction
@ -29,9 +35,11 @@ function! s:suite.toggle()
call lightline#toggle() call lightline#toggle()
call s:assert.equals(exists('#lightline'), 0) call s:assert.equals(exists('#lightline'), 0)
call s:assert.equals(exists('#lightline-disable'), 1) call s:assert.equals(exists('#lightline-disable'), 1)
call s:assert.equals(&statusline, '')
call s:assert.equals(&tabline, '') call s:assert.equals(&tabline, '')
call lightline#toggle() call lightline#toggle()
call s:assert.equals(exists('#lightline'), 1) call s:assert.equals(exists('#lightline'), 1)
call s:assert.equals(exists('#lightline-disable'), 0) call s:assert.equals(exists('#lightline-disable'), 0)
call s:assert.not_equals(&statusline, '')
call s:assert.not_equals(&tabline, '') call s:assert.not_equals(&tabline, '')
endfunction endfunction

File diff suppressed because it is too large Load diff

View file

@ -33,7 +33,7 @@ function! s:Creator._broadcastInitEvent()
silent doautocmd User NERDTreeInit silent doautocmd User NERDTreeInit
endfunction endfunction
" FUNCTION: s:Creator.BufNamePrefix() {{{2 " FUNCTION: s:Creator.BufNamePrefix() {{{1
function! s:Creator.BufNamePrefix() function! s:Creator.BufNamePrefix()
return 'NERD_tree_' return 'NERD_tree_'
endfunction endfunction

View file

@ -49,7 +49,7 @@ endfunction
"FUNCTION: MenuController._echoPrompt() {{{1 "FUNCTION: MenuController._echoPrompt() {{{1
function! s:MenuController._echoPrompt() function! s:MenuController._echoPrompt()
echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated" echo "NERDTree Menu. Use " . g:NERDTreeMenuDown . "/" . g:NERDTreeMenuUp . "/enter and the shortcuts indicated"
echo "==========================================================" echo "=========================================================="
for i in range(0, len(self.menuItems)-1) for i in range(0, len(self.menuItems)-1)
@ -71,9 +71,9 @@ endfunction
"change the selection (if appropriate) and return 1 if the user has made "change the selection (if appropriate) and return 1 if the user has made
"their choice, 0 otherwise "their choice, 0 otherwise
function! s:MenuController._handleKeypress(key) function! s:MenuController._handleKeypress(key)
if a:key == 'j' if a:key == g:NERDTreeMenuDown
call self._cursorDown() call self._cursorDown()
elseif a:key == 'k' elseif a:key == g:NERDTreeMenuUp
call self._cursorUp() call self._cursorUp()
elseif a:key == nr2char(27) "escape elseif a:key == nr2char(27) "escape
let self.selection = -1 let self.selection = -1

View file

@ -254,6 +254,13 @@ function! s:TreeDirNode.getChildIndex(path)
return -1 return -1
endfunction endfunction
" FUNCTION: TreeDirNode.getDirChildren() {{{1
" Return a list of all child nodes from "self.children" that are of type
" TreeDirNode. This function supports http://github.com/scrooloose/nerdtree-project-plugin.git.
function! s:TreeDirNode.getDirChildren()
return filter(copy(self.children), 'v:val.path.isDirectory == 1')
endfunction
" FUNCTION: TreeDirNode._glob(pattern, all) {{{1 " FUNCTION: TreeDirNode._glob(pattern, all) {{{1
" Return a list of strings naming the descendants of the directory in this " Return a list of strings naming the descendants of the directory in this
" TreeDirNode object that match the specified glob pattern. " TreeDirNode object that match the specified glob pattern.
@ -370,12 +377,26 @@ function! s:TreeDirNode.hasVisibleChildren()
endfunction endfunction
" FUNCTION: TreeDirNode.isCascadable() {{{1 " FUNCTION: TreeDirNode.isCascadable() {{{1
" true if this dir has only one visible child - which is also a dir " true if this dir has only one visible child that is also a dir
" false if this dir is bookmarked or symlinked. Why? Two reasons:
" 1. If cascaded, we don't know which dir is bookmarked or is a symlink.
" 2. If the parent is a symlink or is bookmarked, you end up with unparsable
" text, and NERDTree cannot get the path of any child node.
function! s:TreeDirNode.isCascadable() function! s:TreeDirNode.isCascadable()
if g:NERDTreeCascadeSingleChildDir == 0 if g:NERDTreeCascadeSingleChildDir == 0
return 0 return 0
endif endif
if self.path.isSymLink
return 0
endif
for i in g:NERDTreeBookmark.Bookmarks()
if i.path.equals(self.path)
return 0
endif
endfor
let c = self.getVisibleChildren() let c = self.getVisibleChildren()
return len(c) == 1 && c[0].path.isDirectory return len(c) == 1 && c[0].path.isDirectory
endfunction endfunction

View file

@ -86,8 +86,8 @@ let g:NERDTreeOldSortOrder = []
call s:initVariable("g:NERDTreeGlyphReadOnly", "RO") call s:initVariable("g:NERDTreeGlyphReadOnly", "RO")
" ASCII 160: non-breaking space used to delimit items in the tree's nodes. " ASCII 7: bell non-printing character used to delimit items in the tree's nodes.
call s:initVariable("g:NERDTreeNodeDelimiter", "\u00a0") call s:initVariable("g:NERDTreeNodeDelimiter", "\x07")
if !exists('g:NERDTreeStatusline') if !exists('g:NERDTreeStatusline')
@ -148,6 +148,8 @@ call s:initVariable("g:NERDTreeMapToggleZoom", "A")
call s:initVariable("g:NERDTreeMapUpdir", "u") call s:initVariable("g:NERDTreeMapUpdir", "u")
call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U") call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U")
call s:initVariable("g:NERDTreeMapCWD", "CD") call s:initVariable("g:NERDTreeMapCWD", "CD")
call s:initVariable("g:NERDTreeMenuDown", "j")
call s:initVariable("g:NERDTreeMenuUp", "k")
"SECTION: Load class files{{{2 "SECTION: Load class files{{{2
call nerdtree#loadClassFiles() call nerdtree#loadClassFiles()

View file

@ -33,15 +33,15 @@ exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# cont
"highlighting for readonly files "highlighting for readonly files
exec 'syn match NERDTreeRO # *\zs.*\ze \['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile' exec 'syn match NERDTreeRO # *\zs.*\ze \['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile'
syn match NERDTreeFlags #^ *\zs\[.\]# containedin=NERDTreeFile,NERDTreeExecFile syn match NERDTreeFlags #^ *\zs\[[^\]]*\]# containedin=NERDTreeFile,NERDTreeExecFile
syn match NERDTreeFlags #\[.\]# containedin=NERDTreeDir syn match NERDTreeFlags #\[[^\]]*\]# containedin=NERDTreeDir
"highlighing to conceal the delimiter around the file/dir name "highlighing to conceal the delimiter around the file/dir name
if has("conceal") if has("conceal")
exec 'syn match NERDTreeNodeDelimiters #' . g:NERDTreeNodeDelimiter . '# conceal containedin=NERDTreeFile,NERDTreeLinkFile,NERDTreeExecFile,NERDTreeRO,NERDTreeDir' exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# conceal containedin=ALL'
setlocal conceallevel=3 concealcursor=nvic setlocal conceallevel=3 concealcursor=nvic
else else
exec 'syn match NERDTreeNodeDelimiters #' . g:NERDTreeNodeDelimiter . '# containedin=NERDTreeFile,NERDTreeLinkFile,NERDTreeExecFile,NERDTreeRO,NERDTreeDir' exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# containedin=ALL'
hi! link NERDTreeNodeDelimiters Ignore hi! link NERDTreeNodeDelimiters Ignore
endif endif

View file

@ -527,7 +527,7 @@ function! s:commands.abbrev.process(bang,line1,line2,count,args)
let cmd = cmd . " <buffer>" let cmd = cmd . " <buffer>"
endif endif
let [bad, good] = s:badgood(a:args) let [bad, good] = s:badgood(a:args)
if substitute(bad,'{.\{-\}.}','','g') !~ '^\k\+$' if substitute(bad, '[{},]', '', 'g') !~# '^\k*$'
call s:throw("E474: Invalid argument (not a keyword: ".string(bad).")") call s:throw("E474: Invalid argument (not a keyword: ".string(bad).")")
endif endif
if !self.options.delete && good == "" if !self.options.delete && good == ""
@ -620,12 +620,14 @@ function! s:coerce(type) abort
endtry endtry
endfunction endfunction
nnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar())).'iw' nnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar()))
nnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar()))
nnoremap <expr> <plug>(abolish-coerce-word) <sid>coerce(nr2char(getchar())).'iw'
" }}}1 " }}}1
if !exists("g:abolish_no_mappings") || ! g:abolish_no_mappings if !exists("g:abolish_no_mappings") || ! g:abolish_no_mappings
nmap cr <Plug>(abolish-coerce) nmap cr <Plug>(abolish-coerce-word)
endif endif
command! -nargs=+ -bang -bar -range=0 -complete=custom,s:Complete Abolish command! -nargs=+ -bang -bar -range=0 -complete=custom,s:Complete Abolish

View file

@ -2986,7 +2986,7 @@ function! s:Blame(bang, line1, line2, count, mods, args) abort
if empty(s:Relative('/')) if empty(s:Relative('/'))
call s:throw('file or blob required') call s:throw('file or blob required')
endif endif
if filter(copy(a:args),'v:val !~# "^\\%(--root\|--show-name\\|-\\=\\%([ltfnsew]\\|[MC]\\d*\\)\\+\\)$"') != [] if filter(copy(a:args),'v:val !~# "^\\%(--first-parent\\|--root\\|--show-name\\|-\\=\\%([ltfnsew]\\|[MC]\\d*\\)\\+\\)$"') != []
call s:throw('unsupported option') call s:throw('unsupported option')
endif endif
call map(a:args,'s:sub(v:val,"^\\ze[^-]","-")') call map(a:args,'s:sub(v:val,"^\\ze[^-]","-")')

View file

@ -1,6 +1,6 @@
" fugitive.vim - A Git wrapper so awesome, it should be illegal " fugitive.vim - A Git wrapper so awesome, it should be illegal
" Maintainer: Tim Pope <http://tpo.pe/> " Maintainer: Tim Pope <http://tpo.pe/>
" Version: 2.4 " Version: 2.5
" GetLatestVimScripts: 2975 1 :AutoInstall: fugitive.vim " GetLatestVimScripts: 2975 1 :AutoInstall: fugitive.vim
if exists('g:loaded_fugitive') if exists('g:loaded_fugitive')
@ -68,6 +68,10 @@ function! FugitiveParse(...) abort
throw v:errmsg throw v:errmsg
endfunction endfunction
function! FugitivePrepare(...) abort
return call('fugitive#Prepare', a:000)
endfunction
function! FugitiveConfig(key, ...) abort function! FugitiveConfig(key, ...) abort
return fugitive#Config(a:key, FugitiveGitDir(a:0 ? a:1 : -1)) return fugitive#Config(a:key, FugitiveGitDir(a:0 ? a:1 : -1))
endfunction endfunction
@ -205,14 +209,6 @@ function! FugitiveDetect(path) abort
endif endif
endfunction endfunction
function! FugitiveRoute(...) abort
return call('FugitiveFind', a:000)
endfunction
function! FugitiveGenerate(...) abort
throw 'Use FugitiveFind() instead'
endfunction
function! s:Slash(path) abort function! s:Slash(path) abort
if exists('+shellslash') if exists('+shellslash')
return tr(a:path, '\', '/') return tr(a:path, '\', '/')

View file

@ -77,13 +77,19 @@ endfunction
function! s:on_stderr_vim(channel, _data) dict abort function! s:on_stderr_vim(channel, _data) dict abort
call self.handler.err(self.buffer) call self.handler.err(self.buffer)
try
call ch_close(a:channel) " so close_cb and its 'out' handler are not triggered
catch /E906/
" noop
endtry
endfunction endfunction
function! s:on_exit_vim(_channel) dict abort function! s:on_exit_vim(channel) dict abort
let job = ch_getjob(a:channel)
while 1
if job_status(job) == 'dead'
let exit_code = job_info(job).exitval
break
endif
sleep 5m
endwhile
if !exit_code
call self.handler.out(self.buffer, join(self.stdoutbuffer, "\n")) call self.handler.out(self.buffer, join(self.stdoutbuffer, "\n"))
endif
endfunction endfunction

View file

@ -13,6 +13,7 @@ let s:c_flag = s:git_supports_command_line_config_override()
let s:temp_from = tempname() let s:temp_from = tempname()
let s:temp_buffer = tempname() let s:temp_buffer = tempname()
let s:counter = 0
" Returns a diff of the buffer against the index or the working tree. " Returns a diff of the buffer against the index or the working tree.
" "
@ -89,6 +90,11 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort
" git-diff). " git-diff).
let buff_file = s:temp_buffer.'.'.a:bufnr let buff_file = s:temp_buffer.'.'.a:bufnr
" Add a counter to avoid a similar race with two quick writes of the same buffer.
" Use a modulus greater than a maximum reasonable number of visible buffers.
let s:counter = (s:counter + 1) % 20
let buff_file .= '.'.s:counter
let extension = gitgutter#utility#extension(a:bufnr) let extension = gitgutter#utility#extension(a:bufnr)
if !empty(extension) if !empty(extension)
let buff_file .= '.'.extension let buff_file .= '.'.extension
@ -104,6 +110,9 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort
" reading it (with git-diff). " reading it (with git-diff).
let from_file = s:temp_from.'.'.a:bufnr let from_file = s:temp_from.'.'.a:bufnr
" Add a counter to avoid a similar race with two quick writes of the same buffer.
let from_file .= '.'.s:counter
if !empty(extension) if !empty(extension)
let from_file .= '.'.extension let from_file .= '.'.extension
endif endif
@ -365,6 +374,13 @@ endfunction
function! s:write_buffer(bufnr, file) function! s:write_buffer(bufnr, file)
let bufcontents = getbufline(a:bufnr, 1, '$') let bufcontents = getbufline(a:bufnr, 1, '$')
if bufcontents == [''] && line2byte(1) == -1
" Special case: completely empty buffer.
" A nearly empty buffer of only a newline has line2byte(1) == 1.
call writefile([], a:file)
return
endif
if getbufvar(a:bufnr, '&fileformat') ==# 'dos' if getbufvar(a:bufnr, '&fileformat') ==# 'dos'
call map(bufcontents, 'v:val."\r"') call map(bufcontents, 'v:val."\r"')
endif endif

View file

@ -8,7 +8,12 @@ endfunction
function! gitgutter#utility#setbufvar(buffer, varname, val) function! gitgutter#utility#setbufvar(buffer, varname, val)
let buffer = +a:buffer let buffer = +a:buffer
let dict = get(getbufvar(buffer, '', {}), 'gitgutter', {}) " Default value for getbufvar() was introduced in Vim 7.3.831.
let bvars = getbufvar(buffer, '')
if empty(bvars)
let bvars = {}
endif
let dict = get(bvars, 'gitgutter', {})
let needs_setting = empty(dict) let needs_setting = empty(dict)
let dict[a:varname] = a:val let dict[a:varname] = a:val
if needs_setting if needs_setting
@ -115,7 +120,7 @@ function! gitgutter#utility#set_repo_path(bufnr) abort
" * -2 - not tracked by git " * -2 - not tracked by git
call gitgutter#utility#setbufvar(a:bufnr, 'path', -1) call gitgutter#utility#setbufvar(a:bufnr, 'path', -1)
let cmd = gitgutter#utility#cd_cmd(a:bufnr, g:gitgutter_git_executable.' ls-files --error-unmatch --full-name -- '.gitgutter#utility#shellescape(s:filename(a:bufnr))) let cmd = gitgutter#utility#cd_cmd(a:bufnr, g:gitgutter_git_executable.' ls-files --error-unmatch --full-name -z -- '.gitgutter#utility#shellescape(s:filename(a:bufnr)))
if g:gitgutter_async && gitgutter#async#available() if g:gitgutter_async && gitgutter#async#available()
if has('lambda') if has('lambda')
@ -202,8 +207,13 @@ function! s:exists_file(bufnr) abort
return filereadable(s:abs_path(a:bufnr, 0)) return filereadable(s:abs_path(a:bufnr, 0))
endfunction endfunction
" Get rid of any trailing new line or SOH character.
"
" git ls-files -z produces output with null line termination.
" Vim's system() replaces any null characters in the output
" with SOH (start of header), i.e. ^A.
function! s:strip_trailing_new_line(line) abort function! s:strip_trailing_new_line(line) abort
return substitute(a:line, '\n$', '', '') return substitute(a:line, '[[:cntrl:]]$', '', '')
endfunction endfunction
function! gitgutter#utility#windows() function! gitgutter#utility#windows()

View file

@ -191,6 +191,20 @@ function Test_filename_leading_dash()
endfunction endfunction
function Test_filename_umlaut()
call system('touch -- fixtüre.txt && git add -- fixtüre.txt')
edit fixtüre.txt
normal ggo*
call s:trigger_gitgutter()
let expected = [
\ 'line=1 id=3000 name=GitGutterLineAdded',
\ 'line=2 id=3001 name=GitGutterLineAdded'
\ ]
call assert_equal(expected, s:signs('fixtüre.txt'))
endfunction
" FIXME: this test fails when it is the first (or only) test to be run " FIXME: this test fails when it is the first (or only) test to be run
function Test_follow_symlink() function Test_follow_symlink()
let tmp = 'symlink' let tmp = 'symlink'
@ -273,6 +287,7 @@ function Test_untracked_file_within_repo()
call s:trigger_gitgutter() call s:trigger_gitgutter()
call assert_equal([], s:signs(tmp)) call assert_equal([], s:signs(tmp))
call assert_equal(-2, b:gitgutter.path)
call system('rm '.tmp) call system('rm '.tmp)
endfunction endfunction
@ -633,3 +648,33 @@ function Test_encoding()
call assert_equal([], s:signs('cp932.txt')) call assert_equal([], s:signs('cp932.txt'))
endfunction endfunction
function Test_empty_file()
" 0-byte file
call system('touch empty.txt && git add empty.txt')
edit empty.txt
call s:trigger_gitgutter()
call assert_equal([], s:signs('empty.txt'))
" File consisting only of a newline
call system('echo "" > newline.txt && git add newline.txt')
edit newline.txt
call s:trigger_gitgutter()
call assert_equal([], s:signs('newline.txt'))
" 1 line file without newline
" Vim will force a newline unless we tell it not to.
call system('echo -n a > oneline.txt && git add oneline.txt')
set noeol nofixeol
edit! oneline.txt
call s:trigger_gitgutter()
call assert_equal([], s:signs('oneline.txt'))
set eol fixeol
endfunction

View file

@ -1,5 +1,36 @@
## unplanned ## unplanned
IMPROVEMENTS:
* Disable `g:go_gocode_propose_source` by default.
[[GH-2050]](https://github.com/fatih/vim-go/pull/2050)
* Don't spam users when Vim is run with vi compatibility.
[[GH-2055]](https://github.com/fatih/vim-go/pull/2055)
* Add bang support to lint commands to allow them to be run without jumping to
errors.
[[GH-2056]](https://github.com/fatih/vim-go/pull/2056)
* Use `go doc` for `:GoDoc` instead of `godoc`.
[[GH-2070]](https://github.com/fatih/vim-go/pull/2070)
* Detach from and shutdown dlv correctly.
[[GH-2075]](https://github.com/fatih/vim-go/pull/2075)
* Do not require `'autowrite'` or `'autowriteall'` to be set when using
autocompletion in module mode.
[[GH-2091]](https://github.com/fatih/vim-go/pull/2091)
BUG FIXES:
* Fix opening of non-existent file from `:GoDeclsDir` when the current
directory is not the directory containing the current buffer.
[[GH-2048]](https://github.com/fatih/vim-go/pull/2048)
* Fix jumping to an identifier with godef from a modified buffer.
[[GH-2054]](https://github.com/fatih/vim-go/pull/2054)
* Fix errors when `g:go_debug` contains `debugger-commands`.
[[GH-2075]](https://github.com/fatih/vim-go/pull/2075)
* Fix errors from `:GoDebugStop` in Neovim.
[[GH-2075]](https://github.com/fatih/vim-go/pull/2075)
* Fix `:GoSameIdsToggle`.
[[GH-2086]](https://github.com/fatih/vim-go/pull/2086)
## 1.19 - (November 4, 2018)
FEATURES: FEATURES:
* **go.mod file support!** This is the first feature for upcoming Go modules * **go.mod file support!** This is the first feature for upcoming Go modules
@ -64,6 +95,8 @@ IMPROVEMENTS:
[[GH-2025]](https://github.com/fatih/vim-go/pull/2025) [[GH-2025]](https://github.com/fatih/vim-go/pull/2025)
* Update autocompletion to work with Go modules. * Update autocompletion to work with Go modules.
[[GH-1988]](https://github.com/fatih/vim-go/pull/1988) [[GH-1988]](https://github.com/fatih/vim-go/pull/1988)
* Add an option to search $GOPATH/bin or $GOBIN _after_ $PATH.
[[GH-2041]](https://github.com/fatih/vim-go/pull/2041)
BUG FIXES: BUG FIXES:
* Fix `:GoRun %` on Windows. * Fix `:GoRun %` on Windows.

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:go_decls_var = { let s:go_decls_var = {
\ 'init': 'ctrlp#decls#init()', \ 'init': 'ctrlp#decls#init()',
\ 'exit': 'ctrlp#decls#exit()', \ 'exit': 'ctrlp#decls#exit()',
@ -20,7 +24,7 @@ function! ctrlp#decls#init() abort
endfunction endfunction
function! ctrlp#decls#exit() abort function! ctrlp#decls#exit() abort
unlet! s:decls s:current_dir s:target unlet! s:decls s:target
endfunction endfunction
" The action to perform on the selected string " The action to perform on the selected string
@ -32,10 +36,6 @@ function! ctrlp#decls#accept(mode, str) abort
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
let dir = getcwd() let dir = getcwd()
try try
" we jump to the file directory so we can get the fullpath via fnamemodify
" below
execute cd . s:current_dir
let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|')
" i.e: main.go " i.e: main.go
@ -50,14 +50,10 @@ function! ctrlp#decls#accept(mode, str) abort
call ctrlp#acceptfile(a:mode, filepath) call ctrlp#acceptfile(a:mode, filepath)
call cursor(line, col) call cursor(line, col)
silent! norm! zvzz silent! norm! zvzz
finally
"jump back to old dir
execute cd . fnameescape(dir)
endtry endtry
endfunction endfunction
function! ctrlp#decls#enter() abort function! ctrlp#decls#enter() abort
let s:current_dir = fnameescape(expand('%:p:h'))
let s:decls = [] let s:decls = []
let l:cmd = ['motion', let l:cmd = ['motion',
@ -117,7 +113,7 @@ function! ctrlp#decls#enter() abort
call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s",
\ decl.ident . space, \ decl.ident . space,
\ decl.keyword, \ decl.keyword,
\ fnamemodify(decl.filename, ":."), \ fnamemodify(decl.filename, ":p"),
\ decl.line, \ decl.line,
\ decl.col, \ decl.col,
\ decl.full, \ decl.full,
@ -151,4 +147,8 @@ function! ctrlp#decls#cmd(mode, ...) abort
return s:id return s:id
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! s:code(group, attr) abort function! s:code(group, attr) abort
let code = synIDattr(synIDtrans(hlID(a:group)), a:attr, "cterm") let code = synIDattr(synIDtrans(hlID(a:group)), a:attr, "cterm")
if code =~ '^[0-9]\+$' if code =~ '^[0-9]\+$'
@ -146,4 +150,8 @@ function! fzf#decls#cmd(...) abort
\ })) \ }))
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" Test alternates between the implementation of code and the test code. " Test alternates between the implementation of code and the test code.
function! go#alternate#Switch(bang, cmd) abort function! go#alternate#Switch(bang, cmd) abort
let file = expand('%') let file = expand('%')
@ -24,4 +28,8 @@ function! go#alternate#Switch(bang, cmd) abort
endif endif
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -15,6 +15,10 @@
" "
" Flag to automatically call :Fmt when file is saved. " Flag to automatically call :Fmt when file is saved.
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:got_fmt_error = 0 let s:got_fmt_error = 0
" This is a trimmed-down version of the logic in fmt.vim. " This is a trimmed-down version of the logic in fmt.vim.
@ -65,4 +69,8 @@ function! go#asmfmt#ToggleAsmFmtAutoSave() abort
call go#util#EchoProgress("auto asmfmt disabled") call go#util#EchoProgress("auto asmfmt disabled")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#cmd#autowrite() abort function! go#cmd#autowrite() abort
if &autowrite == 1 || &autowriteall == 1 if &autowrite == 1 || &autowriteall == 1
silent! wall silent! wall
@ -282,4 +286,8 @@ function! s:cmd_job(args) abort
call go#job#Spawn(a:args.cmd, a:args) call go#job#Spawn(a:args.cmd, a:args)
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_GoBuildErrors() func! Test_GoBuildErrors()
try try
let l:filename = 'cmd/bad.go' let l:filename = 'cmd/bad.go'
@ -27,4 +31,8 @@ func! Test_GoBuildErrors()
endtry endtry
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,16 +1,11 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! s:gocodeCommand(cmd, args) abort function! s:gocodeCommand(cmd, args) abort
let l:gocode_bin = "gocode" let l:gocode_bin = "gocode"
let l:gomod = go#util#gomod() let l:gomod = go#util#gomod()
if filereadable(l:gomod) if filereadable(l:gomod)
" Save the file when in module mode so that go list can read the
" imports. If the user doesn't have autowrite or autorwriteall enabled,
" they'll need to write the file manually to get reliable results.
" See https://github.com/fatih/vim-go/pull/1988#issuecomment-428576989.
"
" TODO(bc): don't save the file when in module mode once
" golang.org/x/tools/go/packages has support for an overlay and it's used
" by gocode.
call go#cmd#autowrite()
let l:gocode_bin = "gocode-gomod" let l:gocode_bin = "gocode-gomod"
endif endif
@ -31,6 +26,8 @@ function! s:gocodeCommand(cmd, args) abort
if go#config#GocodeProposeSource() if go#config#GocodeProposeSource()
let cmd = extend(cmd, ['-source']) let cmd = extend(cmd, ['-source'])
else
let cmd = extend(cmd, ['-fallback-to-source', '-cache'])
endif endif
if go#config#GocodeUnimportedPackages() if go#config#GocodeUnimportedPackages()
@ -248,4 +245,8 @@ function! go#complete#ToggleAutoTypeInfo() abort
call go#util#EchoProgress("auto type info enabled") call go#util#EchoProgress("auto type info enabled")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_GetInfo() func! Test_GetInfo()
let l:filename = 'complete/complete.go' let l:filename = 'complete/complete.go'
let l:tmp = gotest#load_fixture(l:filename) let l:tmp = gotest#load_fixture(l:filename)
@ -17,4 +21,8 @@ func! Test_GetInfo()
unlet g:go_info_mode unlet g:go_info_mode
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#config#AutodetectGopath() abort function! go#config#AutodetectGopath() abort
return get(g:, 'go_autodetect_gopath', 0) return get(g:, 'go_autodetect_gopath', 0)
endfunction endfunction
@ -149,7 +153,7 @@ function! go#config#GocodeProposeBuiltins() abort
endfunction endfunction
function! go#config#GocodeProposeSource() abort function! go#config#GocodeProposeSource() abort
return get(g:, 'go_gocode_propose_source', 1) return get(g:, 'go_gocode_propose_source', 0)
endfunction endfunction
function! go#config#EchoCommandInfo() abort function! go#config#EchoCommandInfo() abort
@ -202,7 +206,7 @@ endfunction
function! go#config#DebugCommands() abort function! go#config#DebugCommands() abort
" make sure g:go_debug_commands is set so that it can be added to easily. " make sure g:go_debug_commands is set so that it can be added to easily.
let g:go_debug_commands = get(g:, 'go_debug_commands', {}) let g:go_debug_commands = get(g:, 'go_debug_commands', [])
return g:go_debug_commands return g:go_debug_commands
endfunction endfunction
@ -310,10 +314,6 @@ function! go#config#DeclsMode() abort
return get(g:, "go_decls_mode", "") return get(g:, "go_decls_mode", "")
endfunction endfunction
function! go#config#DocCommand() abort
return get(g:, "go_doc_command", ["godoc"])
endfunction
function! go#config#FmtCommand() abort function! go#config#FmtCommand() abort
return get(g:, "go_fmt_command", "gofmt") return get(g:, "go_fmt_command", "gofmt")
endfunction endfunction
@ -356,6 +356,10 @@ function! go#config#BinPath() abort
return get(g:, "go_bin_path", "") return get(g:, "go_bin_path", "")
endfunction endfunction
function! go#config#SearchBinPathFirst() abort
return get(g:, 'go_search_bin_path_first', 1)
endfunction
function! go#config#HighlightArrayWhitespaceError() abort function! go#config#HighlightArrayWhitespaceError() abort
return get(g:, 'go_highlight_array_whitespace_error', 0) return get(g:, 'go_highlight_array_whitespace_error', 0)
endfunction endfunction
@ -441,4 +445,8 @@ if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1
unlet g:go_gorename_prefill unlet g:go_gorename_prefill
endif endif
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:toggle = 0 let s:toggle = 0
" Buffer creates a new cover profile with 'go test -coverprofile' and changes " Buffer creates a new cover profile with 'go test -coverprofile' and changes
@ -286,4 +290,8 @@ function! s:coverage_browser_callback(coverfile, job, exit_status, data)
call delete(a:coverfile) call delete(a:coverfile)
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
scriptencoding utf-8 scriptencoding utf-8
if !exists('s:state') if !exists('s:state')
@ -67,81 +71,40 @@ function! s:call_jsonrpc(method, ...) abort
echom 'sending to dlv ' . a:method echom 'sending to dlv ' . a:method
endif endif
if len(a:000) > 0 && type(a:000[0]) == v:t_func let l:args = a:000
let Cb = a:000[0]
let args = a:000[1:]
else
let args = a:000
endif
let s:state['rpcid'] += 1 let s:state['rpcid'] += 1
let req_json = json_encode({ let l:req_json = json_encode({
\ 'id': s:state['rpcid'], \ 'id': s:state['rpcid'],
\ 'method': a:method, \ 'method': a:method,
\ 'params': args, \ 'params': l:args,
\}) \})
try try
" Use callback let l:ch = s:state['ch']
if exists('l:Cb')
if has('nvim') if has('nvim')
let state = {'callback': Cb} call chansend(l:ch, l:req_json)
function! state.on_data(ch, msg, event) abort while len(s:state.data) == 0
call self.state.callback(a:ch, a:msg)
endfunction
let l:ch = sockconnect('tcp', go#config#DebugAddress(), {'on_data': state.on_data, 'state': state})
call chansend(l:ch, req_json)
if go#util#HasDebug('debugger-commands')
let g:go_debug_commands = add(g:go_debug_commands, {
\ 'request': req_json,
\ 'response': Cb,
\ })
endif
return
endif
let l:ch = ch_open(go#config#DebugAddress(), {'mode': 'nl', 'callback': Cb})
call ch_sendraw(l:ch, req_json)
if go#util#HasDebug('debugger-commands')
let g:go_debug_commands = add(g:go_debug_commands, {
\ 'request': req_json,
\ 'response': Cb,
\ })
endif
return
endif
if has('nvim')
let state = {'done': 0}
function! state.on_data(ch, msg, event) abort
let self.state.resp = a:msg
let self.state.done = 1
endfunction
let l:ch = sockconnect('tcp', go#config#DebugAddress(), {'on_data': state.on_data, 'state': state})
call chansend(l:ch, req_json)
while state.done == 0
sleep 50m sleep 50m
endwhile endwhile
let resp_json = state.resp let resp_json = s:state.data[0]
let s:state.data = s:state.data[1:]
else else
let ch = ch_open(go#config#DebugAddress(), {'mode': 'raw', 'timeout': 20000}) call ch_sendraw(l:ch, req_json)
call ch_sendraw(ch, req_json) let l:resp_raw = ch_readraw(l:ch)
let resp_json = ch_readraw(ch) let resp_json = json_decode(l:resp_raw)
endif endif
if go#util#HasDebug('debugger-commands') if go#util#HasDebug('debugger-commands')
let g:go_debug_commands = add(g:go_debug_commands, { let g:go_debug_commands = add(go#config#DebugCommands(), {
\ 'request': req_json, \ 'request': l:req_json,
\ 'response': resp_json, \ 'response': l:resp_json,
\ }) \ })
endif endif
let obj = json_decode(resp_json) if type(l:resp_json) == v:t_dict && has_key(l:resp_json, 'error') && !empty(l:resp_json.error)
if type(obj) == v:t_dict && has_key(obj, 'error') && !empty(obj.error) throw l:resp_json.error
throw obj.error
endif endif
return obj return l:resp_json
catch catch
throw substitute(v:exception, '^Vim', '', '') throw substitute(v:exception, '^Vim', '', '')
endtry endtry
@ -247,12 +210,12 @@ function! s:clearState() abort
let s:state['localVars'] = {} let s:state['localVars'] = {}
let s:state['functionArgs'] = {} let s:state['functionArgs'] = {}
let s:state['message'] = [] let s:state['message'] = []
silent! sign unplace 9999 silent! sign unplace 9999
endfunction endfunction
function! s:stop() abort function! s:stop() abort
" TODO(bc): call Detach let l:res = s:call_jsonrpc('RPCServer.Detach', {'kill': v:true})
call go#job#Stop(s:state['job'])
call s:clearState() call s:clearState()
if has_key(s:state, 'job') if has_key(s:state, 'job')
@ -262,9 +225,19 @@ function! s:stop() abort
if has_key(s:state, 'ready') if has_key(s:state, 'ready')
call remove(s:state, 'ready') call remove(s:state, 'ready')
endif endif
if has_key(s:state, 'ch')
call remove(s:state, 'ch')
endif
if has_key( s:state, 'data')
call remove(s:state, 'data')
endif
endfunction endfunction
function! go#debug#Stop() abort function! go#debug#Stop() abort
" TODO(bc): don't remove breakpoints that were set before debugging started
" (see out_cb).
" Remove signs. " Remove signs.
for k in keys(s:state['breakpoint']) for k in keys(s:state['breakpoint'])
let bt = s:state['breakpoint'][k] let bt = s:state['breakpoint'][k]
@ -426,15 +399,11 @@ function! s:expand_var() abort
endif endif
endfunction endfunction
function! s:start_cb(ch, json) abort function! s:start_cb(res) abort
let res = json_decode(a:json) if empty(a:res) || !has_key(a:res, 'result')
if type(res) == v:t_dict && has_key(res, 'error') && !empty(res.error)
throw res.error
endif
if empty(res) || !has_key(res, 'result')
return return
endif endif
for bt in res.result.Breakpoints for bt in a:res.result.Breakpoints
if bt.id >= 0 if bt.id >= 0
let s:state['breakpoint'][bt.id] = bt let s:state['breakpoint'][bt.id] = bt
exe 'sign place '. bt.id .' line=' . bt.line . ' name=godebugbreakpoint file=' . bt.file exe 'sign place '. bt.id .' line=' . bt.line . ' name=godebugbreakpoint file=' . bt.file
@ -534,6 +503,46 @@ function! s:out_cb(ch, msg) abort
let s:state['message'] += [a:msg] let s:state['message'] += [a:msg]
if stridx(a:msg, go#config#DebugAddress()) != -1 if stridx(a:msg, go#config#DebugAddress()) != -1
if has('nvim')
let s:state['data'] = []
let l:state = {'databuf': ''}
function! s:on_data(ch, data, event) dict abort closure
let l:data = self.databuf
for msg in a:data
let l:data .= l:msg
endfor
try
let l:res = json_decode(l:data)
let s:state['data'] = add(s:state['data'], l:res)
let self.databuf = ''
catch
" there isn't a complete message in databuf: buffer l:data and try
" again when more data comes in.
let self.databuf = l:data
finally
endtry
endfunction
" explicitly bind callback to state so that within it, self will
" always refer to state. See :help Partial for more information.
let l:state.on_data = function('s:on_data', [], l:state)
let l:ch = sockconnect('tcp', go#config#DebugAddress(), {'on_data': l:state.on_data, 'state': l:state})
if l:ch == 0
call go#util#EchoError("could not connect to debugger")
call go#job#Stop(s:state['job'])
return
endif
else
let l:ch = ch_open(go#config#DebugAddress(), {'mode': 'raw', 'timeout': 20000})
if ch_status(l:ch) !=# 'open'
call go#util#EchoError("could not connect to debugger")
call go#job#Stop(s:state['job'])
return
endif
endif
let s:state['ch'] = l:ch
" After this block executes, Delve will be running with all the " After this block executes, Delve will be running with all the
" breakpoints setup, so this callback doesn't have to run again; just log " breakpoints setup, so this callback doesn't have to run again; just log
" future messages. " future messages.
@ -546,7 +555,8 @@ function! s:out_cb(ch, msg) abort
call go#debug#Breakpoint(bt.line) call go#debug#Breakpoint(bt.line)
endfor endfor
call s:call_jsonrpc('RPCServer.ListBreakpoints', function('s:start_cb')) let res = s:call_jsonrpc('RPCServer.ListBreakpoints')
call s:start_cb(res)
endif endif
endfunction endfunction
@ -571,13 +581,6 @@ function! go#debug#Start(is_test, ...) abort
call go#config#SetDebugDiag(s:state) call go#config#SetDebugDiag(s:state)
endif endif
" cd in to test directory; this is also what running "go test" does.
if a:is_test
lcd %:p:h
endif
let s:state.is_test = a:is_test
let dlv = go#path#CheckBinPath("dlv") let dlv = go#path#CheckBinPath("dlv")
if empty(dlv) if empty(dlv)
return return
@ -586,14 +589,27 @@ function! go#debug#Start(is_test, ...) abort
try try
if len(a:000) > 0 if len(a:000) > 0
let l:pkgname = a:1 let l:pkgname = a:1
" Expand .; otherwise this won't work from a tmp dir.
if l:pkgname[0] == '.' if l:pkgname[0] == '.'
let l:pkgname = go#package#FromPath(getcwd()) . l:pkgname[1:] let l:pkgname = go#package#FromPath(l:pkgname)
endif endif
else else
let l:pkgname = go#package#FromPath(getcwd()) let l:pkgname = go#package#FromPath(getcwd())
endif endif
if l:pkgname is -1
call go#util#EchoError('could not determine package name')
return
endif
" cd in to test directory; this is also what running "go test" does.
if a:is_test
" TODO(bc): Either remove this if it's ok to do so or else record it and
" reset cwd after the job completes.
lcd %:p:h
endif
let s:state.is_test = a:is_test
let l:args = [] let l:args = []
if len(a:000) > 1 if len(a:000) > 1
let l:args = ['--'] + a:000[1:] let l:args = ['--'] + a:000[1:]
@ -608,7 +624,6 @@ function! go#debug#Start(is_test, ...) abort
\ '--api-version', '2', \ '--api-version', '2',
\ '--log', '--log-output', 'debugger,rpc', \ '--log', '--log-output', 'debugger,rpc',
\ '--listen', go#config#DebugAddress(), \ '--listen', go#config#DebugAddress(),
\ '--accept-multiclient',
\] \]
let buildtags = go#config#BuildTags() let buildtags = go#config#BuildTags()
@ -803,20 +818,13 @@ function! s:update_stacktrace() abort
endtry endtry
endfunction endfunction
function! s:stack_cb(ch, json) abort function! s:stack_cb(res) abort
let s:stack_name = '' let s:stack_name = ''
let res = json_decode(a:json)
if type(res) == v:t_dict && has_key(res, 'error') && !empty(res.error)
call go#util#EchoError(res.error)
call s:clearState()
call go#debug#Restart()
return
endif
if empty(res) || !has_key(res, 'result') if empty(a:res) || !has_key(a:res, 'result')
return return
endif endif
call s:update_breakpoint(res) call s:update_breakpoint(a:res)
call s:update_stacktrace() call s:update_stacktrace()
call s:update_variables() call s:update_variables()
endfunction endfunction
@ -847,7 +855,14 @@ function! go#debug#Stack(name) abort
call s:call_jsonrpc('RPCServer.CancelNext') call s:call_jsonrpc('RPCServer.CancelNext')
endif endif
let s:stack_name = l:name let s:stack_name = l:name
call s:call_jsonrpc('RPCServer.Command', function('s:stack_cb'), {'name': l:name}) try
let res = s:call_jsonrpc('RPCServer.Command', {'name': l:name})
call s:stack_cb(res)
catch
call go#util#EchoError(v:exception)
call s:clearState()
call go#debug#Restart()
endtry
catch catch
call go#util#EchoError(v:exception) call go#util#EchoError(v:exception)
endtry endtry
@ -944,4 +959,8 @@ endfunction
sign define godebugbreakpoint text=> texthl=GoDebugBreakpoint sign define godebugbreakpoint text=> texthl=GoDebugBreakpoint
sign define godebugcurline text== linehl=GoDebugCurrent texthl=GoDebugCurrent sign define godebugcurline text== linehl=GoDebugCurrent texthl=GoDebugCurrent
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#decls#Decls(mode, ...) abort function! go#decls#Decls(mode, ...) abort
let decls_mode = go#config#DeclsMode() let decls_mode = go#config#DeclsMode()
if decls_mode == 'ctrlp' if decls_mode == 'ctrlp'
@ -15,4 +19,8 @@ function! go#decls#Decls(mode, ...) abort
end end
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:go_stack = [] let s:go_stack = []
let s:go_stack_level = 0 let s:go_stack_level = 0
@ -10,21 +14,18 @@ function! go#def#Jump(mode) abort
" covers all edge cases, but now anyone can switch to godef if they wish " covers all edge cases, but now anyone can switch to godef if they wish
let bin_name = go#config#DefMode() let bin_name = go#config#DefMode()
if bin_name == 'godef' if bin_name == 'godef'
if &modified let l:cmd = ['godef',
" Write current unsaved buffer to a temp file and use the modified content
let l:tmpname = tempname()
call writefile(go#util#GetLines(), l:tmpname)
let fname = l:tmpname
endif
let [l:out, l:err] = go#util#Exec(['godef',
\ '-f=' . l:fname, \ '-f=' . l:fname,
\ '-o=' . go#util#OffsetCursor(), \ '-o=' . go#util#OffsetCursor(),
\ '-t']) \ '-t']
if exists("l:tmpname")
call delete(l:tmpname)
endif
if &modified
let l:stdin_content = join(go#util#GetLines(), "\n")
call add(l:cmd, "-i")
let [l:out, l:err] = go#util#Exec(l:cmd, l:stdin_content)
else
let [l:out, l:err] = go#util#Exec(l:cmd)
endif
elseif bin_name == 'guru' elseif bin_name == 'guru'
let cmd = [go#path#CheckBinPath(bin_name)] let cmd = [go#path#CheckBinPath(bin_name)]
let buildtags = go#config#BuildTags() let buildtags = go#config#BuildTags()
@ -317,4 +318,8 @@ function s:def_job(args, state) abort
call go#job#Start(a:args.cmd, l:start_options) call go#job#Start(a:args.cmd, l:start_options)
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_jump_to_declaration_guru() abort func! Test_jump_to_declaration_guru() abort
try try
let l:filename = 'def/jump.go' let l:filename = 'def/jump.go'
@ -63,4 +67,8 @@ func! Test_Jump_leaves_lists() abort
endtry endtry
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -2,6 +2,10 @@
" Use of this source code is governed by a BSD-style " Use of this source code is governed by a BSD-style
" license that can be found in the LICENSE file. " license that can be found in the LICENSE file.
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:buf_nr = -1 let s:buf_nr = -1
function! go#doc#OpenBrowser(...) abort function! go#doc#OpenBrowser(...) abort
@ -51,13 +55,8 @@ endfunction
function! go#doc#Open(newmode, mode, ...) abort function! go#doc#Open(newmode, mode, ...) abort
" With argument: run "godoc [arg]". " With argument: run "godoc [arg]".
if len(a:000) if len(a:000)
if empty(go#path#CheckBinPath(go#config#DocCommand()[0])) let [l:out, l:err] = go#util#Exec(['go', 'doc'] + a:000)
return else " Without argument: run gogetdoc on cursor position.
endif
let [l:out, l:err] = go#util#Exec(go#config#DocCommand() + a:000)
" Without argument: run gogetdoc on cursor position.
else
let [l:out, l:err] = s:gogetdoc(0) let [l:out, l:err] = s:gogetdoc(0)
if out == -1 if out == -1
return return
@ -189,4 +188,8 @@ function! s:godocWord(args) abort
return [pkg, exported_name] return [pkg, exported_name]
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#fillstruct#FillStruct() abort function! go#fillstruct#FillStruct() abort
let l:cmd = ['fillstruct', let l:cmd = ['fillstruct',
\ '-file', bufname(''), \ '-file', bufname(''),
@ -61,4 +65,8 @@ function! go#fillstruct#FillStruct() abort
endtry endtry
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_fillstruct() abort func! Test_fillstruct() abort
try try
let l:tmp = gotest#write_file('a/a.go', [ let l:tmp = gotest#write_file('a/a.go', [
@ -87,4 +91,8 @@ func! Test_fillstruct_two_cursor() abort
endtry endtry
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -5,6 +5,10 @@
" fmt.vim: Vim command to format Go files with gofmt (and gofmt compatible " fmt.vim: Vim command to format Go files with gofmt (and gofmt compatible
" toorls, such as goimports). " toorls, such as goimports).
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" we have those problems : " we have those problems :
" http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree " http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree
" http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1 " http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1
@ -211,4 +215,8 @@ function! go#fmt#ToggleFmtAutoSave() abort
call go#util#EchoProgress("auto fmt enabled") call go#util#EchoProgress("auto fmt enabled")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_run_fmt() abort func! Test_run_fmt() abort
let actual_file = tempname() let actual_file = tempname()
call writefile(readfile("test-fixtures/fmt/hello.go"), actual_file) call writefile(readfile("test-fixtures/fmt/hello.go"), actual_file)
@ -46,4 +50,8 @@ func! Test_goimports() abort
call assert_equal(expected, actual) call assert_equal(expected, actual)
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,5 +1,9 @@
" guru.vim -- Vim integration for the Go guru. " guru.vim -- Vim integration for the Go guru.
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" guru_cmd returns a dict that contains the command to execute guru. args " guru_cmd returns a dict that contains the command to execute guru. args
" is dict with following options: " is dict with following options:
" mode : guru mode, such as 'implements' " mode : guru mode, such as 'implements'
@ -483,7 +487,7 @@ function! s:same_ids_highlight(exit_val, output, mode) abort
" is redisplayed: e.g. :edit, :GoRename, etc. " is redisplayed: e.g. :edit, :GoRename, etc.
augroup vim-go-sameids augroup vim-go-sameids
autocmd! autocmd!
autocmd BufWinEnter <buffer> nested call go#guru#SameIds() autocmd BufWinEnter <buffer> nested call go#guru#SameIds(0)
augroup end augroup end
endif endif
endfunction endfunction
@ -515,11 +519,11 @@ endfunction
function! go#guru#ToggleSameIds() abort function! go#guru#ToggleSameIds() abort
if go#guru#ClearSameIds() != 0 if go#guru#ClearSameIds() != 0
call go#guru#SameIds() call go#guru#SameIds(1)
endif endif
endfunction endfunction
function! go#guru#AutoToogleSameIds() abort function! go#guru#AutoToggleSameIds() abort
if go#config#AutoSameids() if go#config#AutoSameids()
call go#util#EchoProgress("sameids auto highlighting disabled") call go#util#EchoProgress("sameids auto highlighting disabled")
call go#guru#ClearSameIds() call go#guru#ClearSameIds()
@ -586,4 +590,8 @@ function! go#guru#Scope(...) abort
endif endif
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function Test_GuruScope_Set() abort function Test_GuruScope_Set() abort
silent call go#guru#Scope("example.com/foo/bar") silent call go#guru#Scope("example.com/foo/bar")
let actual = go#config#GuruScope() let actual = go#config#GuruScope()
@ -12,4 +16,8 @@ function Test_GuruScope_Set() abort
endif endif
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! Test_gomodVersion_highlight() abort function! Test_gomodVersion_highlight() abort
try try
syntax on syntax on
@ -92,4 +96,8 @@ function! Test_gomodVersion_incompatible_highlight() abort
endtry endtry
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#iferr#Generate() function! go#iferr#Generate()
let [l:out, l:err] = go#util#Exec(['iferr', let [l:out, l:err] = go#util#Exec(['iferr',
\ '-pos=' . go#util#OffsetCursor()], go#util#GetLines()) \ '-pos=' . go#util#OffsetCursor()], go#util#GetLines())
@ -14,3 +18,9 @@ function! go#iferr#Generate()
call setpos('.', l:pos) call setpos('.', l:pos)
silent normal! 4j silent normal! 4j
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#impl#Impl(...) abort function! go#impl#Impl(...) abort
let recv = "" let recv = ""
let iface = "" let iface = ""
@ -164,4 +168,8 @@ function! go#impl#Complete(arglead, cmdline, cursorpos) abort
endif endif
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_impl() abort func! Test_impl() abort
try try
let l:tmp = gotest#write_file('a/a.go', [ let l:tmp = gotest#write_file('a/a.go', [
@ -35,3 +39,9 @@ func! Test_impl_get() abort
call delete(l:tmp, 'rf') call delete(l:tmp, 'rf')
endtry endtry
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et

View file

@ -4,6 +4,11 @@
" "
" Check out the docs for more information at /doc/vim-go.txt " Check out the docs for more information at /doc/vim-go.txt
" "
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#import#SwitchImport(enabled, localname, path, bang) abort function! go#import#SwitchImport(enabled, localname, path, bang) abort
let view = winsaveview() let view = winsaveview()
let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '') let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '')
@ -220,5 +225,8 @@ function! s:Error(s) abort
echohl Error | echo a:s | echohl None echohl Error | echo a:s | echohl None
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_indent_raw_string() abort func! Test_indent_raw_string() abort
" The goRawString discovery requires that syntax be enabled. " The goRawString discovery requires that syntax be enabled.
syntax on syntax on
@ -60,3 +64,9 @@ func! Test_indent_raw_string() abort
call delete(l:dir, 'rf') call delete(l:dir, 'rf')
endtry endtry
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:templatepath = go#util#Join(expand('<sfile>:p:h:h:h'), '.github', 'ISSUE_TEMPLATE.md') let s:templatepath = go#util#Join(expand('<sfile>:p:h:h:h'), '.github', 'ISSUE_TEMPLATE.md')
function! go#issue#New() abort function! go#issue#New() abort
@ -31,4 +35,8 @@ function! s:issuebody() abort
return join(body, "\n") return join(body, "\n")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" Spawn starts an asynchronous job. See the description of go#job#Options to " Spawn starts an asynchronous job. See the description of go#job#Options to
" understand the args parameter. " understand the args parameter.
" "
@ -88,7 +92,6 @@ function! go#job#Options(args)
let state.errorformat = a:args.errorformat let state.errorformat = a:args.errorformat
endif endif
" do nothing in state.complete by default.
function state.complete(job, exit_status, data) function state.complete(job, exit_status, data)
if has_key(self, 'custom_complete') if has_key(self, 'custom_complete')
let l:winid = win_getid(winnr()) let l:winid = win_getid(winnr())
@ -539,4 +542,8 @@ function! s:winjobarg(idx, val) abort
return a:val return a:val
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#keyify#Keyify() function! go#keyify#Keyify()
" Needs: https://github.com/dominikh/go-tools/pull/272 " Needs: https://github.com/dominikh/go-tools/pull/272
"\ '-tags', go#config#BuildTags(), "\ '-tags', go#config#BuildTags(),
@ -53,4 +57,8 @@ function! s:chomp(string)
return substitute(a:string, '\n\+$', '', '') return substitute(a:string, '\n\+$', '', '')
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,4 +1,8 @@
function! go#lint#Gometa(autosave, ...) abort " don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#lint#Gometa(bang, autosave, ...) abort
if a:0 == 0 if a:0 == 0
let goargs = [expand('%:p:h')] let goargs = [expand('%:p:h')]
else else
@ -57,7 +61,7 @@ function! go#lint#Gometa(autosave, ...) abort
let cmd += goargs let cmd += goargs
if go#util#has_job() if go#util#has_job()
call s:lint_job({'cmd': cmd}, a:autosave) call s:lint_job({'cmd': cmd}, a:bang, a:autosave)
return return
endif endif
@ -85,7 +89,7 @@ function! go#lint#Gometa(autosave, ...) abort
let errors = go#list#Get(l:listtype) let errors = go#list#Get(l:listtype)
call go#list#Window(l:listtype, len(errors)) call go#list#Window(l:listtype, len(errors))
if !a:autosave if !a:autosave && !a:bang
call go#list#JumpToFirst(l:listtype) call go#list#JumpToFirst(l:listtype)
endif endif
endif endif
@ -93,7 +97,7 @@ endfunction
" Golint calls 'golint' on the current directory. Any warnings are populated in " Golint calls 'golint' on the current directory. Any warnings are populated in
" the location list " the location list
function! go#lint#Golint(...) abort function! go#lint#Golint(bang, ...) abort
if a:0 == 0 if a:0 == 0
let [l:out, l:err] = go#util#Exec([go#config#GolintBin(), go#package#ImportPath()]) let [l:out, l:err] = go#util#Exec([go#config#GolintBin(), go#package#ImportPath()])
else else
@ -109,7 +113,9 @@ function! go#lint#Golint(...) abort
call go#list#Parse(l:listtype, l:out, "GoLint") call go#list#Parse(l:listtype, l:out, "GoLint")
let l:errors = go#list#Get(l:listtype) let l:errors = go#list#Get(l:listtype)
call go#list#Window(l:listtype, len(l:errors)) call go#list#Window(l:listtype, len(l:errors))
if !a:bang
call go#list#JumpToFirst(l:listtype) call go#list#JumpToFirst(l:listtype)
endif
endfunction endfunction
" Vet calls 'go vet' on the current directory. Any warnings are populated in " Vet calls 'go vet' on the current directory. Any warnings are populated in
@ -143,7 +149,7 @@ endfunction
" ErrCheck calls 'errcheck' for the given packages. Any warnings are populated in " ErrCheck calls 'errcheck' for the given packages. Any warnings are populated in
" the location list " the location list
function! go#lint#Errcheck(...) abort function! go#lint#Errcheck(bang, ...) abort
if a:0 == 0 if a:0 == 0
let l:import_path = go#package#ImportPath() let l:import_path = go#package#ImportPath()
if import_path == -1 if import_path == -1
@ -175,7 +181,7 @@ function! go#lint#Errcheck(...) abort
if !empty(errors) if !empty(errors)
call go#list#Populate(l:listtype, errors, 'Errcheck') call go#list#Populate(l:listtype, errors, 'Errcheck')
call go#list#Window(l:listtype, len(errors)) call go#list#Window(l:listtype, len(errors))
if !empty(errors) if !a:bang
call go#list#JumpToFirst(l:listtype) call go#list#JumpToFirst(l:listtype)
endif endif
endif endif
@ -196,11 +202,12 @@ function! go#lint#ToggleMetaLinterAutoSave() abort
call go#util#EchoProgress("auto metalinter enabled") call go#util#EchoProgress("auto metalinter enabled")
endfunction endfunction
function! s:lint_job(args, autosave) function! s:lint_job(args, bang, autosave)
let l:opts = { let l:opts = {
\ 'statustype': "gometalinter", \ 'statustype': "gometalinter",
\ 'errorformat': '%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m', \ 'errorformat': '%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m',
\ 'for': "GoMetaLinter", \ 'for': "GoMetaLinter",
\ 'bang': a:bang,
\ } \ }
if a:autosave if a:autosave
@ -213,4 +220,8 @@ function! s:lint_job(args, autosave)
call go#job#Spawn(a:args.cmd, l:opts) call go#job#Spawn(a:args.cmd, l:opts)
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
func! Test_Gometa() abort func! Test_Gometa() abort
let $GOPATH = fnameescape(fnamemodify(getcwd(), ':p')) . 'test-fixtures/lint' let $GOPATH = fnameescape(fnamemodify(getcwd(), ':p')) . 'test-fixtures/lint'
silent exe 'e ' . $GOPATH . '/src/lint/lint.go' silent exe 'e ' . $GOPATH . '/src/lint/lint.go'
@ -11,7 +15,7 @@ func! Test_Gometa() abort
let g:go_metalinter_enabled = ['golint'] let g:go_metalinter_enabled = ['golint']
call go#lint#Gometa(0, $GOPATH . '/src/foo') call go#lint#Gometa(0, 0, $GOPATH . '/src/foo')
let actual = getqflist() let actual = getqflist()
let start = reltime() let start = reltime()
@ -37,7 +41,7 @@ func! Test_GometaWithDisabled() abort
let g:go_metalinter_disabled = ['vet'] let g:go_metalinter_disabled = ['vet']
call go#lint#Gometa(0, $GOPATH . '/src/foo') call go#lint#Gometa(0, 0, $GOPATH . '/src/foo')
let actual = getqflist() let actual = getqflist()
let start = reltime() let start = reltime()
@ -65,7 +69,7 @@ func! Test_GometaAutoSave() abort
let g:go_metalinter_autosave_enabled = ['golint'] let g:go_metalinter_autosave_enabled = ['golint']
call go#lint#Gometa(1) call go#lint#Gometa(0, 1)
let actual = getloclist(l:winnr) let actual = getloclist(l:winnr)
let start = reltime() let start = reltime()
@ -105,4 +109,8 @@ func! Test_Vet()
call gotest#assert_quickfix(actual, expected) call gotest#assert_quickfix(actual, expected)
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" Window opens the list with the given height up to 10 lines maximum. " Window opens the list with the given height up to 10 lines maximum.
" Otherwise g:go_loclist_height is used. " Otherwise g:go_loclist_height is used.
" "
@ -164,4 +168,8 @@ function! go#list#Type(for) abort
return get(go#config#ListTypeCommands(), a:for, l:listtype) return get(go#config#ListTypeCommands(), a:for, l:listtype)
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:go_major_version = "" let s:go_major_version = ""
function! go#mod#Format() abort function! go#mod#Format() abort
@ -138,3 +142,9 @@ function! go#mod#ToggleModFmtAutoSave() abort
call go#config#SetModFmtAutosave(1) call go#config#SetModFmtAutosave(1)
call go#util#EchoProgress("auto mod fmt enabled") call go#util#EchoProgress("auto mod fmt enabled")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et

View file

@ -5,6 +5,10 @@
" This file provides a utility function that performs auto-completion of " This file provides a utility function that performs auto-completion of
" package names, for use by other commands. " package names, for use by other commands.
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
let s:goos = $GOOS let s:goos = $GOOS
let s:goarch = $GOARCH let s:goarch = $GOARCH
@ -55,7 +59,7 @@ function! go#package#Paths() abort
endfunction endfunction
let s:import_paths = {} let s:import_paths = {}
" ImportPath returns the import path in the current directory it was executed " ImportPath returns the import path of the package for current buffer.
function! go#package#ImportPath() abort function! go#package#ImportPath() abort
let dir = expand("%:p:h") let dir = expand("%:p:h")
if has_key(s:import_paths, dir) if has_key(s:import_paths, dir)
@ -67,47 +71,50 @@ function! go#package#ImportPath() abort
return -1 return -1
endif endif
let import_path = split(out, '\n')[0] let l:importpath = split(out, '\n')[0]
" go list returns '_CURRENTDIRECTORY' if the directory is not inside GOPATH. " go list returns '_CURRENTDIRECTORY' if the directory is not inside GOPATH.
" Check it and retun an error if that is the case " Check it and retun an error if that is the case
if import_path[0] ==# '_' if l:importpath[0] ==# '_'
return -1 return -1
endif endif
let s:import_paths[dir] = import_path let s:import_paths[dir] = l:importpath
return import_path return l:importpath
endfunction endfunction
" FromPath returns the import path of arg.
function! go#package#FromPath(arg) abort function! go#package#FromPath(arg) abort
let path = fnamemodify(resolve(a:arg), ':p') let l:cd = exists('*haslocaldir') && haslocaldir() ? 'lcd' : 'cd'
let dirs = go#package#Paths() let l:dir = getcwd()
for dir in dirs let l:path = a:arg
if len(dir) && match(path, dir) == 0 if !isdirectory(l:path)
let workspace = dir let l:path = fnamemodify(l:path, ':h')
break
endif endif
endfor
if !exists('workspace') execute l:cd fnameescape(l:path)
let [l:out, l:err] = go#util#Exec(['go', 'list'])
execute l:cd fnameescape(l:dir)
if l:err != 0
return -1 return -1
endif endif
let path = substitute(path, '/*$', '', '') let l:importpath = split(l:out, '\n')[0]
let workspace = substitute(workspace . '/src/', '/+', '', '')
if isdirectory(path) " go list returns '_CURRENTDIRECTORY' if the directory is not inside GOPATH.
return substitute(path, workspace, '', '') " Check it and retun an error if that is the case
else if l:importpath[0] ==# '_'
return substitute(substitute(path, workspace, '', ''), return -1
\ '/' . fnamemodify(path, ':t'), '', '')
endif endif
return l:importpath
endfunction endfunction
function! go#package#CompleteMembers(package, member) abort function! go#package#CompleteMembers(package, member) abort
let [l:content, l:err] = go#util#Exec(['godoc', a:package]) let [l:content, l:err] = go#util#Exec(['go', 'doc', a:package])
if l:err || !len(content) if l:err || !len(content)
return [] return []
endif endif
@ -170,4 +177,8 @@ function! go#package#Complete(ArgLead, CmdLine, CursorPos) abort
return sort(keys(ret)) return sort(keys(ret))
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" initial_go_path is used to store the initial GOPATH that was set when Vim " initial_go_path is used to store the initial GOPATH that was set when Vim
" was started. It's used with :GoPathClear to restore the GOPATH when the user " was started. It's used with :GoPathClear to restore the GOPATH when the user
" changed it explicitly via :GoPath. Initially it's empty. It's being set when " changed it explicitly via :GoPath. Initially it's empty. It's being set when
@ -142,7 +146,8 @@ function! go#path#BinPath() abort
endfunction endfunction
" CheckBinPath checks whether the given binary exists or not and returns the " CheckBinPath checks whether the given binary exists or not and returns the
" path of the binary. It returns an empty string doesn't exists. " path of the binary, respecting the go_bin_path and go_search_bin_path_first
" settings. It returns an empty string if the binary doesn't exist.
function! go#path#CheckBinPath(binpath) abort function! go#path#CheckBinPath(binpath) abort
" remove whitespaces if user applied something like 'goimports ' " remove whitespaces if user applied something like 'goimports '
let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '')
@ -155,7 +160,12 @@ function! go#path#CheckBinPath(binpath) abort
if !empty(go_bin_path) if !empty(go_bin_path)
" append our GOBIN and GOPATH paths and be sure they can be found there... " append our GOBIN and GOPATH paths and be sure they can be found there...
" let us search in our GOBIN and GOPATH paths " let us search in our GOBIN and GOPATH paths
" respect the ordering specified by go_search_bin_path_first
if go#config#SearchBinPathFirst()
let $PATH = go_bin_path . go#util#PathListSep() . $PATH let $PATH = go_bin_path . go#util#PathListSep() . $PATH
else
let $PATH = $PATH . go#util#PathListSep() . go_bin_path
endif
endif endif
" if it's in PATH just return it " if it's in PATH just return it
@ -195,4 +205,8 @@ function! s:CygwinPath(path)
return substitute(a:path, '\\', '/', "g") return substitute(a:path, '\\', '/', "g")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#play#Share(count, line1, line2) abort function! go#play#Share(count, line1, line2) abort
if !executable('curl') if !executable('curl')
echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None
@ -66,4 +70,8 @@ function! s:get_visual_selection() abort
return join(lines, "\n") return join(lines, "\n")
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
function! go#rename#Rename(bang, ...) abort function! go#rename#Rename(bang, ...) abort
let to_identifier = "" let to_identifier = ""
if a:0 == 0 if a:0 == 0
@ -117,4 +121,8 @@ function! go#rename#Complete(lead, cmdline, cursor)
\ 'strpart(v:val, 0, len(a:lead)) == a:lead') \ 'strpart(v:val, 0, len(a:lead)) == a:lead')
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" Statusline " Statusline
"""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""
@ -109,4 +113,8 @@ function! go#statusline#Clear(timer_id) abort
exe 'let &ro = &ro' exe 'let &ro = &ro'
endfunction endfunction
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

View file

@ -1,3 +1,7 @@
" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim
" mapped to :GoAddTags " mapped to :GoAddTags
function! go#tags#Add(start, end, count, ...) abort function! go#tags#Add(start, end, count, ...) abort
let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') let fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
@ -208,4 +212,8 @@ func s:create_cmd(args) abort
return {'cmd': cmd} return {'cmd': cmd}
endfunc endfunc
" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

Some files were not shown because too many files have changed in this diff Show more