1
0
Fork 0
mirror of synced 2024-12-25 08:13:20 -05:00

Merge branch 'amix:master' into sources

This commit is contained in:
Wu Tingfeng 2023-04-07 00:46:33 +08:00 committed by GitHub
commit 186b620723
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
99 changed files with 2387 additions and 627 deletions

View file

@ -90,7 +90,7 @@ I recommend reading the docs of these plugins to understand them better. Each pl
* [pathogen.vim](https://github.com/tpope/vim-pathogen): Manage your vim runtimepath * [pathogen.vim](https://github.com/tpope/vim-pathogen): Manage your vim runtimepath
* [snipmate.vim](https://github.com/garbas/vim-snipmate): snipmate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim * [snipmate.vim](https://github.com/garbas/vim-snipmate): snipmate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim
* [ale](https://github.com/dense-analysis/ale): Syntax and lint checking for vim (ALE requires NeoVim >= 0.2.0 or Vim 8 with +timers +job +channel) * [ale](https://github.com/dense-analysis/ale): Syntax and lint checking for vim (ALE requires NeoVim >= 0.2.0 or Vim 8 with +timers +job +channel)
* [vim-commentary](https://github.com/tpope/vim-commentary): Comment stuff out. Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion. `gcu` uncomments a set of adjacent commented lines. * [vim-commentary](https://github.com/tpope/vim-commentary): Comment stuff out. Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion. `gcu` uncomments a set of adjacent commented lines
* [vim-expand-region](https://github.com/terryma/vim-expand-region): Allows you to visually select increasingly larger regions of text using the same key combination * [vim-expand-region](https://github.com/terryma/vim-expand-region): Allows you to visually select increasingly larger regions of text using the same key combination
* [vim-fugitive](https://github.com/tpope/vim-fugitive): A Git wrapper so awesome, it should be illegal * [vim-fugitive](https://github.com/tpope/vim-fugitive): A Git wrapper so awesome, it should be illegal
* [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts * [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts
@ -99,7 +99,8 @@ I recommend reading the docs of these plugins to understand them better. Each pl
* [vim-zenroom2](https://github.com/amix/vim-zenroom2) Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room * [vim-zenroom2](https://github.com/amix/vim-zenroom2) Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room
* [gist-vim](https://github.com/mattn/gist-vim) Easily create gists from Vim using the `:Gist` command * [gist-vim](https://github.com/mattn/gist-vim) Easily create gists from Vim using the `:Gist` command
* [vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) Is a plugin for visually displaying indent levels in Vim * [vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) Is a plugin for visually displaying indent levels in Vim
* [editorconfig-vim](https://github.com/editorconfig/editorconfig-vim) EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs. * [editorconfig-vim](https://github.com/editorconfig/editorconfig-vim) EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs
* [copilot.vim](https://github.com/github/copilot.vim) Plugin for GitHub Copilot (AI autocompletion FTW 😅)
## Included color schemes ## Included color schemes

View file

@ -1,4 +1,4 @@
Copyright (c) 2016-2020, w0rp <devw0rp@gmail.com> Copyright (c) 2016-2023, Dense Analysis
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View file

@ -25,7 +25,7 @@ function! ale_linters#ansible#ansible_lint#Handle(buffer, version, lines) abort
if '>=6.0.0' is# l:version_group if '>=6.0.0' is# l:version_group
let l:error_codes = { 'blocker': 'E', 'critical': 'E', 'major': 'W', 'minor': 'W', 'info': 'I' } let l:error_codes = { 'blocker': 'E', 'critical': 'E', 'major': 'W', 'minor': 'W', 'info': 'I' }
let l:linter_issues = json_decode(join(a:lines, '')) let l:linter_issues = ale#util#FuzzyJSONDecode(a:lines, [])
for l:issue in l:linter_issues for l:issue in l:linter_issues
if ale#path#IsBufferPath(a:buffer, l:issue.location.path) if ale#path#IsBufferPath(a:buffer, l:issue.location.path)

View file

@ -0,0 +1,37 @@
" Author: uidops <uidops@protonmail.com>
" Description: llvm-mc linter for asm files
call ale#Set('asm_llvm_mc_executable', 'llvm-mc')
call ale#Set('asm_llvm_mc_options', '')
function! ale_linters#asm#llvm_mc#GetCommand(buffer) abort
return '%e --assemble'
\ . ' --filetype=asm'
\ . ' -o ' . g:ale#util#nul_file
\ . ' ' . ale#Var(a:buffer, 'asm_llvm_mc_options')
endfunction
function! ale_linters#asm#llvm_mc#Handle(buffer, lines) abort
let l:pattern = '^.\+:\(\d\+\):\(\d\+\): \([^:]\+\): \(.\+\)$'
let l:output = []
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 0,
\ 'type': l:match[3] =~? 'error' ? 'E' : 'W',
\ 'text': l:match[4],
\})
endfor
return l:output
endfunction
call ale#linter#Define('asm', {
\ 'name': 'llvm_mc',
\ 'output_stream': 'stderr',
\ 'executable': {b -> ale#Var(b, 'asm_llvm_mc_executable')},
\ 'command': function('ale_linters#asm#llvm_mc#GetCommand'),
\ 'callback': 'ale_linters#asm#llvm_mc#Handle',
\})

View file

@ -0,0 +1,12 @@
" Author: Victor Ananyev <vindex10@gmail.com>
" Description: eslint for js snippets in HTML files
call ale#linter#Define('html', {
\ 'name': 'eslint',
\ 'output_stream': 'both',
\ 'executable': function('ale#handlers#eslint#GetExecutable'),
\ 'cwd': function('ale#handlers#eslint#GetCwd'),
\ 'command': function('ale#handlers#eslint#GetCommand'),
\ 'callback': 'ale#handlers#eslint#HandleJSON',
\ })

View file

@ -0,0 +1,15 @@
" Author: w0rp <dev@w0rp.com>
" Description: lua-language-server integration (https://github.com/LuaLS/lua-language-server)
call ale#Set('lua_language_server_executable', 'lua-language-server')
call ale#Set('lua_language_server_config', {})
call ale#linter#Define('lua', {
\ 'name': 'lua_language_server',
\ 'aliases': ['lua-language-server'],
\ 'lsp': 'stdio',
\ 'executable': {b -> ale#Var(b, 'lua_language_server_executable')},
\ 'command': '%e',
\ 'project_root': function('ale#lua#FindProjectRoot'),
\ 'lsp_config': {b -> ale#Var(b, 'lua_language_server_config')},
\})

View file

@ -0,0 +1,13 @@
call ale#Set('nix_deadnix_executable', 'deadnix')
call ale#Set('nix_deadnix_options', '')
function! ale_linters#nix#deadnix#GetCommand(buffer) abort
return '%e -o json' . ale#Pad(ale#Var(a:buffer, 'nix_deadnix_options')) . ' -- %t'
endfunction
call ale#linter#Define('nix', {
\ 'name': 'deadnix',
\ 'executable': {b -> ale#Var(b, 'nix_deadnix_executable')},
\ 'command': function('ale_linters#nix#deadnix#GetCommand'),
\ 'callback': 'ale#handlers#deadnix#Handle',
\})

View file

@ -5,10 +5,10 @@
function! ale_linters#nix#nix#Command(buffer, output, meta) abort function! ale_linters#nix#nix#Command(buffer, output, meta) abort
let l:version = a:output[0][22:] let l:version = a:output[0][22:]
if l:version =~# '^\(2.[4-9]\|3\).*' if l:version =~# '^\(1\|2.[0-3]\.\).*'
return 'nix-instantiate --log-format internal-json --parse -'
else
return 'nix-instantiate --parse -' return 'nix-instantiate --parse -'
else
return 'nix-instantiate --log-format internal-json --parse -'
endif endif
endfunction endfunction

View file

@ -26,10 +26,8 @@ function! ale_linters#php#phpstan#GetCommand(buffer, version) abort
\ : '' \ : ''
let l:level = ale#Var(a:buffer, 'php_phpstan_level') let l:level = ale#Var(a:buffer, 'php_phpstan_level')
let l:config_file_exists = ale#path#FindNearestFile(a:buffer, 'phpstan.neon')
let l:dist_config_file_exists = ale#path#FindNearestFile(a:buffer, 'phpstan.neon.dist')
if empty(l:level) && empty(l:config_file_exists) && empty(l:dist_config_file_exists) if empty(l:level) && empty(ale_linters#php#phpstan#FindConfigFile(a:buffer))
" if no configuration file is found, then use 4 as a default level " if no configuration file is found, then use 4 as a default level
let l:level = '4' let l:level = '4'
endif endif
@ -70,6 +68,22 @@ function! ale_linters#php#phpstan#Handle(buffer, lines) abort
return l:output return l:output
endfunction endfunction
function! ale_linters#php#phpstan#GetCwd(buffer) abort
let l:result = ale#path#Dirname(ale_linters#php#phpstan#FindConfigFile(a:buffer))
return empty(l:result) ? v:null : l:result
endfunction
function! ale_linters#php#phpstan#FindConfigFile(buffer) abort
let l:result = ale#path#FindNearestFile(a:buffer, 'phpstan.neon')
if empty(l:result)
let l:result = ale#path#FindNearestFile(a:buffer, 'phpstan.neon.dist')
endif
return l:result
endfunction
call ale#linter#Define('php', { call ale#linter#Define('php', {
\ 'name': 'phpstan', \ 'name': 'phpstan',
\ 'executable': {buffer -> ale#path#FindExecutable(buffer, 'php_phpstan', [ \ 'executable': {buffer -> ale#path#FindExecutable(buffer, 'php_phpstan', [
@ -86,4 +100,5 @@ call ale#linter#Define('php', {
\ function('ale_linters#php#phpstan#GetCommand'), \ function('ale_linters#php#phpstan#GetCommand'),
\ )}, \ )},
\ 'callback': 'ale_linters#php#phpstan#Handle', \ 'callback': 'ale_linters#php#phpstan#Handle',
\ 'cwd': function('ale_linters#php#phpstan#GetCwd'),
\}) \})

View file

@ -16,12 +16,16 @@ endfunction
function! ale_linters#python#jedils#GetCommand(buffer) abort function! ale_linters#python#jedils#GetCommand(buffer) abort
let l:executable = ale_linters#python#jedils#GetExecutable(a:buffer) let l:executable = ale_linters#python#jedils#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv$' let l:exec_args = l:executable =~? 'pipenv$'
\ ? ' run jedi-language-server' \ ? ' run jedi-language-server'
\ : '' \ : ''
let l:env_string = ''
return ale#Escape(l:executable) . l:exec_args if ale#Var(a:buffer, 'python_auto_virtualenv')
let l:env_string = ale#python#AutoVirtualenvEnvString(a:buffer)
endif
return l:env_string . ale#Escape(l:executable) . l:exec_args
endfunction endfunction
call ale#linter#Define('python', { call ale#linter#Define('python', {

View file

@ -0,0 +1,86 @@
" Author: Yining <zhang.yining@gmail.com>
" Description: pycln as linter for python files
call ale#Set('python_pycln_executable', 'pycln')
call ale#Set('python_pycln_options', '')
call ale#Set('python_pycln_use_global', get(g:, 'ale_use_global_executables', 0))
call ale#Set('python_pycln_change_directory', 1)
call ale#Set('python_pycln_auto_pipenv', 0)
call ale#Set('python_pycln_auto_poetry', 0)
call ale#Set('python_pycln_config_file', '')
function! ale_linters#python#pycln#GetExecutable(buffer) abort
if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pycln_auto_pipenv'))
\ && ale#python#PipenvPresent(a:buffer)
return 'pipenv'
endif
if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pycln_auto_poetry'))
\ && ale#python#PoetryPresent(a:buffer)
return 'poetry'
endif
return ale#python#FindExecutable(a:buffer, 'python_pycln', ['pycln'])
endfunction
function! ale_linters#python#pycln#GetCwd(buffer) abort
if ale#Var(a:buffer, 'python_pycln_change_directory')
" Run from project root if found, else from buffer dir.
let l:project_root = ale#python#FindProjectRoot(a:buffer)
return !empty(l:project_root) ? l:project_root : '%s:h'
endif
return ''
endfunction
function! ale_linters#python#pycln#GetCommand(buffer, version) abort
let l:executable = ale_linters#python#pycln#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run pycln'
\ : ''
let l:options = ale#Var(a:buffer, 'python_pycln_options')
let l:config_file = ale#Var(a:buffer, 'python_pycln_config_file')
let l:config_file = l:options !~# '\v(^| )--config ' && !empty(l:config_file)
\ ? ale#Escape(ale#path#Simplify(l:config_file))
\ : ''
" NOTE: pycln version `1.3.0` supports liniting input from stdin
return ale#Escape(l:executable) . l:exec_args
\ . ale#Pad(ale#Var(a:buffer, 'python_pycln_options'))
\ . (empty(l:config_file) ? '' : ' --config ' . l:config_file)
\ . ' --check'
\ . (ale#semver#GTE(a:version, [1, 3, 0]) ? ' -' : ' %s')
endfunction
function! ale_linters#python#pycln#Handle(buffer, lines) abort
" Example: tmp/test.py:3:0 'import os' would be removed!
let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+):? (.+)$'
let l:output = []
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 0,
\ 'text': l:match[3],
\})
endfor
return l:output
endfunction
call ale#linter#Define('python', {
\ 'name': 'pycln',
\ 'executable': function('ale_linters#python#pycln#GetExecutable'),
\ 'cwd': function('ale_linters#python#pycln#GetCwd'),
\ 'command': {buffer -> ale#semver#RunWithVersionCheck(
\ buffer,
\ ale_linters#python#pycln#GetExecutable(buffer),
\ '%e --version',
\ function('ale_linters#python#pycln#GetCommand'),
\ )},
\ 'callback': 'ale_linters#python#pycln#Handle',
\ 'output_stream': 'both',
\ 'read_buffer': 1,
\})

View file

@ -22,20 +22,38 @@ function! ale_linters#python#pylsp#GetExecutable(buffer) abort
return ale#python#FindExecutable(a:buffer, 'python_pylsp', ['pylsp']) return ale#python#FindExecutable(a:buffer, 'python_pylsp', ['pylsp'])
endfunction endfunction
" Force the cwd of the server to be the same as the project root to
" fix issues with treating local files matching first or third party library
" names being imported incorrectly.
function! ale_linters#python#pylsp#GetCwd(buffer) abort
let l:fake_linter = {
\ 'name': 'pylsp',
\ 'project_root': function('ale#python#FindProjectRoot'),
\}
let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, l:fake_linter)
return !empty(l:root) ? l:root : v:null
endfunction
function! ale_linters#python#pylsp#GetCommand(buffer) abort function! ale_linters#python#pylsp#GetCommand(buffer) abort
let l:executable = ale_linters#python#pylsp#GetExecutable(a:buffer) let l:executable = ale_linters#python#pylsp#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$' let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run pylsp' \ ? ' run pylsp'
\ : '' \ : ''
let l:env_string = ''
return ale#Escape(l:executable) . l:exec_args . ale#Pad(ale#Var(a:buffer, 'python_pylsp_options')) if ale#Var(a:buffer, 'python_auto_virtualenv')
let l:env_string = ale#python#AutoVirtualenvEnvString(a:buffer)
endif
return l:env_string . ale#Escape(l:executable) . l:exec_args . ale#Pad(ale#Var(a:buffer, 'python_pylsp_options'))
endfunction endfunction
call ale#linter#Define('python', { call ale#linter#Define('python', {
\ 'name': 'pylsp', \ 'name': 'pylsp',
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable': function('ale_linters#python#pylsp#GetExecutable'), \ 'executable': function('ale_linters#python#pylsp#GetExecutable'),
\ 'cwd': function('ale_linters#python#pylsp#GetCwd'),
\ 'command': function('ale_linters#python#pylsp#GetCommand'), \ 'command': function('ale_linters#python#pylsp#GetCommand'),
\ 'project_root': function('ale#python#FindProjectRoot'), \ 'project_root': function('ale#python#FindProjectRoot'),
\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',

View file

@ -1,5 +1,21 @@
call ale#Set('python_pyright_use_global', get(g:, 'ale_use_global_executables', 0))
call ale#Set('python_pyright_executable', 'pyright-langserver') call ale#Set('python_pyright_executable', 'pyright-langserver')
call ale#Set('python_pyright_config', {}) call ale#Set('python_pyright_config', {})
call ale#Set('python_pyright_auto_pipenv', 0)
call ale#Set('python_pyright_auto_poetry', 0)
" Force the cwd of the server to be the same as the project root to
" fix issues with treating local files matching first or third party library
" names being imported incorrectly.
function! ale_linters#python#pyright#GetCwd(buffer) abort
let l:fake_linter = {
\ 'name': 'pyright',
\ 'project_root': function('ale#python#FindProjectRoot'),
\}
let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, l:fake_linter)
return !empty(l:root) ? l:root : v:null
endfunction
function! ale_linters#python#pyright#GetConfig(buffer) abort function! ale_linters#python#pyright#GetConfig(buffer) abort
let l:config = deepcopy(ale#Var(a:buffer, 'python_pyright_config')) let l:config = deepcopy(ale#Var(a:buffer, 'python_pyright_config'))
@ -32,11 +48,40 @@ function! ale_linters#python#pyright#GetConfig(buffer) abort
return l:config return l:config
endfunction endfunction
function! ale_linters#python#pyright#GetExecutable(buffer) abort
if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pyright_auto_pipenv'))
\ && ale#python#PipenvPresent(a:buffer)
return 'pipenv'
endif
if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pyright_auto_poetry'))
\ && ale#python#PoetryPresent(a:buffer)
return 'poetry'
endif
return ale#python#FindExecutable(a:buffer, 'python_pyright', ['pyright-langserver'])
endfunction
function! ale_linters#python#pyright#GetCommand(buffer) abort
let l:executable = ale_linters#python#pyright#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run pyright'
\ : ''
let l:env_string = ''
if ale#Var(a:buffer, 'python_auto_virtualenv')
let l:env_string = ale#python#AutoVirtualenvEnvString(a:buffer)
endif
return l:env_string . ale#Escape(l:executable) . l:exec_args . ' --stdio'
endfunction
call ale#linter#Define('python', { call ale#linter#Define('python', {
\ 'name': 'pyright', \ 'name': 'pyright',
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable': {b -> ale#Var(b, 'python_pyright_executable')}, \ 'cwd': function('ale_linters#python#pyright#GetCwd'),
\ 'command': '%e --stdio', \ 'executable': function('ale_linters#python#pyright#GetExecutable'),
\ 'command': function('ale_linters#python#pyright#GetCommand'),
\ 'project_root': function('ale#python#FindProjectRoot'), \ 'project_root': function('ale#python#FindProjectRoot'),
\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
\ 'lsp_config': function('ale_linters#python#pyright#GetConfig'), \ 'lsp_config': function('ale_linters#python#pyright#GetConfig'),

View file

@ -0,0 +1,73 @@
" Author: Yining <zhang.yining@gmail.com>
" Description: refurb as linter for python files
call ale#Set('python_refurb_executable', 'refurb')
call ale#Set('python_refurb_options', '')
call ale#Set('python_refurb_use_global', get(g:, 'ale_use_global_executables', 0))
call ale#Set('python_refurb_change_directory', 1)
call ale#Set('python_refurb_auto_pipenv', 0)
call ale#Set('python_refurb_auto_poetry', 0)
function! ale_linters#python#refurb#GetExecutable(buffer) abort
if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_refurb_auto_pipenv'))
\ && ale#python#PipenvPresent(a:buffer)
return 'pipenv'
endif
if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_refurb_auto_poetry'))
\ && ale#python#PoetryPresent(a:buffer)
return 'poetry'
endif
return ale#python#FindExecutable(a:buffer, 'python_refurb', ['refurb'])
endfunction
function! ale_linters#python#refurb#GetCwd(buffer) abort
if ale#Var(a:buffer, 'python_refurb_change_directory')
" Run from project root if found, else from buffer dir.
let l:project_root = ale#python#FindProjectRoot(a:buffer)
return !empty(l:project_root) ? l:project_root : '%s:h'
endif
return ''
endfunction
function! ale_linters#python#refurb#GetCommand(buffer) abort
let l:executable = ale_linters#python#refurb#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run refurb'
\ : ''
return ale#Escape(l:executable) . l:exec_args
\ . ale#Pad(ale#Var(a:buffer, 'python_refurb_options'))
\ . ' %s'
endfunction
function! ale_linters#python#refurb#Handle(buffer, lines) abort
"Example: path/to/file.py:3:17 [FURB109]: Replace `in [x, y, z]` with `in (x, y, z)`
let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+)?:?\s*\[FURB(\d+)\]:\s*(.+)$'
let l:output = []
for l:match in ale#util#GetMatches(a:lines, l:pattern)
call add(l:output, {
\ 'lnum': l:match[1] + 0,
\ 'col': l:match[2] + 0,
\ 'code': l:match[3] + 0,
\ 'text': l:match[4],
\ 'type': 'W',
\})
endfor
return l:output
endfunction
call ale#linter#Define('python', {
\ 'name': 'refurb',
\ 'executable': function('ale_linters#python#refurb#GetExecutable'),
\ 'cwd': function('ale_linters#python#refurb#GetCwd'),
\ 'command': function('ale_linters#python#refurb#GetCommand'),
\ 'callback': 'ale_linters#python#refurb#Handle',
\ 'output_stream': 'both',
\ 'read_buffer': 0,
\})

View file

@ -49,7 +49,7 @@ function! ale_linters#python#ruff#GetCommand(buffer, version) abort
return ale#Escape(l:executable) . l:exec_args return ale#Escape(l:executable) . l:exec_args
\ . ale#Pad(ale#Var(a:buffer, 'python_ruff_options')) \ . ale#Pad(ale#Var(a:buffer, 'python_ruff_options'))
\ . ' --format text' \ . ' --format text'
\ . (ale#semver#GTE(a:version, [0, 0, 69]) ? ' -' : ' %s') \ . (ale#semver#GTE(a:version, [0, 0, 69]) ? ' --stdin-filename %s -' : ' %s')
endfunction endfunction
function! ale_linters#python#ruff#Handle(buffer, lines) abort function! ale_linters#python#ruff#Handle(buffer, lines) abort

View file

@ -157,7 +157,7 @@ function! ale#Queue(delay, ...) abort
endif endif
endfunction endfunction
let s:current_ale_version = [3, 2, 0] let s:current_ale_version = [3, 3, 0]
" A function used to check for ALE features in files outside of the project. " A function used to check for ALE features in files outside of the project.
function! ale#Has(feature) abort function! ale#Has(feature) abort
@ -254,6 +254,7 @@ function! ale#GetLocItemMessage(item, format_string) abort
" \=l:variable is used to avoid escaping issues. " \=l:variable is used to avoid escaping issues.
let l:msg = substitute(l:msg, '\v\%([^\%]*)code([^\%]*)\%', l:code_repl, 'g') let l:msg = substitute(l:msg, '\v\%([^\%]*)code([^\%]*)\%', l:code_repl, 'g')
let l:msg = substitute(l:msg, '\V%severity%', '\=l:severity', 'g') let l:msg = substitute(l:msg, '\V%severity%', '\=l:severity', 'g')
let l:msg = substitute(l:msg, '\V%type%', '\=l:type', 'g')
let l:msg = substitute(l:msg, '\V%linter%', '\=l:linter_name', 'g') let l:msg = substitute(l:msg, '\V%linter%', '\=l:linter_name', 'g')
" Replace %s with the text. " Replace %s with the text.
let l:msg = substitute(l:msg, '\V%s', '\=a:item.text', 'g') let l:msg = substitute(l:msg, '\V%s', '\=a:item.text', 'g')

View file

@ -55,6 +55,7 @@ let s:global_variable_list = [
\ 'ale_sign_highlight_linenrs', \ 'ale_sign_highlight_linenrs',
\ 'ale_statusline_format', \ 'ale_statusline_format',
\ 'ale_type_map', \ 'ale_type_map',
\ 'ale_use_neovim_diagnostics_api',
\ 'ale_use_global_executables', \ 'ale_use_global_executables',
\ 'ale_virtualtext_cursor', \ 'ale_virtualtext_cursor',
\ 'ale_warn_about_trailing_blank_lines', \ 'ale_warn_about_trailing_blank_lines',

View file

@ -184,9 +184,13 @@ endfunction
function! ale#engine#SetResults(buffer, loclist) abort function! ale#engine#SetResults(buffer, loclist) abort
let l:linting_is_done = !ale#engine#IsCheckingBuffer(a:buffer) let l:linting_is_done = !ale#engine#IsCheckingBuffer(a:buffer)
if g:ale_use_neovim_diagnostics_api
call ale#engine#SendResultsToNeovimDiagnostics(a:buffer, a:loclist)
endif
" Set signs first. This could potentially fix some line numbers. " Set signs first. This could potentially fix some line numbers.
" The List could be sorted again here by SetSigns. " The List could be sorted again here by SetSigns.
if g:ale_set_signs if !g:ale_use_neovim_diagnostics_api && g:ale_set_signs
call ale#sign#SetSigns(a:buffer, a:loclist) call ale#sign#SetSigns(a:buffer, a:loclist)
endif endif
@ -199,11 +203,12 @@ function! ale#engine#SetResults(buffer, loclist) abort
call ale#statusline#Update(a:buffer, a:loclist) call ale#statusline#Update(a:buffer, a:loclist)
endif endif
if g:ale_set_highlights if !g:ale_use_neovim_diagnostics_api && g:ale_set_highlights
call ale#highlight#SetHighlights(a:buffer, a:loclist) call ale#highlight#SetHighlights(a:buffer, a:loclist)
endif endif
if g:ale_virtualtext_cursor == 2 if !g:ale_use_neovim_diagnostics_api
\&& (g:ale_virtualtext_cursor is# 'all' || g:ale_virtualtext_cursor == 2)
call ale#virtualtext#SetTexts(a:buffer, a:loclist) call ale#virtualtext#SetTexts(a:buffer, a:loclist)
endif endif
@ -214,7 +219,8 @@ function! ale#engine#SetResults(buffer, loclist) abort
call ale#cursor#EchoCursorWarning() call ale#cursor#EchoCursorWarning()
endif endif
if g:ale_virtualtext_cursor == 1 if !g:ale_use_neovim_diagnostics_api
\&& (g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor == 1)
" Try and show the warning now. " Try and show the warning now.
" This will only do something meaningful if we're in normal mode. " This will only do something meaningful if we're in normal mode.
call ale#virtualtext#ShowCursorWarning() call ale#virtualtext#ShowCursorWarning()
@ -238,6 +244,19 @@ function! ale#engine#SetResults(buffer, loclist) abort
endif endif
endfunction endfunction
function! ale#engine#SendResultsToNeovimDiagnostics(buffer, loclist) abort
if !has('nvim-0.6')
" We will warn the user on startup as well if they try to set
" g:ale_use_neovim_diagnostics_api outside of a Neovim context.
return
endif
" Keep the Lua surface area really small in the VimL part of ALE,
" and just require the diagnostics.lua module on demand.
let l:SendDiagnostics = luaeval('require("diagnostics").sendAleResultsToDiagnostics')
call l:SendDiagnostics(a:buffer, a:loclist)
endfunction
function! s:RemapItemTypes(type_map, loclist) abort function! s:RemapItemTypes(type_map, loclist) abort
for l:item in a:loclist for l:item in a:loclist
let l:key = l:item.type let l:key = l:item.type

View file

@ -139,7 +139,7 @@ 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 == 1 if g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor is# 1 || g:ale_virtualtext_cursor is# '1'
autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarningWithDelay() | endif 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. " Look for a warning to echo as soon as we leave Insert mode.
" The script's position variable used when moving the cursor will " The script's position variable used when moving the cursor will

View file

@ -7,6 +7,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['python'], \ 'suggested_filetypes': ['python'],
\ 'description': 'Add blank lines before control statements.', \ 'description': 'Add blank lines before control statements.',
\ }, \ },
\ 'alejandra': {
\ 'function': 'ale#fixers#alejandra#Fix',
\ 'suggested_filetypes': ['nix'],
\ 'description': 'The Uncompromising Nix Code Formatter',
\ },
\ 'align_help_tags': { \ 'align_help_tags': {
\ 'function': 'ale#fixers#help#AlignTags', \ 'function': 'ale#fixers#help#AlignTags',
\ 'suggested_filetypes': ['help'], \ 'suggested_filetypes': ['help'],
@ -301,6 +306,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['gomod'], \ 'suggested_filetypes': ['gomod'],
\ 'description': 'Fix Go module files with go mod edit -fmt.', \ 'description': 'Fix Go module files with go mod edit -fmt.',
\ }, \ },
\ 'gopls': {
\ 'function': 'ale#fixers#gopls#Fix',
\ 'suggested_filetypes': ['go'],
\ 'description': 'Fix Go files with gopls.',
\ },
\ 'tslint': { \ 'tslint': {
\ 'function': 'ale#fixers#tslint#Fix', \ 'function': 'ale#fixers#tslint#Fix',
\ 'suggested_filetypes': ['typescript'], \ 'suggested_filetypes': ['typescript'],
@ -580,6 +590,21 @@ let s:default_registry = {
\ 'function': 'ale#fixers#raco_fmt#Fix', \ 'function': 'ale#fixers#raco_fmt#Fix',
\ 'suggested_filetypes': ['racket'], \ 'suggested_filetypes': ['racket'],
\ 'description': 'Fix Racket files with raco fmt.', \ 'description': 'Fix Racket files with raco fmt.',
\ },
\ 'ruff': {
\ 'function': 'ale#fixers#ruff#Fix',
\ 'suggested_filetypes': ['python'],
\ 'description': 'Fix python files with ruff.',
\ },
\ 'pycln': {
\ 'function': 'ale#fixers#pycln#Fix',
\ 'suggested_filetypes': ['python'],
\ 'description': 'remove unused python import statements',
\ },
\ 'rustywind': {
\ 'function': 'ale#fixers#rustywind#Fix',
\ 'suggested_filetypes': ['html'],
\ 'description': 'Sort Tailwind CSS classes',
\ } \ }
\} \}

View file

@ -0,0 +1,13 @@
call ale#Set('nix_alejandra_executable', 'alejandra')
call ale#Set('nix_alejandra_options', '')
function! ale#fixers#alejandra#Fix(buffer) abort
let l:executable = ale#Var(a:buffer, 'nix_alejandra_executable')
let l:options = ale#Var(a:buffer, 'nix_alejandra_options')
return {
\ 'command': ale#Escape(l:executable)
\ . (empty(l:options) ? '' : ' ' . l:options)
\ . ' -- -'
\}
endfunction

View file

@ -0,0 +1,23 @@
" Author: Sean Enck <enckse@voidedtech.com>
" Description: Integration of gopls format with ALE.
call ale#Set('go_gopls_fix_executable', 'gopls')
call ale#Set('go_gopls_fix_options', '')
function! ale#fixers#gopls#Fix(buffer) abort
let l:executable = ale#Var(a:buffer, 'go_gopls_fix_executable')
let l:options = ale#Var(a:buffer, 'go_gopls_fix_options')
let l:env = ale#go#EnvString(a:buffer)
if !executable(l:executable)
return 0
endif
return {
\ 'command': l:env . ale#Escape(l:executable)
\ . ' format'
\ . ale#Pad(l:options)
\ . ' -l -w %t',
\ 'read_temporary_file': 1,
\}
endfunction

View file

@ -0,0 +1,90 @@
" Author: Yining <zhang.yining@gmail.com>
" Description: pycln as ALE fixer for python files
call ale#Set('python_pycln_executable', 'pycln')
call ale#Set('python_pycln_options', '')
call ale#Set('python_pycln_use_global', get(g:, 'ale_use_global_executables', 0))
call ale#Set('python_pycln_change_directory', 1)
call ale#Set('python_pycln_auto_pipenv', 0)
call ale#Set('python_pycln_auto_poetry', 0)
call ale#Set('python_pycln_config_file', '')
function! ale#fixers#pycln#GetCwd(buffer) abort
if ale#Var(a:buffer, 'python_pycln_change_directory')
" Run from project root if found, else from buffer dir.
let l:project_root = ale#python#FindProjectRoot(a:buffer)
return !empty(l:project_root) ? l:project_root : '%s:h'
endif
return '%s:h'
endfunction
function! ale#fixers#pycln#GetExecutable(buffer) abort
if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pycln_auto_pipenv'))
\ && ale#python#PipenvPresent(a:buffer)
return 'pipenv'
endif
if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pycln_auto_poetry'))
\ && ale#python#PoetryPresent(a:buffer)
return 'poetry'
endif
return ale#python#FindExecutable(a:buffer, 'python_pycln', ['pycln'])
endfunction
function! ale#fixers#pycln#GetCommand(buffer) abort
let l:executable = ale#fixers#pycln#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run pycln'
\ : ''
return ale#Escape(l:executable) . l:exec_args
endfunction
function! ale#fixers#pycln#FixForVersion(buffer, version) abort
let l:executable = ale#fixers#pycln#GetExecutable(a:buffer)
let l:cmd = [ale#Escape(l:executable)]
if l:executable =~? 'pipenv\|poetry$'
call extend(l:cmd, ['run', 'pycln'])
endif
let l:options = ale#Var(a:buffer, 'python_pycln_options')
if !empty(l:options)
call add(l:cmd, l:options)
endif
let l:config_file = ale#Var(a:buffer, 'python_pycln_config_file')
let l:config_file = l:options !~# '\v(^| )--config ' && !empty(l:config_file)
\ ? ale#Escape(ale#path#Simplify(l:config_file))
\ : ''
if !empty(l:config_file)
call add(l:cmd, '--config ' . l:config_file)
endif
call add(l:cmd, '--silence')
" NOTE: pycln version `1.3.0` support reading from stdin
call add(l:cmd, ale#semver#GTE(a:version, [1, 3, 0]) ? '-' : '%s')
return {
\ 'cwd': ale#fixers#pycln#GetCwd(a:buffer),
\ 'command': join(l:cmd, ' '),
\}
endfunction
function! ale#fixers#pycln#Fix(buffer) abort
let l:executable = ale#fixers#pycln#GetExecutable(a:buffer)
let l:command = ale#fixers#pycln#GetCommand(a:buffer) . ale#Pad('--version')
return ale#semver#RunWithVersionCheck(
\ a:buffer,
\ l:executable,
\ l:command,
\ function('ale#fixers#pycln#FixForVersion'),
\)
endfunction

View file

@ -1,6 +1,13 @@
" Author: Yining <zhang.yining@gmail.com> " Author: Yining <zhang.yining@gmail.com>
" Description: ruff as ALE fixer for python files " Description: ruff as ALE fixer for python files
call ale#Set('python_ruff_executable', 'ruff')
call ale#Set('python_ruff_options', '')
call ale#Set('python_ruff_use_global', get(g:, 'ale_use_global_executables', 0))
call ale#Set('python_ruff_change_directory', 1)
call ale#Set('python_ruff_auto_pipenv', 0)
call ale#Set('python_ruff_auto_poetry', 0)
function! ale#fixers#ruff#GetCwd(buffer) abort function! ale#fixers#ruff#GetCwd(buffer) abort
if ale#Var(a:buffer, 'python_ruff_change_directory') if ale#Var(a:buffer, 'python_ruff_change_directory')
" Run from project root if found, else from buffer dir. " Run from project root if found, else from buffer dir.
@ -9,7 +16,7 @@ function! ale#fixers#ruff#GetCwd(buffer) abort
return !empty(l:project_root) ? l:project_root : '%s:h' return !empty(l:project_root) ? l:project_root : '%s:h'
endif endif
return '' return '%s:h'
endfunction endfunction
function! ale#fixers#ruff#GetExecutable(buffer) abort function! ale#fixers#ruff#GetExecutable(buffer) abort
@ -26,29 +33,57 @@ function! ale#fixers#ruff#GetExecutable(buffer) abort
return ale#python#FindExecutable(a:buffer, 'python_ruff', ['ruff']) return ale#python#FindExecutable(a:buffer, 'python_ruff', ['ruff'])
endfunction endfunction
function! ale#fixers#ruff#GetCommand(buffer, version) abort function! ale#fixers#ruff#GetCommand(buffer) abort
let l:executable = ale_linters#python#ruff#GetExecutable(a:buffer) let l:executable = ale#fixers#ruff#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$' let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run ruff' \ ? ' run ruff'
\ : '' \ : ''
" NOTE: ruff version `0.0.72` implement `--fix` with stdin
return ale#Escape(l:executable) . l:exec_args return ale#Escape(l:executable) . l:exec_args
\ . ale#Pad(ale#Var(a:buffer, 'python_ruff_options')) endfunction
\ . ' --fix'
\ . (ale#semver#GTE(a:version, [0, 0, 72]) ? ' -' : ' %s') function! ale#fixers#ruff#FixForVersion(buffer, version) abort
let l:executable = ale#fixers#ruff#GetExecutable(a:buffer)
let l:cmd = [ale#Escape(l:executable)]
if l:executable =~? 'pipenv\|poetry$'
call extend(l:cmd, ['run', 'ruff'])
endif
let l:options = ale#Var(a:buffer, 'python_ruff_options')
if !empty(l:options)
call add(l:cmd, l:options)
endif
" when --stdin-filename present, ruff will use it for proj root resolution
" https://github.com/charliermarsh/ruff/pull/1281
let l:fname = expand('#' . a:buffer . '...')
call add(l:cmd, '--stdin-filename '.ale#Escape(ale#path#Simplify(l:fname)))
call add(l:cmd, '--fix')
" NOTE: ruff version `0.0.72` implements `--fix` with stdin
if ale#semver#GTE(a:version, [0, 0, 72])
call add(l:cmd, '-')
else
call add(l:cmd, '%s')
endif
return {
\ 'cwd': ale#fixers#ruff#GetCwd(a:buffer),
\ 'command': join(l:cmd, ' '),
\}
endfunction endfunction
function! ale#fixers#ruff#Fix(buffer) abort function! ale#fixers#ruff#Fix(buffer) abort
let l:fix_cmd = {buffer -> ale#semver#RunWithVersionCheck( let l:executable = ale#fixers#ruff#GetExecutable(a:buffer)
\ buffer, let l:command = ale#fixers#ruff#GetCommand(a:buffer) . ale#Pad('--version')
\ ale#fixers#ruff#GetExecutable(buffer),
\ '%e --version',
\ function('ale#fixers#ruff#GetCommand'),
\ )}(a:buffer)
return { return ale#semver#RunWithVersionCheck(
\ 'cwd': ale#fixers#ruff#GetCwd(a:buffer), \ a:buffer,
\ 'command': l:fix_cmd, \ l:executable,
\} \ l:command,
\ function('ale#fixers#ruff#FixForVersion'),
\)
endfunction endfunction

View file

@ -0,0 +1,17 @@
scriptencoding utf-8
" Author: Guillermo Roig <groig@protonmail.com>
" Description: Sort TailwindCSS classes with rustywind
call ale#Set('html_rustywind_executable', 'rustywind')
call ale#Set('html_rustywind_options', '')
function! ale#fixers#rustywind#Fix(buffer) abort
let l:executable = ale#Var(a:buffer, 'html_rustywind_executable')
let l:options = ale#Var(a:buffer, 'html_rustywind_options')
return {
\ 'command': ale#Escape(l:executable)
\ . (empty(l:options) ? '' : ' ' . l:options)
\ . ' --stdin'
\}
endfunction

View file

@ -52,9 +52,9 @@ function! s:NvimShow(lines, options) abort
autocmd! autocmd!
if g:ale_close_preview_on_insert if g:ale_close_preview_on_insert
autocmd CursorMoved,TabLeave,WinLeave,InsertEnter <buffer> ++once call s:NvimClose() autocmd CursorMoved,TabLeave,WinLeave,BufWinLeave,WinScrolled,InsertEnter <buffer> ++once call s:NvimClose()
else else
autocmd CursorMoved,TabLeave,WinLeave <buffer> ++once call s:NvimClose() autocmd CursorMoved,TabLeave,WinLeave,BufWinLeave,WinScrolled <buffer> ++once call s:NvimClose()
endif endif
augroup END augroup END
@ -99,48 +99,30 @@ function! s:NvimPrepareWindowContent(lines) abort
let l:width = max(map(copy(a:lines), 'strdisplaywidth(v:val)')) let l:width = max(map(copy(a:lines), 'strdisplaywidth(v:val)'))
let l:height = min([len(a:lines), l:max_height]) let l:height = min([len(a:lines), l:max_height])
if empty(g:ale_floating_window_border) return [a:lines[0:l:height-1], l:width, l:height]
return [a:lines, l:width, l:height]
endif
" Add the size of borders
let l:width += 2
let l:height += 2
let l:left = get(g:ale_floating_window_border, 0, '|')
let l:top = get(g:ale_floating_window_border, 1, '-')
let l:top_left = get(g:ale_floating_window_border, 2, '+')
let l:top_right = get(g:ale_floating_window_border, 3, '+')
let l:bottom_right = get(g:ale_floating_window_border, 4, '+')
let l:bottom_left = get(g:ale_floating_window_border, 5, '+')
let l:right = get(g:ale_floating_window_border, 6, l:left)
let l:bottom = get(g:ale_floating_window_border, 7, l:top)
let l:lines = [l:top_left . repeat(l:top, l:width - 2) . l:top_right]
for l:line in a:lines
let l:line_width = strchars(l:line)
let l:lines = add(l:lines, l:left . l:line . repeat(' ', l:width - l:line_width - 2). l:right)
endfor
" Truncate the lines
if len(l:lines) > l:max_height + 1
let l:lines = l:lines[0:l:max_height]
endif
let l:lines = add(l:lines, l:bottom_left . repeat(l:bottom, l:width - 2) . l:bottom_right)
return [l:lines, l:width, l:height]
endfunction endfunction
function! s:NvimCreate(options) abort function! s:NvimCreate(options) abort
let l:left = get(g:ale_floating_window_border, 0, '|')
let l:top = get(g:ale_floating_window_border, 1, '-')
let l:popup_opts = extend({ let l:popup_opts = extend({
\ 'relative': 'cursor', \ 'relative': 'cursor',
\ 'row': 1, \ 'row': 1,
\ 'col': 0, \ 'col': 0,
\ 'width': 42, \ 'width': 42,
\ 'height': 4, \ 'height': 4,
\ 'style': 'minimal' \ 'style': 'minimal',
\ 'border': empty(g:ale_floating_window_border) ? 'none' : [
\ get(g:ale_floating_window_border, 2, '+'),
\ l:top,
\ get(g:ale_floating_window_border, 3, '+'),
\ get(g:ale_floating_window_border, 6, l:left),
\ get(g:ale_floating_window_border, 4, '+'),
\ get(g:ale_floating_window_border, 7, l:top),
\ get(g:ale_floating_window_border, 5, '+'),
\ l:left,
\ ],
\ }, s:GetPopupOpts()) \ }, s:GetPopupOpts())
let l:buffer = nvim_create_buf(v:false, v:false) let l:buffer = nvim_create_buf(v:false, v:false)

View file

@ -0,0 +1,33 @@
function! ale#handlers#deadnix#Handle(buffer, lines) abort
let l:output = []
for l:line in a:lines
try
let l:file = ale#util#FuzzyJSONDecode(l:line, v:null)
catch
continue
endtry
if type(l:file) isnot v:t_dict
continue
endif
for l:error in l:file['results']
try
let l:ale_error = {
\ 'lnum': l:error['line'],
\ 'col': l:error['column'],
\ 'end_col': l:error['endColumn'],
\ 'text': l:error['message'],
\ 'type': 'W',
\}
catch
continue
endtry
call add(l:output, l:ale_error)
endfor
endfor
return l:output
endfunction

View file

@ -22,26 +22,6 @@ if !hlexists('ALEInfo')
highlight link ALEInfo ALEWarning highlight link ALEInfo ALEWarning
endif endif
if !hlexists('ALEVirtualTextError')
highlight link ALEVirtualTextError ALEError
endif
if !hlexists('ALEVirtualTextStyleError')
highlight link ALEVirtualTextStyleError ALEVirtualTextError
endif
if !hlexists('ALEVirtualTextWarning')
highlight link ALEVirtualTextWarning ALEWarning
endif
if !hlexists('ALEVirtualTextStyleWarning')
highlight link ALEVirtualTextStyleWarning ALEVirtualTextWarning
endif
if !hlexists('ALEVirtualTextInfo')
highlight link ALEVirtualTextInfo ALEVirtualTextWarning
endif
" The maximum number of items for the second argument of matchaddpos() " The maximum number of items for the second argument of matchaddpos()
let s:MAX_POS_VALUES = 8 let s:MAX_POS_VALUES = 8
let s:MAX_COL_SIZE = 1073741824 " pow(2, 30) let s:MAX_COL_SIZE = 1073741824 " pow(2, 30)

View file

@ -51,7 +51,7 @@ let s:default_ale_linters = {
\ 'jsonc': [], \ 'jsonc': [],
\ 'perl': ['perlcritic'], \ 'perl': ['perlcritic'],
\ 'perl6': [], \ 'perl6': [],
\ 'python': ['flake8', 'mypy', 'pylint', 'pyright'], \ 'python': ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'],
\ 'rust': ['cargo', 'rls'], \ 'rust': ['cargo', 'rls'],
\ 'spec': [], \ 'spec': [],
\ 'text': [], \ 'text': [],

View file

@ -52,28 +52,24 @@ function! ale#lsp#message#Exit() abort
endfunction endfunction
function! ale#lsp#message#DidOpen(buffer, language_id) abort function! ale#lsp#message#DidOpen(buffer, language_id) abort
let l:lines = getbufline(a:buffer, 1, '$')
return [1, 'textDocument/didOpen', { return [1, 'textDocument/didOpen', {
\ 'textDocument': { \ 'textDocument': {
\ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')),
\ 'languageId': a:language_id, \ 'languageId': a:language_id,
\ 'version': ale#lsp#message#GetNextVersionID(), \ 'version': ale#lsp#message#GetNextVersionID(),
\ 'text': join(l:lines, "\n") . "\n", \ 'text': ale#util#GetBufferContents(a:buffer),
\ }, \ },
\}] \}]
endfunction endfunction
function! ale#lsp#message#DidChange(buffer) abort function! ale#lsp#message#DidChange(buffer) abort
let l:lines = getbufline(a:buffer, 1, '$')
" For changes, we simply send the full text of the document to the server. " For changes, we simply send the full text of the document to the server.
return [1, 'textDocument/didChange', { return [1, 'textDocument/didChange', {
\ 'textDocument': { \ 'textDocument': {
\ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')),
\ 'version': ale#lsp#message#GetNextVersionID(), \ 'version': ale#lsp#message#GetNextVersionID(),
\ }, \ },
\ 'contentChanges': [{'text': join(l:lines, "\n") . "\n"}] \ 'contentChanges': [{'text': ale#util#GetBufferContents(a:buffer)}]
\}] \}]
endfunction endfunction

View file

@ -0,0 +1,28 @@
" Author: w0rp <dev@w0rp.com>
" Description: Functions for integrating with Lua linters.
" Find project root for a Lua language server.
function! ale#lua#FindProjectRoot(buffer) abort
let l:possible_project_roots = [
\ '.git',
\ bufname(a:buffer),
\]
for l:possible_root in l:possible_project_roots
let l:project_root = ale#path#FindNearestFile(a:buffer, l:possible_root)
if empty(l:project_root)
let l:project_root = ale#path#FindNearestDirectory(a:buffer, l:possible_root)
endif
if !empty(l:project_root)
" dir:p expands to /full/path/to/dir/ whereas
" file:p expands to /full/path/to/file (no trailing slash)
" Appending '/' ensures that :h:h removes the path's last segment
" regardless of whether it is a directory or not.
return fnamemodify(l:project_root . '/', ':p:h:h')
endif
endfor
return ''
endfunction

View file

@ -1,4 +1,4 @@
" Author: w0rp <devw0rp@gmail.com> " Author: w0rp <dev@w0rp.com>
" Description: Functions for integrating with Python linters. " Description: Functions for integrating with Python linters.
call ale#Set('python_auto_pipenv', '0') call ale#Set('python_auto_pipenv', '0')
@ -96,6 +96,27 @@ function! ale#python#FindVirtualenv(buffer) abort
return $VIRTUAL_ENV return $VIRTUAL_ENV
endfunction endfunction
" Automatically determine virtualenv environment variables and build
" a string of them to prefix linter commands with.
function! ale#python#AutoVirtualenvEnvString(buffer) abort
let l:venv_dir = ale#python#FindVirtualenv(a:buffer)
if !empty(l:venv_dir)
let l:strs = [ ]
" expand PATH correctly inside of the appropriate shell.
if has('win32')
call add(l:strs, 'set PATH=' . ale#Escape(l:venv_dir) . ';%PATH% && ')
else
call add(l:strs, 'PATH=' . ale#Escape(l:venv_dir) . '":$PATH" ')
endif
return join(l:strs, '')
endif
return ''
endfunction
" Given a buffer number and a command name, find the path to the executable. " Given a buffer number and a command name, find the path to the executable.
" First search on a virtualenv for Python, if nothing is found, try the global " First search on a virtualenv for Python, if nothing is found, try the global
" command. Returns an empty string if cannot find the executable " command. Returns an empty string if cannot find the executable

View file

@ -14,7 +14,7 @@ function! s:DisablePostamble() abort
call ale#highlight#UpdateHighlights() call ale#highlight#UpdateHighlights()
endif endif
if g:ale_virtualtext_cursor == 1 if g:ale_virtualtext_cursor isnot# 'disabled' && g:ale_virtualtext_cursor != 0
call ale#virtualtext#Clear(bufnr('')) call ale#virtualtext#Clear(bufnr(''))
endif endif
endfunction endfunction

View file

@ -542,7 +542,7 @@ function! ale#util#SetBufferContents(buffer, lines) abort
endfunction endfunction
function! ale#util#GetBufferContents(buffer) abort function! ale#util#GetBufferContents(buffer) abort
return join(getbufline(a:buffer, 1, '$'), '\n') . '\n' return join(getbufline(a:buffer, 1, '$'), "\n") . "\n"
endfunction endfunction
function! ale#util#ToURI(resource) abort function! ale#util#ToURI(resource) abort

View file

@ -3,88 +3,58 @@ scriptencoding utf-8
" Author: Luan Santos <cfcluan@gmail.com> " Author: Luan Santos <cfcluan@gmail.com>
" Description: Shows lint message for the current line as virtualtext, if any " Description: Shows lint message for the current line as virtualtext, if any
" Controls the milliseconds delay before showing a message. if !hlexists('ALEVirtualTextError')
let g:ale_virtualtext_delay = get(g:, 'ale_virtualtext_delay', 10) highlight link ALEVirtualTextError Comment
let s:cursor_timer = -1
let s:last_pos = [0, 0, 0]
let s:has_virt_text = 0
let s:emulate_virt = 0
if has('nvim-0.3.2')
let s:ns_id = nvim_create_namespace('ale')
let s:has_virt_text = 1
elseif has('textprop') && has('popupwin')
let s:has_virt_text = 1
let s:emulate_virt = !has('patch-9.0.0297')
let s:hl_list = []
if s:emulate_virt
call prop_type_add('ale', {})
let s:last_virt = -1
endif
endif endif
function! ale#virtualtext#Clear(buf) abort if !hlexists('ALEVirtualTextStyleError')
if !s:has_virt_text highlight link ALEVirtualTextStyleError ALEVirtualTextError
return endif
endif
if has('nvim') if !hlexists('ALEVirtualTextWarning')
call nvim_buf_clear_namespace(a:buf, s:ns_id, 0, -1) highlight link ALEVirtualTextWarning Comment
else endif
if s:emulate_virt && s:last_virt != -1
call prop_remove({'type': 'ale'}) if !hlexists('ALEVirtualTextStyleWarning')
call popup_close(s:last_virt) highlight link ALEVirtualTextStyleWarning ALEVirtualTextWarning
let s:last_virt = -1 endif
elseif !empty(s:hl_list)
call prop_remove({ if !hlexists('ALEVirtualTextInfo')
\ 'types': s:hl_list, highlight link ALEVirtualTextInfo ALEVirtualTextWarning
\ 'all': 1, endif
\ 'bufnr': a:buf})
let g:ale_virtualtext_prefix =
\ get(g:, 'ale_virtualtext_prefix', '%comment% %type%: ')
" Controls the milliseconds delay before showing a message.
let g:ale_virtualtext_delay = get(g:, 'ale_virtualtext_delay', 10)
" Controls the positioning of virtualtext
let g:ale_virtualtext_column = get(g:, 'ale_virtualtext_column', 0)
let g:ale_virtualtext_maxcolumn = get(g:, 'ale_virtualtext_maxcolumn', 0)
let g:ale_virtualtext_single = get(g:,'ale_virtualtext_single',0)
let s:cursor_timer = get(s:, 'cursor_timer', -1)
let s:last_pos = get(s:, 'last_pos', [0, 0, 0])
let s:hl_list = get(s:, 'hl_list', [])
let s:last_message = ''
if !has_key(s:, 'has_virt_text')
let s:has_virt_text = 0
let s:emulate_virt = 0
let s:last_virt = -1
if has('nvim-0.3.2')
let s:ns_id = nvim_create_namespace('ale')
let s:has_virt_text = 1
elseif has('textprop') && has('popupwin')
let s:has_virt_text = 1
let s:emulate_virt = !has('patch-9.0.0297')
if s:emulate_virt
call prop_type_add('ale', {})
endif endif
endif endif
endfunction endif
function! ale#virtualtext#ShowMessage(message, hl_group, buf, line) abort
if !s:has_virt_text || !bufexists(str2nr(a:buf))
return
endif
let l:prefix = get(g:, 'ale_virtualtext_prefix', '> ')
let l:msg = l:prefix.trim(substitute(a:message, '\n', ' ', 'g'))
if has('nvim')
call nvim_buf_set_virtual_text(a:buf, s:ns_id, a:line-1, [[l:msg, a:hl_group]], {})
elseif s:emulate_virt
let l:left_pad = col('$')
call prop_add(a:line, l:left_pad, {
\ 'type': 'ale',
\})
let s:last_virt = popup_create(l:msg, {
\ 'line': -1,
\ 'padding': [0, 0, 0, 1],
\ 'mask': [[1, 1, 1, 1]],
\ 'textprop': 'ale',
\ 'highlight': a:hl_group,
\ 'fixed': 1,
\ 'wrap': 0,
\ 'zindex': 2
\})
else
let type = prop_type_get(a:hl_group)
if type == {}
call add(s:hl_list, a:hl_group)
call prop_type_add(a:hl_group, {'highlight': a:hl_group})
endif
call prop_add(a:line, 0, {
\ 'type': a:hl_group,
\ 'text': ' ' . l:msg,
\ 'bufnr': a:buf
\})
endif
endfunction
function! s:StopCursorTimer() abort function! s:StopCursorTimer() abort
if s:cursor_timer != -1 if s:cursor_timer != -1
@ -93,65 +63,199 @@ function! s:StopCursorTimer() abort
endif endif
endfunction endfunction
function! ale#virtualtext#GetHlGroup(type, style) abort function! ale#virtualtext#ResetDataForTests() abort
if a:type is# 'E' let s:last_pos = [0, 0, 0]
if a:style is# 'style' let s:last_message = ''
return 'ALEVirtualTextStyleError' endfunction
else
return 'ALEVirtualTextError' function! ale#virtualtext#GetLastMessageForTests() abort
endif return s:last_message
elseif a:type is# 'W' endfunction
if a:style is# 'style'
return 'ALEVirtualTextStyleWarning' function! ale#virtualtext#GetComment(buffer) abort
else let l:filetype = getbufvar(a:buffer, '&filetype')
return 'ALEVirtualTextWarning' let l:split = split(getbufvar(a:buffer, '&commentstring'), '%s')
endif
return !empty(l:split) ? trim(l:split[0]) : '#'
endfunction
function! ale#virtualtext#Clear(buffer) abort
if !s:has_virt_text || !bufexists(str2nr(a:buffer))
return
endif
if has('nvim')
call nvim_buf_clear_namespace(a:buffer, s:ns_id, 0, -1)
else else
return 'ALEVirtualTextInfo' if s:emulate_virt && s:last_virt != -1
call prop_remove({'type': 'ale'})
call popup_close(s:last_virt)
let s:last_virt = -1
elseif !empty(s:hl_list)
call prop_remove({
\ 'types': s:hl_list,
\ 'all': 1,
\ 'bufnr': a:buffer,
\})
endif
endif
endfunction
function! ale#virtualtext#GetGroup(item) abort
let l:type = get(a:item, 'type', 'E')
let l:sub_type = get(a:item, 'sub_type', '')
if l:type is# 'E'
if l:sub_type is# 'style'
return 'ALEVirtualTextStyleError'
endif
return 'ALEVirtualTextError'
endif
if l:type is# 'W'
if l:sub_type is# 'style'
return 'ALEVirtualTextStyleWarning'
endif
return 'ALEVirtualTextWarning'
endif
return 'ALEVirtualTextInfo'
endfunction
function! ale#virtualtext#GetColumnPadding(buffer, line) abort
let l:mincol = ale#Var(a:buffer, 'virtualtext_column')
let l:maxcol = ale#Var(a:buffer, 'virtualtext_maxcolumn')
let l:win = bufwinnr(a:buffer)
if l:mincol[len(l:mincol)-1] is# '%'
let l:mincol = (winwidth(l:win) * l:mincol) / 100
endif
if l:maxcol[len(l:maxcol)-1] is# '%'
let l:maxcol = (winwidth(l:win) * l:maxcol) / 100
endif
" Calculate padding for virtualtext alignment
if l:mincol > 0 || l:maxcol > 0
let l:line_width = strdisplaywidth(getline(a:line))
if l:line_width < l:mincol
return l:mincol - l:line_width
elseif l:maxcol > 0 && l:line_width >= l:maxcol
" Stop processing if virtualtext would start beyond maxcol
return -1
endif
endif
" no padding.
return 0
endfunction
function! ale#virtualtext#ShowMessage(buffer, item) abort
if !s:has_virt_text || !bufexists(str2nr(a:buffer))
return
endif
let l:line = max([1, a:item.lnum])
let l:hl_group = ale#virtualtext#GetGroup(a:item)
" Get a language-appropriate comment character, or default to '#'.
let l:comment = ale#virtualtext#GetComment(a:buffer)
let l:prefix = ale#Var(a:buffer, 'virtualtext_prefix')
let l:prefix = ale#GetLocItemMessage(a:item, l:prefix)
let l:prefix = substitute(l:prefix, '\V%comment%', '\=l:comment', 'g')
let l:msg = l:prefix . substitute(a:item.text, '\n', ' ', 'g')
let l:col_pad = ale#virtualtext#GetColumnPadding(a:buffer, l:line)
" Store the last message we're going to set so we can read it in tests.
let s:last_message = l:msg
" Discard virtualtext if padding is negative.
if l:col_pad < 0
return
endif
if has('nvim')
call nvim_buf_set_virtual_text(
\ a:buffer,
\ s:ns_id, l:line - 1,
\ [[l:msg, l:hl_group]],
\ {}
\)
elseif s:emulate_virt
let l:left_pad = col('$')
call prop_add(l:line, l:left_pad, {'type': 'ale'})
let s:last_virt = popup_create(l:msg, {
\ 'line': -1,
\ 'padding': [0, 0, 0, 1],
\ 'mask': [[1, 1, 1, 1]],
\ 'textprop': 'ale',
\ 'highlight': l:hl_group,
\ 'fixed': 1,
\ 'wrap': 0,
\ 'zindex': 2
\})
else
let l:type = prop_type_get(l:hl_group)
if l:type == {}
call prop_type_add(l:hl_group, {'highlight': l:hl_group})
endif
" Add highlight groups to the list so we can clear them later.
if index(s:hl_list, l:hl_group) == -1
call add(s:hl_list, l:hl_group)
endif
" We ignore all errors from prop_add.
silent! call prop_add(l:line, 0, {
\ 'type': l:hl_group,
\ 'text': ' ' . l:msg,
\ 'bufnr': a:buffer,
\ 'text_padding_left': l:col_pad,
\})
endif endif
endfunction endfunction
function! ale#virtualtext#ShowCursorWarning(...) abort function! ale#virtualtext#ShowCursorWarning(...) abort
if g:ale_virtualtext_cursor != 1 if g:ale_virtualtext_cursor isnot# 'current'
\&& g:ale_virtualtext_cursor != 1
return return
endif endif
let l:buffer = bufnr('') let l:buffer = bufnr('')
if mode(1) isnot# 'n' if mode(1) isnot# 'n'
\|| g:ale_use_neovim_diagnostics_api
\|| ale#ShouldDoNothing(l:buffer)
return return
endif endif
if ale#ShouldDoNothing(l:buffer) let [l:info, l:item] = ale#util#FindItemAtCursor(l:buffer)
return
endif
let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer)
call ale#virtualtext#Clear(l:buffer) call ale#virtualtext#Clear(l:buffer)
if !empty(l:loc) if !empty(l:item)
let l:msg = l:loc.text call ale#virtualtext#ShowMessage(l:buffer, l:item)
let l:type = get(l:loc, 'type', 'E')
let l:style = get(l:loc, 'sub_type', '')
let l:hl_group = ale#virtualtext#GetHlGroup(l:type, l:style)
call ale#virtualtext#ShowMessage(l:msg, l:hl_group, l:buffer, line('.'))
endif endif
endfunction endfunction
function! ale#virtualtext#ShowCursorWarningWithDelay() abort function! ale#virtualtext#ShowCursorWarningWithDelay() abort
let l:buffer = bufnr('') let l:buffer = bufnr('')
if g:ale_virtualtext_cursor != 1 if g:ale_virtualtext_cursor isnot# 'current'
return \&& g:ale_virtualtext_cursor != 1
endif
if mode(1) isnot# 'n'
return return
endif endif
call s:StopCursorTimer() call s:StopCursorTimer()
if mode(1) isnot# 'n'
\|| g:ale_use_neovim_diagnostics_api
return
endif
let l:pos = getpos('.')[0:2] let l:pos = getpos('.')[0:2]
" Check the current buffer, line, and column number against the last " Check the current buffer, line, and column number against the last
@ -169,19 +273,24 @@ function! ale#virtualtext#ShowCursorWarningWithDelay() abort
endif endif
endfunction endfunction
function! ale#virtualtext#SetTexts(buf, loclist) abort function! ale#virtualtext#SetTexts(buffer, loclist) abort
if !has('nvim') && s:emulate_virt if !has('nvim') && s:emulate_virt
return return
endif endif
call ale#virtualtext#Clear(a:buf) call ale#virtualtext#Clear(a:buffer)
for l in a:loclist let l:filter = ale#Var(a:buffer,'virtualtext_single')
if l['bufnr'] != a:buf let l:seen = {}
continue
for l:item in a:loclist
if l:item.bufnr == a:buffer
let l:line = max([1, l:item.lnum])
if !has_key(l:seen,l:line) || l:filter == 0
call ale#virtualtext#ShowMessage(a:buffer, l:item)
let l:seen[l:line] = 1
endif
endif endif
let hl = ale#virtualtext#GetHlGroup(l['type'], get(l, 'sub_type', ''))
call ale#virtualtext#ShowMessage(l['text'], hl, a:buf, l['lnum'])
endfor endfor
endfunction endfunction

View file

@ -21,5 +21,24 @@ g:ale_asm_gcc_options *g:ale_asm_gcc_options*
This variable can be set to pass additional options to gcc. This variable can be set to pass additional options to gcc.
===============================================================================
llvm_mc *ale-asm-llvm_mc*
g:ale_asm_clang_executable *g:ale_asm_llvm_mc_executable*
*b:ale_asm_llvm_mc_executable*
Type: |String|
Default: `'llvm-mc'`
This variable can be changed to use a different executable for llvm-mc.
g:ale_asm_clang_options *g:ale_asm_llvm_mc_options*
*b:ale_asm_llvm_mc_options*
Type: |String|
Default: `''`
This variable can be set to pass additional options to llvm-mc.
=============================================================================== ===============================================================================
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

@ -168,7 +168,7 @@ g:ale_c_cc_header_exts *g:ale_c_cc_header_exts*
considered as header files. considered as header files.
This variable is only used when `'-x c-header'` is used instead of `'-x c'`, This variable is only used when `'-x c-header'` is used instead of `'-x c'`,
see |ale_c_cc_use_header_lang_flag|. see |g:ale_c_cc_use_header_lang_flag|.
=============================================================================== ===============================================================================

View file

@ -97,7 +97,7 @@ g:ale_cpp_cc_header_exts *g:ale_cpp_cc_header_exts*
considered as header files. considered as header files.
This variable is only used when `'-x c++-header'` is used instead of `'-x c++'`, This variable is only used when `'-x c++-header'` is used instead of `'-x c++'`,
see |ale_cpp_cc_use_header_lang_flag|. see |g:ale_cpp_cc_use_header_lang_flag|.
=============================================================================== ===============================================================================

View file

@ -15,6 +15,7 @@ CONTENTS *ale-development-contents*
4.2. Writing Fixer Tests..............|ale-development-fixer-tests| 4.2. Writing Fixer Tests..............|ale-development-fixer-tests|
4.3. Running Tests in a Windows VM....|ale-development-windows-tests| 4.3. Running Tests in a Windows VM....|ale-development-windows-tests|
5. Contributing.........................|ale-development-contributing| 5. Contributing.........................|ale-development-contributing|
5.1. Preparing a Release..............|ale-development-release|
=============================================================================== ===============================================================================
1. Introduction *ale-development-introduction* 1. Introduction *ale-development-introduction*
@ -154,7 +155,7 @@ ALE runs tests with the following versions of Vim in the following
environments. environments.
1. Vim 8.0.0027 on Linux via GitHub Actions. 1. Vim 8.0.0027 on Linux via GitHub Actions.
2. Vim 9.0.0133 on Linux via GitHub Actions. 2. Vim 9.0.0297 on Linux via GitHub Actions.
3. NeoVim 0.2.0 on Linux via GitHub Actions. 3. NeoVim 0.2.0 on Linux via GitHub Actions.
4. NeoVim 0.8.0 on Linux via GitHub Actions. 4. NeoVim 0.8.0 on Linux via GitHub Actions.
6. Vim 8 (stable builds) on Windows via AppVeyor. 6. Vim 8 (stable builds) on Windows via AppVeyor.
@ -325,7 +326,6 @@ given the above setup are as follows.
`AssertLSPProject project_root` - Check the root given to an LSP server. `AssertLSPProject project_root` - Check the root given to an LSP server.
`AssertLSPAddress address` - Check the address to an LSP server. `AssertLSPAddress address` - Check the address to an LSP server.
=============================================================================== ===============================================================================
4.2 Writing Fixer Tests *ale-development-fixer-tests* 4.2 Writing Fixer Tests *ale-development-fixer-tests*
@ -367,7 +367,6 @@ given the above setup are as follows.
`AssertFixer results` - Check the fixer results `AssertFixer results` - Check the fixer results
`AssertFixerNotExecuted` - Check that fixers will not be executed. `AssertFixerNotExecuted` - Check that fixers will not be executed.
=============================================================================== ===============================================================================
4.3 Running Tests in a Windows VM *ale-development-windows-tests* 4.3 Running Tests in a Windows VM *ale-development-windows-tests*
@ -462,5 +461,76 @@ and profile settings. See: https://docs.github.com/en/account-and-profile/
Unless configuring GitHub to expose contact details, commits will be rewritten Unless configuring GitHub to expose contact details, commits will be rewritten
to appear by `USERNAME <RANDOM_NUMBER+USERNAME@users.noreply.github.com>` . to appear by `USERNAME <RANDOM_NUMBER+USERNAME@users.noreply.github.com>` .
===============================================================================
5.1 Preparing a Release *ale-development-release*
ALE offers release packages through GitHub, for two reasons:
1. Some users like to target specific release versions rather than simply
installing the plugin from `master`. This includes users who create Linux
distribution specific packages from GitHub releases.
2. The releases provide a nice way to get an overview of what has changed in
ALE over time.
ALE has no fixed release schedule. Release versions are created whenever the
ALE developers feel the need to create one. ALE release versions follow the
typical Semantic Versioning scheme. See: https://semver.org/
Minor version releases for ALE should be the most common, followed by patch
releases. Every minor version release should be followed by a `vA.B.x` branch
such as `v2.0.x` for version `2.0.0` and every following patch version before
`2.1.0`. The `git` branch strategy for patches is to first merge a bug fix to
`master`, and then `git cherry-pick` a patch to a branch for a specific
version. ALE developers do not generally support anything but `master` or the
last minor version.
Generally ALE releases hit a major version only when there are breaking
changes to a public ALE setting or function. A "public" setting or function is
defined as any setting or function documented in the `:help` |ale| text file.
Major ALE versions ought to be so rare that they only come once a year at
most. ALE should not typically introduce any breaking changes.
If there are ever to be any breaking changes made for ALE, there should first
come a minor version release for ALE documenting all of the coming breaking
changes to ALE. It should be described how users can prepare for a breaking
change that is coming before it is done.
To create a release for ALE, you will need sufficient permissions in GitHub.
Once you do, follow these steps.
1. Create a new release draft, or edit an existing one. It helps to craft
drafts ahead of time and write the last commit ID checked for release notes
on the last update to a draft.
See the releases page: https://github.com/dense-analysis/ale/releases
2. Examine `git log` and read changes made between the last ID checked, or the
git tag of the previous release, and the current commit in `master`.
3. Write updates in separate sections (except where empty) for:
3.a. Breaking Changes
3.b. Deprecated Features
3.c. New Features
3.d. New Linters
3.e. New Fixers
3.f. Linter Enhancements
3.g. Fixer Enhancements
3.h. Bugs Fixed
4. Once you've finished writing the draft for the release, bump
`s:current_ale_version` in `autoload/ale.vim` to the current version, and
add a line to `test/test_ale_has.vader` to test for the version. See
|ale#Has()| documentation for more information.
5. Commit the changes after `./run-tests --fast -q` passes.
6. Tag the release with `git tag vA.B.C`, replacing `A`, `B`, and `C` with the
version numbers. See `git tag --list` for examples.
7. Run `git push` and `git push --tags` to push the commit and the tag.
8. Edit the release draft in GitHub, select the tag you just pushed, and
publish the draft.
9. If you're creating a new major or minor version: `git checkout -b vA.B.x`,
replacing `A` and `B` with the major and minor versions. `git push` the new
branch, and the GitHub branch protection settings should automatically
apply to the new release branch.
10. You have already completed the last step.
Have fun creating ALE releases. Drink responsibly, or not at all, which is the
preference of w0rp.
=============================================================================== ===============================================================================
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

@ -269,6 +269,21 @@ g:ale_go_gopls_options *g:ale_go_gopls_options*
Command-line options passed to the gopls executable. See `gopls -h`. Command-line options passed to the gopls executable. See `gopls -h`.
g:ale_go_gopls_fix_executable *g:ale_go_gopls_fix_executable*
*b:ale_go_gopls_fix_executable*
Type: |String|
Default: `'gopls'`
Executable to run to use as the gopls fixer.
g:ale_go_gopls_fix_options *g:ale_go_gopls_fix_options*
*b:ale_go_gopls_fix_options*
Type: |String|
Default: `''`
Options to pass to the gopls fixer.
g:ale_go_gopls_init_options *g:ale_go_gopls_init_options* g:ale_go_gopls_init_options *g:ale_go_gopls_init_options*
*b:ale_go_gopls_init_options* *b:ale_go_gopls_init_options*
Type: |Dictionary| Type: |Dictionary|

View file

@ -102,6 +102,25 @@ prettier *ale-html-prettier*
See |ale-javascript-prettier| for information about the available options. See |ale-javascript-prettier| for information about the available options.
===============================================================================
rustywind *ale-html-rustywind*
g:ale_html_rustywind_executable *g:ale_html_rustywind_executable*
*b:ale_html_rustywind_executable*
Type: |String|
Default: `'rustywind'`
See |ale-integrations-local-executables|
g:ale_html_rustywind_options *g:ale_html_rustywind_options*
*b:ale_html_rustywind_options*
Type: |String|
Default: `''`
This variable can be changed to modify flags given to rustywind.
=============================================================================== ===============================================================================
stylelint *ale-html-stylelint* stylelint *ale-html-stylelint*

View file

@ -27,6 +27,30 @@ g:ale_lua_lua_format_options *g:ale_lua_lua_format_options*
This variable can be set to pass additional options to lua-format. This variable can be set to pass additional options to lua-format.
===============================================================================
lua-language-server *ale-lua-lua-language-server*
*ale-lua-language-server*
g:ale_lua_language_server_executable *g:ale_lua_language_server_executable*
*b:ale_lua_language_server_executable*
Type: |String|
Default: `'lua-language-server'`
This variable can be changed to set the path to lua-language-server.
If you have compiled the language server yourself in `/some/path`, the path
will be `'/some/path/bin/lua-language-server'`.
g:ale_lua_lua_language_server_config *g:ale_lua_lua_language_server_config*
*b:ale_lua_lua_language_server_config*
Type: |Dictionary|
Default: `{}`
Dictionary containing configuration settings that will be passed to the
language server.
=============================================================================== ===============================================================================
luac *ale-lua-luac* luac *ale-lua-luac*

View file

@ -17,13 +17,13 @@ See |ale-dprint-options| and https://dprint.dev/plugins/markdown
=============================================================================== ===============================================================================
markdownlint *ale-markdown-markdownlint* markdownlint *ale-markdown-markdownlint*
g:ale_markdown_markdown_executable *g:ale_markdown_markdownlint_executable* g:ale_markdown_markdownlint_executable *g:ale_markdown_markdownlint_executable*
*b:ale_markdown_markdownlint_executable* *b:ale_markdown_markdownlint_executable*
Type: |String| Type: |String|
Default: `'markdownlint'` Default: `'markdownlint'`
Override the invoked markdownlint binary. You can use other binaries such as Override the invoked `markdownlint` binary. You can use other binaries such as
markdownlint-cli2. `markdownlint-cli2`.
g:ale_markdown_markdownlint_options *g:ale_markdown_markdownlint_options* g:ale_markdown_markdownlint_options *g:ale_markdown_markdownlint_options*

View file

@ -2,6 +2,24 @@
ALE Nix Integration *ale-nix-options* ALE Nix Integration *ale-nix-options*
===============================================================================
alejandra *ale-nix-alejandra*
g:ale_nix_alejandra_executable *g:ale_nix_alejandra_executable*
*b:ale_nix_alejandra_executable*
Type: |String|
Default: `'alejandra'`
This variable sets the executable used for alejandra.
g:ale_nix_alejandra_options *g:ale_nix_alejandra_options*
*b:ale_nix_alejandra_options*
Type: |String|
Default: `''`
This variable can be set to pass additional options to the alejandra fixer.
=============================================================================== ===============================================================================
nixfmt *ale-nix-nixfmt* nixfmt *ale-nix-nixfmt*
@ -75,5 +93,23 @@ g:ale_nix_statix_fix_options *g:ale_nix_statix_fix_options*
it as a fixer. it as a fixer.
===============================================================================
deadnix *ale-nix-deadnix*
g:ale_nix_deadnix_executable *g:ale_nix_deadnix_executable*
*b:ale_nix_deadnix_executable*
Type: |String|
Default: `'deadnix'`
This variable sets the executable used for deadnix.
g:ale_nix_deadnix_options *g:ale_nix_deadnix_options*
*b:ale_nix_deadnix_options*
Type: |String|
Default: `''`
This variable can be used to pass additional options to deadnix.
=============================================================================== ===============================================================================
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

@ -20,6 +20,17 @@ g:ale_python_auto_poetry *g:ale_python_auto_poetry*
if true. This is overridden by a manually-set executable. if true. This is overridden by a manually-set executable.
g:ale_python_auto_virtualenv *g:ale_python_auto_virtualenv*
*b:ale_python_auto_virtualenv*
Type: |Number|
Default: `0`
If set to `1`, ALE will automatically set environment variables for commands
such as `PATH` to attempt to make the experience of running Python linters
via virtualenv easier, without the need for another plugin or some
specialised setup.
=============================================================================== ===============================================================================
ALE Python Project Root Behavior *ale-python-root* ALE Python Project Root Behavior *ale-python-root*
@ -88,24 +99,24 @@ g:ale_python_autoflake_use_global *g:ale_python_autoflake_use_global*
=============================================================================== ===============================================================================
autoimport *ale-python-autoimport* autoimport *ale-python-autoimport*
g:ale_python_autoimport_executable *g:ale_python_autoimport_executable* g:ale_python_autoimport_executable *g:ale_python_autoimport_executable*
*b:ale_python_autoimport_executable* *b:ale_python_autoimport_executable*
Type: |String| Type: |String|
Default: `'autoimport'` Default: `'autoimport'`
See |ale-integrations-local-executables| See |ale-integrations-local-executables|
g:ale_python_autoimport_options *g:ale_python_autoimport_options* g:ale_python_autoimport_options *g:ale_python_autoimport_options*
*b:ale_python_autoimport_options* *b:ale_python_autoimport_options*
Type: |String| Type: |String|
Default: `''` Default: `''`
This variable can be set to pass extra options to autoimport. This variable can be set to pass extra options to autoimport.
g:ale_python_autoimport_use_global *g:ale_python_autoimport_use_global* g:ale_python_autoimport_use_global *g:ale_python_autoimport_use_global*
*b:ale_python_autoimport_use_global* *b:ale_python_autoimport_use_global*
Type: |Number| Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)` Default: `get(g:, 'ale_use_global_executables', 0)`
@ -338,7 +349,7 @@ g:ale_python_flake8_auto_poetry *g:ale_python_flake8_auto_poetry*
flakehell *ale-python-flakehell* flakehell *ale-python-flakehell*
g:ale_python_flakehell_change_directory*g:ale_python_flakehell_change_directory* g:ale_python_flakehell_change_directory*g:ale_python_flakehell_change_directory*
*b:ale_python_flakehell_change_directory* *b:ale_python_flakehell_change_directory*
Type: |String| Type: |String|
Default: `project` Default: `project`
@ -349,8 +360,8 @@ g:ale_python_flakehell_change_directory*g:ale_python_flakehell_change_directory*
Python is executed from yourself. Python is executed from yourself.
g:ale_python_flakehell_executable *g:ale_python_flakehell_executable* g:ale_python_flakehell_executable *g:ale_python_flakehell_executable*
*b:ale_python_flakehell_executable* *b:ale_python_flakehell_executable*
Type: |String| Type: |String|
Default: `'flakehell'` Default: `'flakehell'`
@ -360,8 +371,8 @@ g:ale_python_flakehell_executable *g:ale_python_flakehell_executable*
invoke `'python` `-m` `flakehell'`. invoke `'python` `-m` `flakehell'`.
g:ale_python_flakehell_options *g:ale_python_flakehell_options* g:ale_python_flakehell_options *g:ale_python_flakehell_options*
*b:ale_python_flakehell_options* *b:ale_python_flakehell_options*
Type: |String| Type: |String|
Default: `''` Default: `''`
@ -369,8 +380,8 @@ g:ale_python_flakehell_options *g:ale_python_flakehell_options*
lint invocation. lint invocation.
g:ale_python_flakehell_use_global *g:ale_python_flakehell_use_global* g:ale_python_flakehell_use_global *g:ale_python_flakehell_use_global*
*b:ale_python_flakehell_use_global* *b:ale_python_flakehell_use_global*
Type: |Number| Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)` Default: `get(g:, 'ale_use_global_executables', 0)`
@ -381,8 +392,8 @@ g:ale_python_flakehell_use_global *g:ale_python_flakehell_use_global*
Both variables can be set with `b:` buffer variables instead. Both variables can be set with `b:` buffer variables instead.
g:ale_python_flakehell_auto_pipenv *g:ale_python_flakehell_auto_pipenv* g:ale_python_flakehell_auto_pipenv *g:ale_python_flakehell_auto_pipenv*
*b:ale_python_flakehell_auto_pipenv* *b:ale_python_flakehell_auto_pipenv*
Type: |Number| Type: |Number|
Default: `0` Default: `0`
@ -580,6 +591,78 @@ g:ale_python_prospector_auto_poetry *g:ale_python_prospector_auto_poetry*
if true. This is overridden by a manually-set executable. if true. This is overridden by a manually-set executable.
===============================================================================
pycln *ale-python-pycln*
g:ale_python_pycln_change_directory *g:ale_python_pycln_change_directory*
*b:ale_python_pycln_change_directory*
Type: |Number|
Default: `1`
If set to `1`, `pycln` will be run from a detected project root, per
|ale-python-root|. if set to `0` or no project root detected,
`pycln` will be run from the buffer's directory.
g:ale_python_pycln_executable *g:ale_python_pycln_executable*
*b:ale_python_pycln_executable*
Type: |String|
Default: `'pycln'`
See |ale-integrations-local-executables|
Set this to `'pipenv'` to invoke `'pipenv` `run` `pycln'`.
Set this to `'poetry'` to invoke `'poetry` `run` `pycln'`.
g:ale_python_pycln_options *g:ale_python_pycln_options*
*b:ale_python_pycln_options*
Type: |String|
Default: `''`
This variable can be changed to add command-line arguments to the pycln
invocation.
For example, to select/enable and/or disable some error codes,
you may want to set >
let g:ale_python_pycln_options = '--expand-stars'
g:ale_python_pycln_config_file *g:ale_python_pycln_config_file*
*b:ale_python_pycln_config_file*
Type: |String|
Default: `''`
Use this variable to set the configuration file.
If `'--config' ` is found in the |g:ale_python_pycln_options|, then that
option value will override the value in this variable.
g:ale_python_pycln_use_global *g:ale_python_pycln_use_global*
*b:ale_python_pycln_use_global*
Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)`
See |ale-integrations-local-executables|
g:ale_python_pycln_auto_pipenv *g:ale_python_pycln_auto_pipenv*
*b:ale_python_pycln_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.
g:ale_python_pycln_auto_poetry *g:ale_python_pycln_auto_poetry*
*b:ale_python_pycln_auto_poetry*
Type: |Number|
Default: `0`
Detect whether the file is inside a poetry, and set the executable to `poetry`
if true. This is overridden by a manually-set executable.
=============================================================================== ===============================================================================
pycodestyle *ale-python-pycodestyle* pycodestyle *ale-python-pycodestyle*
@ -903,13 +986,13 @@ g:ale_python_pylint_use_msg_id *g:ale_python_pylint_use_msg_id*
=============================================================================== ===============================================================================
pylsp *ale-python-pylsp* pylsp *ale-python-pylsp*
`pylsp` will be run from a detected project root, per |ale-python-root|. `pylsp` will be run from a detected project root, per |ale-python-root|.
g:ale_python_pylsp_executable *g:ale_python_pylsp_executable* g:ale_python_pylsp_executable *g:ale_python_pylsp_executable*
*b:ale_python_pylsp_executable* *b:ale_python_pylsp_executable*
Type: |String| Type: |String|
Default: `'pylsp'` Default: `'pylsp'`
@ -919,16 +1002,16 @@ g:ale_python_pylsp_executable *g:ale_python_pylsp_executable
Set this to `'poetry'` to invoke `'poetry` `run` `pyls'`. Set this to `'poetry'` to invoke `'poetry` `run` `pyls'`.
g:ale_python_pylsp_use_global *g:ale_python_pylsp_use_global* g:ale_python_pylsp_use_global *g:ale_python_pylsp_use_global*
*b:ale_python_pylsp_use_global* *b:ale_python_pylsp_use_global*
Type: |Number| Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)` Default: `get(g:, 'ale_use_global_executables', 0)`
See |ale-integrations-local-executables| See |ale-integrations-local-executables|
g:ale_python_pylsp_auto_pipenv *g:ale_python_pylsp_auto_pipenv* g:ale_python_pylsp_auto_pipenv *g:ale_python_pylsp_auto_pipenv*
*b:ale_python_pylsp_auto_pipenv* *b:ale_python_pylsp_auto_pipenv*
Type: |Number| Type: |Number|
Default: `0` Default: `0`
@ -936,8 +1019,8 @@ g:ale_python_pylsp_auto_pipenv *g:ale_python_pylsp_auto_pipenv
if true. This is overridden by a manually-set executable. if true. This is overridden by a manually-set executable.
g:ale_python_pylsp_auto_poetry *g:ale_python_pylsp_auto_poetry* g:ale_python_pylsp_auto_poetry *g:ale_python_pylsp_auto_poetry*
*b:ale_python_pylsp_auto_poetry* *b:ale_python_pylsp_auto_poetry*
Type: |Number| Type: |Number|
Default: `0` Default: `0`
@ -945,8 +1028,8 @@ g:ale_python_pylsp_auto_poetry *g:ale_python_pylsp_auto_poetry
if true. This is overridden by a manually-set executable. if true. This is overridden by a manually-set executable.
g:ale_python_pylsp_config *g:ale_python_pylsp_config* g:ale_python_pylsp_config *g:ale_python_pylsp_config*
*b:ale_python_pylsp_config* *b:ale_python_pylsp_config*
Type: |Dictionary| Type: |Dictionary|
Default: `{}` Default: `{}`
@ -963,8 +1046,8 @@ g:ale_python_pylsp_config *g:ale_python_pylsp_config
\ } \ }
< <
g:ale_python_pylsp_options *g:ale_python_pylsp_options* g:ale_python_pylsp_options *g:ale_python_pylsp_options*
*b:ale_python_pylsp_options* *b:ale_python_pylsp_options*
Type: |String| Type: |String|
Default: `''` Default: `''`
@ -1085,6 +1168,67 @@ g:ale_python_pyright_config *g:ale_python_pyright_config*
\} \}
< <
===============================================================================
refurb *ale-python-refurb*
g:ale_python_refurb_change_directory *g:ale_python_refurb_change_directory*
*b:ale_python_refurb_change_directory*
Type: |Number|
Default: `1`
If set to `1`, `refurb` will be run from a detected project root, per
|ale-python-root|. if set to `0` or no project root detected,
`refurb` will be run from the buffer's directory.
g:ale_python_refurb_executable *g:ale_python_refurb_executable*
*b:ale_python_refurb_executable*
Type: |String|
Default: `'refurb'`
See |ale-integrations-local-executables|
Set this to `'pipenv'` to invoke `'pipenv` `run` `refurb'`.
Set this to `'poetry'` to invoke `'poetry` `run` `refurb'`.
g:ale_python_refurb_options *g:ale_python_refurb_options*
*b:ale_python_refurb_options*
Type: |String|
Default: `''`
This variable can be changed to add command-line arguments to the refurb
invocation.
For example, to select/enable and/or disable some error codes,
you may want to set >
let g:ale_python_refurb_options = '--ignore 100'
g:ale_python_refurb_use_global *g:ale_python_refurb_use_global*
*b:ale_python_refurb_use_global*
Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)`
See |ale-integrations-local-executables|
g:ale_python_refurb_auto_pipenv *g:ale_python_refurb_auto_pipenv*
*b:ale_python_refurb_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.
g:ale_python_refurb_auto_poetry *g:ale_python_refurb_auto_poetry*
*b:ale_python_refurb_auto_poetry*
Type: |Number|
Default: `0`
Detect whether the file is inside a poetry, and set the executable to `poetry`
if true. This is overridden by a manually-set executable.
=============================================================================== ===============================================================================
reorder-python-imports *ale-python-reorder_python_imports* reorder-python-imports *ale-python-reorder_python_imports*
@ -1202,8 +1346,8 @@ g:ale_python_unimport_auto_poetry *g:ale_python_unimport_auto_poetry*
if true. This is overridden by a manually-set executable. if true. This is overridden by a manually-set executable.
g:ale_python_unimport_executable *g:ale_python_unimport_executable* g:ale_python_unimport_executable *g:ale_python_unimport_executable*
*b:ale_python_unimport_executable* *b:ale_python_unimport_executable*
Type: |String| Type: |String|
Default: `'unimport'` Default: `'unimport'`
@ -1213,8 +1357,8 @@ g:ale_python_unimport_executable *g:ale_python_unimport_executable*
Set this to `'poetry'` to invoke `'poetry` `run` `unimport'`. Set this to `'poetry'` to invoke `'poetry` `run` `unimport'`.
g:ale_python_unimport_options *g:ale_python_unimport_options* g:ale_python_unimport_options *g:ale_python_unimport_options*
*b:ale_python_unimport_options* *b:ale_python_unimport_options*
Type: |String| Type: |String|
Default: `''` Default: `''`
@ -1222,8 +1366,8 @@ g:ale_python_unimport_options *g:ale_python_unimport_options*
invocation. invocation.
g:ale_python_unimport_use_global *g:ale_python_unimport_use_global* g:ale_python_unimport_use_global *g:ale_python_unimport_use_global*
*b:ale_python_unimport_use_global* *b:ale_python_unimport_use_global*
Type: |Number| Type: |Number|
Default: `get(g:, 'ale_use_global_executables', 0)` Default: `get(g:, 'ale_use_global_executables', 0)`

View file

@ -0,0 +1,41 @@
===============================================================================
ALE Racket Integration *ale-racket-options*
===============================================================================
racket_langserver *ale-racket-langserver*
1. Install racket-langserver as described here:
https://github.com/jeapostrophe/racket-langserver
2. Have `racket` available in the `$PATH` environment variable, currently there
is no way to specify path to custom location of `racket`.
3. set `racket_langserver` as a linter for `racket` like: >
let g:ale_linters['racket'] += ['racket_langserver']
You should be able to see linter results and use LSP features of `ALE` like
`ALEGoToDefinition` with `racket-langserver`.
===============================================================================
raco_fmt *ale-racket-raco-fmt*
g:ale_racket_raco_fmt_executable *g:ale_racket_raco_fmt_executable*
*b:ale_racket_raco_fmt_executable*
Type: |String|
Default: `'raco'`
If the `raco` excutable is not in the `$PATH` environment variable, or you
prefer to use one installed in a custom location, set this option to the
path to the specific `raco` executable.
g:ale_racket_raco_fmt_options *g:ale_racket_raco_fmt_options*
*b:ale_racket_raco_fmt_options*
Type: |String|
Default: `''`
Use this variable to pass command-line flags/parameters to `raco_fmt`
For example, set the page width limit to 40 >
let g:ale_racket_raco_fmt_options = '--width 40'
===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:

View file

@ -36,6 +36,7 @@ Notes:
* `write-good` * `write-good`
* ASM * ASM
* `gcc` * `gcc`
* `llvm-mc`
* AVRA * AVRA
* `avra` * `avra`
* Awk * Awk
@ -255,11 +256,13 @@ Notes:
* `alex` * `alex`
* `angular` * `angular`
* `cspell` * `cspell`
* `eslint`
* `fecs` * `fecs`
* `html-beautify` * `html-beautify`
* `htmlhint` * `htmlhint`
* `prettier` * `prettier`
* `proselint` * `proselint`
* `rustywind`
* `tidy` * `tidy`
* `write-good` * `write-good`
* Idris * Idris
@ -340,6 +343,7 @@ Notes:
* Lua * Lua
* `cspell` * `cspell`
* `lua-format` * `lua-format`
* `lua-language-server`
* `luac` * `luac`
* `luacheck` * `luacheck`
* `luafmt` * `luafmt`
@ -377,6 +381,7 @@ Notes:
* `nimlsp` * `nimlsp`
* `nimpretty` * `nimpretty`
* nix * nix
* `alejandra`
* `nix-instantiate` * `nix-instantiate`
* `nixfmt` * `nixfmt`
* `nixpkgs-fmt` * `nixpkgs-fmt`
@ -481,6 +486,7 @@ Notes:
* `isort` * `isort`
* `mypy` * `mypy`
* `prospector`!! * `prospector`!!
* `pycln`
* `pycodestyle` * `pycodestyle`
* `pydocstyle` * `pydocstyle`
* `pyflakes` * `pyflakes`
@ -490,6 +496,7 @@ Notes:
* `pylsp` * `pylsp`
* `pyre` * `pyre`
* `pyright` * `pyright`
* `refurb`
* `reorder-python-imports` * `reorder-python-imports`
* ruff * ruff
* `unimport` * `unimport`

View file

@ -17,7 +17,7 @@ CONTENTS *ale-contents*
5.1 Completion........................|ale-completion| 5.1 Completion........................|ale-completion|
5.2 Go To Definition..................|ale-go-to-definition| 5.2 Go To Definition..................|ale-go-to-definition|
5.3 Go To Type Definition.............|ale-go-to-type-definition| 5.3 Go To Type Definition.............|ale-go-to-type-definition|
5.4 Go To Implementation..............|ale-go-to-type-implementation| 5.4 Go To Implementation..............|ale-go-to-implementation|
5.5 Find References...................|ale-find-references| 5.5 Find References...................|ale-find-references|
5.6 Hovering..........................|ale-hover| 5.6 Hovering..........................|ale-hover|
5.7 Symbol Search.....................|ale-symbol-search| 5.7 Symbol Search.....................|ale-symbol-search|
@ -121,6 +121,7 @@ circumstances.
ALE will report problems with your code in the following ways, listed with ALE will report problems with your code in the following ways, listed with
their relevant options. their relevant options.
* Via the Neovim diagnostics API (Off by default) - |g:ale_use_neovim_diagnostics_api|
* By updating loclist. (On by default) - |g:ale_set_loclist| * By updating loclist. (On by default) - |g:ale_set_loclist|
* By updating quickfix. (Off by default) - |g:ale_set_quickfix| * By updating quickfix. (Off by default) - |g:ale_set_quickfix|
* By setting error highlights. - |g:ale_set_highlights| * By setting error highlights. - |g:ale_set_highlights|
@ -1063,7 +1064,8 @@ g:ale_echo_msg_format *g:ale_echo_msg_format*
`%s` - replaced with the text for the problem `%s` - replaced with the text for the problem
`%...code...% `- replaced with the error code `%...code...% `- replaced with the error code
`%linter%` - replaced with the name of the linter `%linter%` - replaced with the name of the linter
`%severity%` - replaced with the severity of the problem `%severity%` - replaced with the severity of the problem (e.g. `Error`)
`%type%` - replaced with the type of the problem (e.g. `E`)
The strings for `%severity%` can be configured with the following options. The strings for `%severity%` can be configured with the following options.
@ -1234,7 +1236,7 @@ g:ale_floating_preview *g:ale_floating_preview*
|g:ale_detail_to_floating_preview| to `1`. |g:ale_detail_to_floating_preview| to `1`.
g:ale_floating_preview_popup_opts *g:ale_floating_preview_popup_opts* g:ale_floating_preview_popup_opts *g:ale_floating_preview_popup_opts*
Type: |String| or |Dictionary| Type: |String| or |Dictionary|
Default: `''` Default: `''`
@ -1250,14 +1252,16 @@ g:ale_floating_preview_popup_opts *g:ale_floating_preview_popup_opts
For example, to enhance popups with a title: > For example, to enhance popups with a title: >
function! CustomOpts() abort { function! CustomOpts() abort
let [l:info, l:loc] = ale#util#FindItemAtCursor(bufnr('')) let [l:info, l:loc] = ale#util#FindItemAtCursor(bufnr(''))
return {'title': ' ALE: ' . (l:loc.linter_name) . ' '} return {'title': ' ALE: ' . (l:loc.linter_name) . ' '}
endfunction endfunction
let g:ale_floating_preview_popup_opts = 'g:CustomOpts'
< <
g:ale_floating_window_border *g:ale_floating_window_border* g:ale_floating_window_border *g:ale_floating_window_border*
Type: |List| Type: |List|
Default: `['|', '-', '+', '+', '+', '+', '|', '-']` Default: `['|', '-', '+', '+', '+', '+', '|', '-']`
@ -1647,7 +1651,7 @@ g:ale_linters *g:ale_linters*
\ 'jsonc': [], \ 'jsonc': [],
\ 'perl': ['perlcritic'], \ 'perl': ['perlcritic'],
\ 'perl6': [], \ 'perl6': [],
\ 'python': ['flake8', 'mypy', 'pylint', 'pyright'], \ 'python': ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'],
\ 'rust': ['cargo', 'rls'], \ 'rust': ['cargo', 'rls'],
\ 'spec': [], \ 'spec': [],
\ 'text': [], \ 'text': [],
@ -2287,23 +2291,41 @@ g:ale_use_global_executables *g:ale_use_global_executables*
options. options.
g:ale_virtualtext_cursor *g:ale_virtualtext_cursor* g:ale_use_neovim_diagnostics_api *g:ale_use_neovim_diagnostics_api*
Type: |Number| Type: |Number|
Default: `0` Default: `0`
When this option is set to `1`, a message will be shown when a cursor is If enabled, this option will disable ALE's standard UI, and instead send
near a warning or error. ALE will attempt to find the warning or error at a all linter output to Neovim's diagnostics API. This allows you to collect
column nearest to the cursor when the cursor is resting on a line which errors from nvim-lsp, ALE, and anything else that uses diagnostics all in
contains a warning or error. This option can be set to `0` to disable this one place. The following options are ignored when using the diagnostics API:
behavior.
When this option is set to `2`, then all warnings will be shown for the - |g:ale_set_highlights|
whole buffer, regardless of if the cursor is currently positioned in that - |g:ale_set_signs|
line. - |g:ale_virtualtext_cursor|
To enable this option, set the value to `1`.
This option requires Neovim 0.6+, as that version introduces the diagnostics
API.
g:ale_virtualtext_cursor *g:ale_virtualtext_cursor*
Type: |Number|
Default: `'all'` (if supported, otherwise `'disabled'`)
This option controls how ALE will display problems using |virtual-text|.
The following values can be used.
`'all'`, `'2'`, or `2` - Show problems for all lines.
`'current'`, `'1'`, or `1` - Show problems for the current line.
`'disabled'`, `'0'`, or `0` - Do not show problems with virtual-text.
Messages are only displayed after a short delay. See |g:ale_virtualtext_delay|. 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|. Messages can be prefixed with a string. See |g:ale_virtualtext_prefix|.
ALE will use the following highlight groups for problems: ALE will use the following highlight groups for problems:
@ -2316,7 +2338,6 @@ g:ale_virtualtext_cursor *g:ale_virtualtext_cursor*
g:ale_virtualtext_delay *g:ale_virtualtext_delay* g:ale_virtualtext_delay *g:ale_virtualtext_delay*
*b:ale_virtualtext_delay* *b:ale_virtualtext_delay*
Type: |Number| Type: |Number|
Default: `10` Default: `10`
@ -2328,12 +2349,58 @@ g:ale_virtualtext_delay *g:ale_virtualtext_delay*
g:ale_virtualtext_prefix *g:ale_virtualtext_prefix* g:ale_virtualtext_prefix *g:ale_virtualtext_prefix*
*b:ale_virtualtext_prefix*
Type: |String| Type: |String|
Default: `'> '` Default: `'%comment% %type%: '`
Prefix to be used with |g:ale_virtualtext_cursor|. Prefix to be used with |g:ale_virtualtext_cursor|.
This setting can be changed in each buffer with `b:ale_virtualtext_prefix`.
All of the same format markers used for |g:ale_echo_msg_format| can be used
for defining the prefix, including some additional sequences of characters.
`%comment%` - replaced with comment characters in the current language
ALE will read the comment characters from |&commentstring|, reading only the
part before `%s`, with whitespace trimmed. If comment syntax cannot be
pulled from |&commentstring|, ALE will default to `'#'`.
g:ale_virtualtext_column *g:ale_virtualtext_column*
*b:ale_virtualtext_column*
g:ale_virtualtext_maxcolumn *g:ale_virtualtext_maxcolumn*
*b:ale_virtualtext_maxcolumn*
Type: |String| or |Number|
Default: `0`
Virtualtext column range, from `column` to `maxcolumn`. If a line is
`column` or less characters long, the virtualtext message is shifted right
to `column`.
Where the line is greater than `column` characters long, but less than
`maxcolumn`, the virtualtext message is placed at the end of the line.
Where the line is greater than `maxcolumn` the virtualtext message is
omitted.
A |Number| greater than `0` is used as the fixed column position, however
a |String| ending in `%` represents a percentage of the window width.
When `column` is set to zero, column positioning is disabled, when `maxcolumn`
is set to zero, no maximum line length is enforced.
g:ale_virtualtext_single *g:ale_virtualtext_single*
*b:ale_virtualtext_single*
Type: |Number|
Default: `0`
Enable or disable concatenation of multiple virtualtext messages on a single
line. By default, if a line has multiple errors or warnings, each will be
appended in turn.
With `single` set to a non-zero value, only the first message appears.
(No attempt is made to prefer message types such as errors over warnings)
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*
@ -2510,7 +2577,7 @@ ALEStyleWarningSignLineNr *ALEStyleWarningSignLineNr*
ALEVirtualTextError *ALEVirtualTextError* ALEVirtualTextError *ALEVirtualTextError*
Default: `highlight link ALEVirtualTextError ALEError` Default: `highlight link ALEVirtualTextError Comment`
The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|. The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|.
@ -2538,7 +2605,7 @@ ALEVirtualTextStyleWarning *ALEVirtualTextStyleWarning*
ALEVirtualTextWarning *ALEVirtualTextWarning* ALEVirtualTextWarning *ALEVirtualTextWarning*
Default: `highlight link ALEVirtualTextWarning ALEWarning` Default: `highlight link ALEVirtualTextWarning Comment`
The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|. The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|.
@ -2778,6 +2845,7 @@ documented in additional help files.
textlint..............................|ale-asciidoc-textlint| textlint..............................|ale-asciidoc-textlint|
asm.....................................|ale-asm-options| asm.....................................|ale-asm-options|
gcc...................................|ale-asm-gcc| gcc...................................|ale-asm-gcc|
llvm_mc...............................|ale-asm-llvm_mc|
avra....................................|ale-avra-options| avra....................................|ale-avra-options|
avra..................................|ale-avra-avra| avra..................................|ale-avra-avra|
awk.....................................|ale-awk-options| awk.....................................|ale-awk-options|
@ -2962,6 +3030,7 @@ documented in additional help files.
html-beautify.........................|ale-html-beautify| html-beautify.........................|ale-html-beautify|
htmlhint..............................|ale-html-htmlhint| htmlhint..............................|ale-html-htmlhint|
prettier..............................|ale-html-prettier| prettier..............................|ale-html-prettier|
rustywind.............................|ale-html-rustywind|
stylelint.............................|ale-html-stylelint| stylelint.............................|ale-html-stylelint|
tidy..................................|ale-html-tidy| tidy..................................|ale-html-tidy|
vscodehtml............................|ale-html-vscode| vscodehtml............................|ale-html-vscode|
@ -3037,6 +3106,7 @@ documented in additional help files.
lua.....................................|ale-lua-options| lua.....................................|ale-lua-options|
cspell................................|ale-lua-cspell| cspell................................|ale-lua-cspell|
lua-format............................|ale-lua-lua-format| lua-format............................|ale-lua-lua-format|
lua-language-server...................|ale-lua-lua-language-server|
luac..................................|ale-lua-luac| luac..................................|ale-lua-luac|
luacheck..............................|ale-lua-luacheck| luacheck..............................|ale-lua-luacheck|
luafmt................................|ale-lua-luafmt| luafmt................................|ale-lua-luafmt|
@ -3063,9 +3133,11 @@ documented in additional help files.
nimlsp................................|ale-nim-nimlsp| nimlsp................................|ale-nim-nimlsp|
nimpretty.............................|ale-nim-nimpretty| nimpretty.............................|ale-nim-nimpretty|
nix.....................................|ale-nix-options| nix.....................................|ale-nix-options|
alejandra.............................|ale-nix-alejandra|
nixfmt................................|ale-nix-nixfmt| nixfmt................................|ale-nix-nixfmt|
nixpkgs-fmt...........................|ale-nix-nixpkgs-fmt| nixpkgs-fmt...........................|ale-nix-nixpkgs-fmt|
statix................................|ale-nix-statix| statix................................|ale-nix-statix|
deadnix...............................|ale-nix-deadnix|
nroff...................................|ale-nroff-options| nroff...................................|ale-nroff-options|
write-good............................|ale-nroff-write-good| write-good............................|ale-nroff-write-good|
objc....................................|ale-objc-options| objc....................................|ale-objc-options|
@ -3159,6 +3231,7 @@ documented in additional help files.
isort.................................|ale-python-isort| isort.................................|ale-python-isort|
mypy..................................|ale-python-mypy| mypy..................................|ale-python-mypy|
prospector............................|ale-python-prospector| prospector............................|ale-python-prospector|
pycln.................................|ale-python-pycln|
pycodestyle...........................|ale-python-pycodestyle| pycodestyle...........................|ale-python-pycodestyle|
pydocstyle............................|ale-python-pydocstyle| pydocstyle............................|ale-python-pydocstyle|
pyflakes..............................|ale-python-pyflakes| pyflakes..............................|ale-python-pyflakes|
@ -3168,6 +3241,7 @@ documented in additional help files.
pylsp.................................|ale-python-pylsp| pylsp.................................|ale-python-pylsp|
pyre..................................|ale-python-pyre| pyre..................................|ale-python-pyre|
pyright...............................|ale-python-pyright| pyright...............................|ale-python-pyright|
refurb................................|ale-python-refurb|
reorder-python-imports................|ale-python-reorder_python_imports| reorder-python-imports................|ale-python-reorder_python_imports|
ruff..................................|ale-python-ruff| ruff..................................|ale-python-ruff|
unimport..............................|ale-python-unimport| unimport..............................|ale-python-unimport|
@ -3179,6 +3253,9 @@ documented in additional help files.
languageserver........................|ale-r-languageserver| languageserver........................|ale-r-languageserver|
lintr.................................|ale-r-lintr| lintr.................................|ale-r-lintr|
styler................................|ale-r-styler| styler................................|ale-r-styler|
racket..................................|ale-racket-options|
racket_langserver.....................|ale-racket-langserver|
raco_fmt..............................|ale-racket-raco-fmt|
reasonml................................|ale-reasonml-options| reasonml................................|ale-reasonml-options|
merlin................................|ale-reasonml-merlin| merlin................................|ale-reasonml-merlin|
ols...................................|ale-reasonml-ols| ols...................................|ale-reasonml-ols|

View file

@ -0,0 +1,49 @@
local module = {}
local ale_type_to_diagnostic_severity = {
E = vim.diagnostic.severity.ERROR,
W = vim.diagnostic.severity.WARN,
I = vim.diagnostic.severity.INFO
}
module.sendAleResultsToDiagnostics = function(buffer, loclist)
local diagnostics = {}
-- Convert all the ALE loclist items to the shape that Neovim's diagnostic
-- API is expecting.
for _, location in ipairs(loclist) do
table.insert(
diagnostics,
-- All line numbers from ALE are 1-indexed, but all line numbers
-- in the diagnostics API are 0-indexed, so we have to subtract 1
-- to make this work.
{
lnum = location.lnum - 1,
-- Ending line number, or if we don't have one, just make it the same
-- as the starting line number
end_lnum = (location.end_lnum or location.lnum) - 1,
-- Which column does the error start on?
col = math.max((location.col or 1) - 1, 0),
-- end_col does *not* appear to need 1 subtracted, so we don't.
end_col = location.end_col,
-- Which severity: error, warning, or info?
severity = ale_type_to_diagnostic_severity[location.type] or "E",
-- The error message
message = location.text,
-- e.g. "rubocop"
source = location.linter_name,
}
)
end
local virtualtext_enabled_set = {['all'] = true, ['2'] = true, [2] = true, ['current'] = true, ['1'] = true, [1] = true}
vim.diagnostic.set(
vim.api.nvim_create_namespace('ale'),
buffer,
diagnostics,
{ virtual_text = virtualtext_enabled_set[vim.g.ale_virtualtext_cursor] ~= nil}
)
end
return module

View file

@ -127,8 +127,8 @@ 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. " This flag can be changed to disable/enable virtual text.
let g:ale_virtualtext_cursor = get(g:, 'ale_virtualtext_cursor', 0) let g:ale_virtualtext_cursor = get(g:, 'ale_virtualtext_cursor', (has('nvim-0.3.2') || has('patch-9.0.0297') && has('textprop') && has('popupwin')) ? 'all' : 'disabled')
" This flag can be set to 1 to enable LSP hover messages at the cursor. " This flag can be set to 1 to enable LSP hover messages at the cursor.
let g:ale_hover_cursor = get(g:, 'ale_hover_cursor', 1) let g:ale_hover_cursor = get(g:, 'ale_hover_cursor', 1)
@ -178,6 +178,10 @@ let g:ale_python_auto_pipenv = get(g:, 'ale_python_auto_pipenv', 0)
" Enable automatic detection of poetry for Python linters. " Enable automatic detection of poetry for Python linters.
let g:ale_python_auto_poetry = get(g:, 'ale_python_auto_poetry', 0) let g:ale_python_auto_poetry = get(g:, 'ale_python_auto_poetry', 0)
" Enable automatic adjustment of environment variables for Python linters.
" The variables are set based on ALE's virtualenv detection.
let g:ale_python_auto_virtualenv = get(g:, 'ale_python_auto_virtualenv', 0)
" This variable can be overridden to set the GO111MODULE environment variable. " This variable can be overridden to set the GO111MODULE environment variable.
let g:ale_go_go111module = get(g:, 'ale_go_go111module', '') let g:ale_go_go111module = get(g:, 'ale_go_go111module', '')
@ -187,6 +191,15 @@ let g:ale_deno_executable = get(g:, 'ale_deno_executable', 'deno')
" If 1, enable a popup menu for commands. " If 1, enable a popup menu for commands.
let g:ale_popup_menu_enabled = get(g:, 'ale_popup_menu_enabled', has('gui_running')) let g:ale_popup_menu_enabled = get(g:, 'ale_popup_menu_enabled', has('gui_running'))
" If 1, disables ALE's built in error display. Instead, all errors are piped
" to the diagnostics API.
let g:ale_use_neovim_diagnostics_api = get(g:, 'ale_use_neovim_diagnostics_api', 0)
if g:ale_use_neovim_diagnostics_api && !has('nvim-0.6')
" no-custom-checks
echoerr('Setting g:ale_use_neovim_diagnostics_api to 1 requires Neovim 0.6+.')
endif
if g:ale_set_balloons is 1 || g:ale_set_balloons is# 'hover' if g:ale_set_balloons is 1 || g:ale_set_balloons is# 'hover'
call ale#balloon#Enable() call ale#balloon#Enable()
endif endif

View file

@ -45,6 +45,7 @@ formatting.
* [write-good](https://github.com/btford/write-good) * [write-good](https://github.com/btford/write-good)
* ASM * ASM
* [gcc](https://gcc.gnu.org) * [gcc](https://gcc.gnu.org)
* [llvm-mc](https://llvm.org)
* AVRA * AVRA
* [avra](https://github.com/Ro5bert/avra) * [avra](https://github.com/Ro5bert/avra)
* Awk * Awk
@ -264,11 +265,13 @@ formatting.
* [alex](https://github.com/get-alex/alex) * [alex](https://github.com/get-alex/alex)
* [angular](https://www.npmjs.com/package/@angular/language-server) * [angular](https://www.npmjs.com/package/@angular/language-server)
* [cspell](https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell) * [cspell](https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell)
* [eslint](https://github.com/BenoitZugmeyer/eslint-plugin-html)
* [fecs](http://fecs.baidu.com/) * [fecs](http://fecs.baidu.com/)
* [html-beautify](https://beautifier.io/) * [html-beautify](https://beautifier.io/)
* [htmlhint](http://htmlhint.com/) * [htmlhint](http://htmlhint.com/)
* [prettier](https://github.com/prettier/prettier) * [prettier](https://github.com/prettier/prettier)
* [proselint](http://proselint.com/) * [proselint](http://proselint.com/)
* [rustywind](https://github.com/avencera/rustywind)
* [tidy](http://www.html-tidy.org/) * [tidy](http://www.html-tidy.org/)
* [write-good](https://github.com/btford/write-good) * [write-good](https://github.com/btford/write-good)
* Idris * Idris
@ -349,6 +352,7 @@ formatting.
* Lua * Lua
* [cspell](https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell) * [cspell](https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell)
* [lua-format](https://github.com/Koihik/LuaFormatter) * [lua-format](https://github.com/Koihik/LuaFormatter)
* [lua-language-server](https://github.com/LuaLS/lua-language-server)
* [luac](https://www.lua.org/manual/5.1/luac.html) * [luac](https://www.lua.org/manual/5.1/luac.html)
* [luacheck](https://github.com/mpeterv/luacheck) * [luacheck](https://github.com/mpeterv/luacheck)
* [luafmt](https://github.com/trixnz/lua-fmt) * [luafmt](https://github.com/trixnz/lua-fmt)
@ -386,6 +390,7 @@ formatting.
* [nimlsp](https://github.com/PMunch/nimlsp) * [nimlsp](https://github.com/PMunch/nimlsp)
* nimpretty * nimpretty
* nix * nix
* [alejandra](https://github.com/kamadorueda/alejandra)
* [nix-instantiate](http://nixos.org/nix/manual/#sec-nix-instantiate) * [nix-instantiate](http://nixos.org/nix/manual/#sec-nix-instantiate)
* [nixfmt](https://github.com/serokell/nixfmt) * [nixfmt](https://github.com/serokell/nixfmt)
* [nixpkgs-fmt](https://github.com/nix-community/nixpkgs-fmt) * [nixpkgs-fmt](https://github.com/nix-community/nixpkgs-fmt)
@ -490,6 +495,7 @@ formatting.
* [isort](https://github.com/timothycrosley/isort) * [isort](https://github.com/timothycrosley/isort)
* [mypy](http://mypy-lang.org/) * [mypy](http://mypy-lang.org/)
* [prospector](https://github.com/PyCQA/prospector) :warning: :floppy_disk: * [prospector](https://github.com/PyCQA/prospector) :warning: :floppy_disk:
* [pycln](https://github.com/hadialqattan/pycln)
* [pycodestyle](https://github.com/PyCQA/pycodestyle) :warning: * [pycodestyle](https://github.com/PyCQA/pycodestyle) :warning:
* [pydocstyle](https://www.pydocstyle.org/) :warning: * [pydocstyle](https://www.pydocstyle.org/) :warning:
* [pyflakes](https://github.com/PyCQA/pyflakes) * [pyflakes](https://github.com/PyCQA/pyflakes)
@ -499,6 +505,7 @@ formatting.
* [pylsp](https://github.com/python-lsp/python-lsp-server) :warning: * [pylsp](https://github.com/python-lsp/python-lsp-server) :warning:
* [pyre](https://github.com/facebook/pyre-check) :warning: * [pyre](https://github.com/facebook/pyre-check) :warning:
* [pyright](https://github.com/microsoft/pyright) * [pyright](https://github.com/microsoft/pyright)
* [refurb](https://github.com/dosisod/refurb) :floppy_disk:
* [reorder-python-imports](https://github.com/asottile/reorder_python_imports) * [reorder-python-imports](https://github.com/asottile/reorder_python_imports)
* [ruff](https://github.com/charliermarsh/ruff) * [ruff](https://github.com/charliermarsh/ruff)
* [unimport](https://github.com/hakancelik96/unimport) * [unimport](https://github.com/hakancelik96/unimport)

View file

@ -69,7 +69,7 @@ This plugin can also be found at http://www.vim.org/scripts/script.php?script_id
git clone https://github.com/jlanzarotta/bufexplorer.git ~/.vim/bundle/bufexplorer.vim git clone https://github.com/jlanzarotta/bufexplorer.git ~/.vim/bundle/bufexplorer.vim
## License ## License
Copyright (c) 2001-2022, Jeff Lanzarotta Copyright (c) 2001-2023, Jeff Lanzarotta
All rights reserved. All rights reserved.

@ -0,0 +1 @@
Subproject commit b6e5624351ba735e25eb8864d7d22819aad00606

View file

@ -103,7 +103,7 @@ if exists('g:loaded_nvim_treesitter')
if has('nvim-0.8.1') if has('nvim-0.8.1')
" # Misc " # Misc
hi! link @punctuation.delimiter Delimiter hi! link @punctuation.delimiter Delimiter
hi! link @punctuation.bracket Normal hi! link @punctuation.bracket DraculaFg
hi! link @punctuation.special Special hi! link @punctuation.special Special
" # Constants " # Constants
hi! link @constant Constant hi! link @constant Constant
@ -121,7 +121,7 @@ if exists('g:loaded_nvim_treesitter')
hi! link @parameter DraculaOrangeItalic hi! link @parameter DraculaOrangeItalic
hi! link @parameter.reference DraculaOrange hi! link @parameter.reference DraculaOrange
hi! link @field DraculaOrange hi! link @field DraculaOrange
hi! link @property Normal hi! link @property DraculaFg
hi! link @constructor DraculaCyan hi! link @constructor DraculaCyan
" # Keywords " # Keywords
hi! link @label DraculaPurpleItalic hi! link @label DraculaPurpleItalic
@ -129,10 +129,10 @@ if exists('g:loaded_nvim_treesitter')
hi! link @keyword.operator Operator hi! link @keyword.operator Operator
hi! link @exception DraculaPurple hi! link @exception DraculaPurple
" # Variable " # Variable
hi! link @variable Normal hi! link @variable DraculaFg
hi! link @variable.builtin DraculaPurpleItalic hi! link @variable.builtin DraculaPurpleItalic
" # Text " # Text
hi! link @text Normal hi! link @text DraculaFg
hi! link @text.strong DraculaFgBold hi! link @text.strong DraculaFgBold
hi! link @text.emphasis DraculaFg hi! link @text.emphasis DraculaFg
hi! link @text.underline Underlined hi! link @text.underline Underlined
@ -143,7 +143,7 @@ if exists('g:loaded_nvim_treesitter')
hi! link @text.diff.delete DiffDelete hi! link @text.diff.delete DiffDelete
" # Tags " # Tags
hi! link @tag DraculaCyan hi! link @tag DraculaCyan
hi! link @tag.delimiter Normal hi! link @tag.delimiter DraculaFg
" HTML and JSX tag attributes. By default, this group is linked to TSProperty, " HTML and JSX tag attributes. By default, this group is linked to TSProperty,
" which in turn links to Identifer (white). " which in turn links to Identifer (white).
hi! link @tag.attribute DraculaGreenItalic hi! link @tag.attribute DraculaGreenItalic

View file

@ -203,12 +203,13 @@ call s:h('DraculaLink', s:cyan, s:none, [s:attrs.underline])
if g:dracula_high_contrast_diff if g:dracula_high_contrast_diff
call s:h('DraculaDiffChange', s:yellow, s:purple) call s:h('DraculaDiffChange', s:yellow, s:purple)
call s:h('DraculaDiffDelete', s:bgdark, s:red)
else else
call s:h('DraculaDiffChange', s:orange, s:none) call s:h('DraculaDiffChange', s:orange, s:none)
call s:h('DraculaDiffDelete', s:red, s:bgdark)
endif endif
call s:h('DraculaDiffText', s:bg, s:orange) call s:h('DraculaDiffText', s:bg, s:orange)
call s:h('DraculaDiffDelete', s:red, s:bgdark)
" }}}2 " }}}2

View file

@ -96,12 +96,10 @@ test_script:
# Run the core tests # Run the core tests
- ctest . --output-on-failure -C Debug - ctest . --output-on-failure -C Debug
# CTestCustom specifies skipping UTF-8 tests on Windows. # CTestCustom specifies skipping some tests on Windows.
- cmd: echo "Reminder - did not try UTF-8" - cmd: echo "Reminder - skipped some tests"
- sh: echo "Reminder - tried UTF-8"
on_failure: on_failure:
- echo "failed" - echo "failed"
- cmd: type tests\core\build\Testing\Temporary\LastTest.log - cmd: type tests\core\build\Testing\Temporary\LastTest.log
- sh: cat tests/core/build/Testing/Temporary/LastTest.log - sh: cat tests/core/build/Testing/Temporary/LastTest.log

View file

@ -14,8 +14,8 @@ To install this plugin, you can use one of the following ways:
Download the [archive][] and extract it into your Vim runtime directory Download the [archive][] and extract it into your Vim runtime directory
(`~/.vim` on UNIX/Linux and `$VIM_INSTALLATION_FOLDER\vimfiles` on windows). (`~/.vim` on UNIX/Linux and `$VIM_INSTALLATION_FOLDER\vimfiles` on windows).
You should have 3 sub-directories in this runtime directory now: "autoload", You should have 4 sub-directories in this runtime directory now: "autoload",
"doc" and "plugin". "doc", "ftdetect" and "plugin".
### Install as Vim8 plugin ### Install as Vim8 plugin

View file

@ -45,22 +45,24 @@ if !exists('g:editorconfig_core_vimscript_debug')
endif endif
" }}}1 " }}}1
" === Regexes =========================================================== {{{1 " === Regexes =========================================================== {{{1
let s:LEFT_BRACE = '\v%(^|[^\\])\{' let s:LEFT_BRACE = '\v[\\]@8<!\{'
" 8 is an arbitrary byte-count limit to the lookbehind (micro-optimization)
"LEFT_BRACE = re.compile( "LEFT_BRACE = re.compile(
" r""" " r"""
" "
" (?: ^ | [^\\] ) # Beginning of string or a character besides "\" " (?<! \\ ) # Not preceded by "\"
" "
" \{ # "{" " \{ # "{"
" "
" """, re.VERBOSE " """, re.VERBOSE
") ")
let s:RIGHT_BRACE = '\v%(^|[^\\])\}' let s:RIGHT_BRACE = '\v[\\]@8<!\}'
" 8 is an arbitrary byte-count limit to the lookbehind (micro-optimization)
"RIGHT_BRACE = re.compile( "RIGHT_BRACE = re.compile(
" r""" " r"""
" "
" (?: ^ | [^\\] ) # Beginning of string or a character besides "\" " (?<! \\ ) # Not preceded by "\"
" "
" \} # "}" " \} # "}"
" "

View file

@ -49,8 +49,8 @@ let s:SECTCRE = '\v^\s*\[(%([^\\#;]|\\.)+)\]'
let s:OPTCRE = '\v\s*([^:=[:space:]][^:=]*)\s*([:=])\s*(.*)$' let s:OPTCRE = '\v\s*([^:=[:space:]][^:=]*)\s*([:=])\s*(.*)$'
let s:MAX_SECTION_NAME = 4096 let s:MAX_SECTION_NAME = 4096
let s:MAX_PROPERTY_NAME = 50 let s:MAX_PROPERTY_NAME = 1024
let s:MAX_PROPERTY_VALUE = 255 let s:MAX_PROPERTY_VALUE = 4096
lockvar s:SECTCRE s:OPTCRE s:MAX_SECTION_NAME s:MAX_PROPERTY_NAME s:MAX_PROPERTY_VALUE lockvar s:SECTCRE s:OPTCRE s:MAX_SECTION_NAME s:MAX_PROPERTY_NAME s:MAX_PROPERTY_VALUE
@ -155,18 +155,6 @@ function! s:parse(config_filename, target_filename, lines)
echom printf('Saw raw opt <%s>=<%s>', l:optname, l:optval) echom printf('Saw raw opt <%s>=<%s>', l:optname, l:optval)
endif endif
if l:optval =~# '\v[;#]'
" ';' and '#' are comment delimiters only if
" preceded by a spacing character
let l:m = matchlist(l:optval, '\v(.{-})\s[;#]')
if len(l:m)
let l:optval = l:m[1]
endif
" ; and # can be escaped with backslash.
let l:optval = substitute(l:optval, '\v\\([;#])', '\1', 'g')
endif
let l:optval = editorconfig_core#util#strip(l:optval) let l:optval = editorconfig_core#util#strip(l:optval)
" allow empty values " allow empty values
if l:optval ==? '""' if l:optval ==? '""'

View file

@ -124,35 +124,48 @@ is restarted.
*g:EditorConfig_max_line_indicator* *g:EditorConfig_max_line_indicator*
The way to show the line where the maximal length is reached. Accepted values The way to show the line where the maximal length is reached. Accepted values
are "line", "fill" and "exceeding", otherwise there will be no max line are "line", "fill", "exceeding" and "fillexceeding", otherwise there will be
indicator. no max line indicator.
"line": the right column of the max line length column will be "line": the right column of the max line length column will be
highlighted, made possible by adding "+1" to 'colorcolumn'. highlighted on all lines, by adding +1 to 'colorcolumn'.
"fill": all the columns to the right of the max line length column "fill": all the columns to the right of the max line length
will be highlighted, made possible by setting 'colorcolumn' column will be highlighted on all lines, by setting
to a list of numbers starting from "max_line_length + 1" to 'colorcolumn' to a list starting from "max_line_length +
the number of columns on the screen. 1" to the number of columns on the screen.
"exceeding": the right column of the max line length column will be "exceeding": the right column of the max line length column will be
highlighted on lines that exceed the max line length, made highlighted on lines that exceed the max line length, by
possible by adding a match for the ColorColumn group. adding a match for the ColorColumn group.
"none": no max line length indicator will be shown. This is the "fillexceeding": all the columns to the right of the max line length
recommended value when you do not want any indicator to be column will be highlighted on lines that exceed the max
shown, but values other than "line" or "fill" would also work line length, by adding a match for the ColorColumn group.
as "none".
"none": no max line length indicator will be shown. Recommended
when you do not want any indicator to be shown, but any
value other than those listed above also work as "none".
To set this option, add any of the following lines to your |vimrc| file: To set this option, add any of the following lines to your |vimrc| file:
> >
let g:EditorConfig_max_line_indicator = "line" let g:EditorConfig_max_line_indicator = "line"
let g:EditorConfig_max_line_indicator = "fill" let g:EditorConfig_max_line_indicator = "fill"
let g:EditorConfig_max_line_indicator = "exceeding" let g:EditorConfig_max_line_indicator = "exceeding"
let g:EditorConfig_max_line_indicator = "fillexceeding"
let g:EditorConfig_max_line_indicator = "none" let g:EditorConfig_max_line_indicator = "none"
< <
The default value is "line". The default value is "line".
*g:EditorConfig_enable_for_new_buf*
Set this to 1 if you want EditorConfig plugin to set options
for new empty buffers too.
Path to .editorconfig will be determined based on CWD (see |getcwd()|)
>
let g:EditorConfig_enable_for_new_buf = 1
<
This option defaults to 0.
*g:EditorConfig_preserve_formatoptions* *g:EditorConfig_preserve_formatoptions*
Set this to 1 if you don't want your formatoptions modified when Set this to 1 if you don't want your formatoptions modified when
max_line_length is set: max_line_length is set:

View file

@ -0,0 +1 @@
autocmd BufNewFile,BufRead .editorconfig setfiletype dosini

View file

@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
zip -r editorconfig-vim-$*.zip plugin/* autoload/* doc/* zip -r editorconfig-vim-$*.zip autoload/* doc/* ftdetect/* plugin/*

View file

@ -60,6 +60,10 @@ if !exists('g:EditorConfig_disable_rules')
let g:EditorConfig_disable_rules = [] let g:EditorConfig_disable_rules = []
endif endif
if !exists('g:EditorConfig_enable_for_new_buf')
let g:EditorConfig_enable_for_new_buf = 0
endif
if !exists('g:EditorConfig_softtabstop_space') if !exists('g:EditorConfig_softtabstop_space')
let g:EditorConfig_softtabstop_space = 1 let g:EditorConfig_softtabstop_space = 1
endif endif
@ -203,11 +207,22 @@ endfunction " }}}1
function! s:UseConfigFiles() abort " Apply config to the current buffer {{{1 function! s:UseConfigFiles() abort " Apply config to the current buffer {{{1
let b:editorconfig_tried = 1 let b:editorconfig_tried = 1
let l:buffer_name = expand('%:p') let l:buffer_name = expand('%:p')
" ignore buffers without a name
if empty(l:buffer_name) " Only process normal buffers (do not treat help files as '.txt' files)
" When starting Vim with a directory, the buftype might not yet be set:
" Therefore, also check if buffer_name is a directory.
if index(['', 'acwrite'], &buftype) == -1 || isdirectory(l:buffer_name)
return return
endif endif
if empty(l:buffer_name)
if g:EditorConfig_enable_for_new_buf
let l:buffer_name = getcwd() . "/."
else
return
endif
endif
if exists("b:EditorConfig_disable") && b:EditorConfig_disable if exists("b:EditorConfig_disable") && b:EditorConfig_disable
if g:EditorConfig_verbose if g:EditorConfig_verbose
echo 'Skipping EditorConfig for buffer "' . l:buffer_name . '"' echo 'Skipping EditorConfig for buffer "' . l:buffer_name . '"'
@ -247,11 +262,11 @@ function! s:UseConfigFiles() abort " Apply config to the current buffer {{{1
endfor endfor
if s:editorconfig_core_mode ==? 'vim_core' if s:editorconfig_core_mode ==? 'vim_core'
if s:UseConfigFiles_VimCore() == 0 if s:UseConfigFiles_VimCore(l:buffer_name) == 0
let b:editorconfig_applied = 1 let b:editorconfig_applied = 1
endif endif
elseif s:editorconfig_core_mode ==? 'external_command' elseif s:editorconfig_core_mode ==? 'external_command'
call s:UseConfigFiles_ExternalCommand() call s:UseConfigFiles_ExternalCommand(l:buffer_name)
let b:editorconfig_applied = 1 let b:editorconfig_applied = 1
else else
echohl Error | echohl Error |
@ -269,6 +284,7 @@ function! s:EditorConfigEnable(should_enable)
autocmd! autocmd!
if a:should_enable if a:should_enable
autocmd BufNewFile,BufReadPost,BufFilePost * call s:UseConfigFiles() autocmd BufNewFile,BufReadPost,BufFilePost * call s:UseConfigFiles()
autocmd VimEnter,BufNew * call s:UseConfigFiles()
endif endif
augroup END augroup END
endfunction endfunction
@ -285,21 +301,15 @@ command! EditorConfigReload call s:UseConfigFiles() " Reload EditorConfig files
" On startup, enable the autocommands " On startup, enable the autocommands
call s:EditorConfigEnable(1) call s:EditorConfigEnable(1)
" Always set the filetype for .editorconfig files
augroup editorconfig_dosini
autocmd!
autocmd BufNewFile,BufRead .editorconfig set filetype=dosini
augroup END
" }}}1 " }}}1
" UseConfigFiles function for different modes {{{1 " UseConfigFiles function for different modes {{{1
function! s:UseConfigFiles_VimCore() function! s:UseConfigFiles_VimCore(target)
" Use the vimscript EditorConfig core " Use the vimscript EditorConfig core
try try
let l:config = editorconfig_core#handler#get_configurations( let l:config = editorconfig_core#handler#get_configurations(
\ { 'target': expand('%:p') } ) \ { 'target': a:target } )
call s:ApplyConfig(l:config) call s:ApplyConfig(l:config)
return 0 " success return 0 " success
catch catch
@ -307,17 +317,17 @@ function! s:UseConfigFiles_VimCore()
endtry endtry
endfunction endfunction
function! s:UseConfigFiles_ExternalCommand() function! s:UseConfigFiles_ExternalCommand(target)
" Use external EditorConfig core (e.g., the C core) " Use external EditorConfig core (e.g., the C core)
call s:DisableShellSlash() call s:DisableShellSlash()
let l:exec_path = shellescape(s:editorconfig_exec_path) let l:exec_path = shellescape(s:editorconfig_exec_path)
call s:ResetShellSlash() call s:ResetShellSlash()
call s:SpawnExternalParser(l:exec_path) call s:SpawnExternalParser(l:exec_path, a:target)
endfunction endfunction
function! s:SpawnExternalParser(cmd) " {{{2 function! s:SpawnExternalParser(cmd, target) " {{{2
" Spawn external EditorConfig. Used by s:UseConfigFiles_ExternalCommand() " Spawn external EditorConfig. Used by s:UseConfigFiles_ExternalCommand()
let l:cmd = a:cmd let l:cmd = a:cmd
@ -329,7 +339,7 @@ function! s:SpawnExternalParser(cmd) " {{{2
let l:config = {} let l:config = {}
call s:DisableShellSlash() call s:DisableShellSlash()
let l:cmd = l:cmd . ' ' . shellescape(expand('%:p')) let l:cmd = l:cmd . ' ' . shellescape(a:target)
call s:ResetShellSlash() call s:ResetShellSlash()
let l:parsing_result = split(system(l:cmd), '\v[\r\n]+') let l:parsing_result = split(system(l:cmd), '\v[\r\n]+')
@ -375,11 +385,6 @@ endfunction " }}}2
" }}}1 " }}}1
function! s:ApplyConfig(config) abort " Set the buffer options {{{1 function! s:ApplyConfig(config) abort " Set the buffer options {{{1
" Only process normal buffers (do not treat help files as '.txt' files)
if index(['', 'acwrite'], &buftype) == -1
return
endif
if g:EditorConfig_verbose if g:EditorConfig_verbose
echo 'Options: ' . string(a:config) echo 'Options: ' . string(a:config)
endif endif
@ -502,6 +507,15 @@ function! s:ApplyConfig(config) abort " Set the buffer options {{{1
endfor endfor
call matchadd('ColorColumn', call matchadd('ColorColumn',
\ '\%' . (l:max_line_length + 1) . 'v.', 100) \ '\%' . (l:max_line_length + 1) . 'v.', 100)
elseif g:EditorConfig_max_line_indicator == 'fillexceeding'
let &l:colorcolumn = ''
for l:match in getmatches()
if get(l:match, 'group', '') == 'ColorColumn'
call matchdelete(get(l:match, 'id'))
endif
endfor
call matchadd('ColorColumn',
\ '\%'. (l:max_line_length + 1) . 'v.\+', -1)
endif endif
endif endif
endif endif

View file

@ -32,3 +32,10 @@ if(WIN32 AND (NOT "$ENV{RUN_UTF8}"))
set(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE} g_utf_8_char) set(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE} g_utf_8_char)
set(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE} utf_8_char) set(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE} utf_8_char)
endif() endif()
# Skip min_supported_value_length on Windows since that test seems to
# cause Appveyor to hang.
if(WIN32)
message(WARNING "Skipping min_supported_value_length test on this platform")
set(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE} min_supported_value_length)
endif()

View file

@ -37,12 +37,14 @@ function! s:set_color(group, attr, color)
execute printf('hi %s %s%s=%s', a:group, gui ? 'gui' : 'cterm', a:attr, a:color) execute printf('hi %s %s%s=%s', a:group, gui ? 'gui' : 'cterm', a:attr, a:color)
endfunction endfunction
nnoremap <silent> <Plug>(goyo-off) :call <sid>goyo_off()<cr>
function! s:blank(repel) function! s:blank(repel)
if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1 if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1
\ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3 \ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3
call s:goyo_off() call feedkeys("\<Plug>(goyo-off)")
endif endif
execute 'wincmd' a:repel execute 'noautocmd wincmd' a:repel
endfunction endfunction
function! s:init_pad(command) function! s:init_pad(command)

View file

@ -15,7 +15,7 @@ if exists('*GetNginxIndent')
finish finish
endif endif
function! GetNginxIndent() abort function GetNginxIndent() abort
let plnum = s:PrevNotAsBlank(v:lnum - 1) let plnum = s:PrevNotAsBlank(v:lnum - 1)
" Hit the start of the file, use zero indent. " Hit the start of the file, use zero indent.
@ -52,7 +52,7 @@ function! GetNginxIndent() abort
endfunction endfunction
" Find the first line at or above {lnum} that is non-blank and not a comment. " Find the first line at or above {lnum} that is non-blank and not a comment.
function! s:PrevNotAsBlank(lnum) abort function s:PrevNotAsBlank(lnum) abort
let lnum = prevnonblank(a:lnum) let lnum = prevnonblank(a:lnum)
while lnum > 0 while lnum > 0
if getline(lnum) !~ '^\s*#' if getline(lnum) !~ '^\s*#'
@ -64,10 +64,10 @@ function! s:PrevNotAsBlank(lnum) abort
endfunction endfunction
" Check whether {line} ends with {pat}, ignoring trailing comments. " Check whether {line} ends with {pat}, ignoring trailing comments.
function! s:AsEndWith(line, pat) abort function s:AsEndWith(line, pat) abort
return a:line =~ a:pat . '\m\s*\%(#.*\)\?$' return a:line =~ a:pat . '\m\s*\%(#.*\)\?$'
endfunction endfunction
function! s:IsLineContinuation(lnum) abort function s:IsLineContinuation(lnum) abort
return a:lnum > 0 && !s:AsEndWith(getline(a:lnum), '[;{}]') return a:lnum > 0 && !s:AsEndWith(getline(a:lnum), '[;{}]')
endfunction endfunction

View file

@ -1,7 +1,7 @@
" Vim syntax file " Vim syntax file
" Language: nginx.conf " Language: nginx.conf
" Maintainer: Chris Aumann <me@chr4.org> " Maintainer: Chris Aumann <me@chr4.org>
" Last Change: Apr 15, 2017 " Last Change: Jan 25, 2023
if exists("b:current_syntax") if exists("b:current_syntax")
finish finish
@ -84,6 +84,8 @@ syn keyword ngxListenOptions default_server contained
syn keyword ngxListenOptions ssl contained syn keyword ngxListenOptions ssl contained
syn keyword ngxListenOptions http2 contained syn keyword ngxListenOptions http2 contained
syn keyword ngxListenOptions spdy contained syn keyword ngxListenOptions spdy contained
syn keyword ngxListenOptions http3 contained
syn keyword ngxListenOptions quic contained
syn keyword ngxListenOptions proxy_protocol contained syn keyword ngxListenOptions proxy_protocol contained
syn keyword ngxListenOptions setfib contained syn keyword ngxListenOptions setfib contained
syn keyword ngxListenOptions fastopen contained syn keyword ngxListenOptions fastopen contained
@ -265,8 +267,16 @@ syn keyword ngxDirective http2_max_concurrent_streams
syn keyword ngxDirective http2_max_field_size syn keyword ngxDirective http2_max_field_size
syn keyword ngxDirective http2_max_header_size syn keyword ngxDirective http2_max_header_size
syn keyword ngxDirective http2_max_requests syn keyword ngxDirective http2_max_requests
syn keyword ngxDirective http2_push
syn keyword ngxDirective http2_push_preload
syn keyword ngxDirective http2_recv_buffer_size syn keyword ngxDirective http2_recv_buffer_size
syn keyword ngxDirective http2_recv_timeout syn keyword ngxDirective http2_recv_timeout
syn keyword ngxDirective http3_hq
syn keyword ngxDirective http3_max_concurrent_pushes
syn keyword ngxDirective http3_max_concurrent_streams
syn keyword ngxDirective http3_push
syn keyword ngxDirective http3_push_preload
syn keyword ngxDirective http3_stream_buffer_size
syn keyword ngxDirective if_modified_since syn keyword ngxDirective if_modified_since
syn keyword ngxDirective ignore_invalid_headers syn keyword ngxDirective ignore_invalid_headers
syn keyword ngxDirective image_filter syn keyword ngxDirective image_filter
@ -444,6 +454,10 @@ syn keyword ngxDirective proxy_temp_path
syn keyword ngxDirective proxy_timeout syn keyword ngxDirective proxy_timeout
syn keyword ngxDirective proxy_upload_rate syn keyword ngxDirective proxy_upload_rate
syn keyword ngxDirective queue syn keyword ngxDirective queue
syn keyword ngxDirective quic_gso
syn keyword ngxDirective quic_host_key
syn keyword ngxDirective quic_mtu
syn keyword ngxDirective quic_retry
syn keyword ngxDirective random_index syn keyword ngxDirective random_index
syn keyword ngxDirective read_ahead syn keyword ngxDirective read_ahead
syn keyword ngxDirective real_ip_header syn keyword ngxDirective real_ip_header
@ -545,8 +559,10 @@ syn keyword ngxDirective ssl_certificate
syn keyword ngxDirective ssl_certificate_key syn keyword ngxDirective ssl_certificate_key
syn keyword ngxDirective ssl_ciphers syn keyword ngxDirective ssl_ciphers
syn keyword ngxDirective ssl_client_certificate syn keyword ngxDirective ssl_client_certificate
syn keyword ngxDirective ssl_conf_command
syn keyword ngxDirective ssl_crl syn keyword ngxDirective ssl_crl
syn keyword ngxDirective ssl_dhparam syn keyword ngxDirective ssl_dhparam
syn keyword ngxDirective ssl_early_data
syn keyword ngxDirective ssl_ecdh_curve syn keyword ngxDirective ssl_ecdh_curve
syn keyword ngxDirective ssl_engine syn keyword ngxDirective ssl_engine
syn keyword ngxDirective ssl_handshake_timeout syn keyword ngxDirective ssl_handshake_timeout
@ -556,6 +572,7 @@ syn keyword ngxSSLPreferServerCiphersOn on contained
syn keyword ngxSSLPreferServerCiphersOff off contained syn keyword ngxSSLPreferServerCiphersOff off contained
syn keyword ngxDirective ssl_preread syn keyword ngxDirective ssl_preread
syn keyword ngxDirective ssl_protocols nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite syn keyword ngxDirective ssl_protocols nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
syn keyword ngxDirective ssl_reject_handshake
syn match ngxSSLProtocol 'TLSv1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite syn match ngxSSLProtocol 'TLSv1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
syn match ngxSSLProtocol 'TLSv1\.1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite syn match ngxSSLProtocol 'TLSv1\.1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
syn match ngxSSLProtocol 'TLSv1\.2' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite syn match ngxSSLProtocol 'TLSv1\.2' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
@ -622,6 +639,7 @@ syn keyword ngxDirective uwsgi_buffering
syn keyword ngxDirective uwsgi_buffers syn keyword ngxDirective uwsgi_buffers
syn keyword ngxDirective uwsgi_busy_buffers_size syn keyword ngxDirective uwsgi_busy_buffers_size
syn keyword ngxDirective uwsgi_cache syn keyword ngxDirective uwsgi_cache
syn keyword ngxDirective uwsgi_cache_background_update
syn keyword ngxDirective uwsgi_cache_bypass syn keyword ngxDirective uwsgi_cache_bypass
syn keyword ngxDirective uwsgi_cache_key syn keyword ngxDirective uwsgi_cache_key
syn keyword ngxDirective uwsgi_cache_lock syn keyword ngxDirective uwsgi_cache_lock
@ -2225,6 +2243,19 @@ syn keyword ngxDirectiveThirdParty xss_override_status
syn keyword ngxDirectiveThirdParty xss_check_status syn keyword ngxDirectiveThirdParty xss_check_status
syn keyword ngxDirectiveThirdParty xss_input_types syn keyword ngxDirectiveThirdParty xss_input_types
" CT Module <https://github.com/grahamedgecombe/nginx-ct>
" Certificate Transparency module for nginx
syn keyword ngxDirectiveThirdParty ssl_ct
syn keyword ngxDirectiveThirdParty ssl_ct_static_scts
" Dynamic TLS records patch <https://github.com/cloudflare/sslconfig/blob/master/patches/nginx__dynamic_tls_records.patch>
" TLS Dynamic Record Resizing
syn keyword ngxDirectiveThirdParty ssl_dyn_rec_enable
syn keyword ngxDirectiveThirdParty ssl_dyn_rec_size_hi
syn keyword ngxDirectiveThirdParty ssl_dyn_rec_size_lo
syn keyword ngxDirectiveThirdParty ssl_dyn_rec_threshold
syn keyword ngxDirectiveThirdParty ssl_dyn_rec_timeout
" ZIP Module <https://www.nginx.com/resources/wiki/modules/zip/> " ZIP Module <https://www.nginx.com/resources/wiki/modules/zip/>
" ZIP archiver for nginx " ZIP archiver for nginx

View file

@ -117,22 +117,19 @@ There's also a variant for searching and a variant for grepping.
## Coercion ## Coercion
Want to turn `fooBar` into `foo_bar`? Press `crs` (coerce to Want to turn `fooBar` into `foo_bar`? Press `crs` (coerce to
snake\_case). MixedCase (`crm`), camelCase (`crc`), snake\_case snake\_case). MixedCase (`crm`), camelCase (`crc`), UPPER\_CASE (`cru`),
(`crs`), UPPER\_CASE (`cru`), dash-case (`cr-`), dot.case (`cr.`), dash-case (`cr-`), dot.case (`cr.`), space case (`cr<space>`), and
space case (`cr<space>`), and Title Case (`crt`) are all just 3 Title Case (`crt`) are all just 3 keystrokes away.
keystrokes away.
## Installation ## Installation
If you don't have a preferred installation method, I recommend Install using your favorite package manager, or use Vim's built-in package
installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and support:
then simply copy and paste:
cd ~/.vim/bundle mkdir -p ~/.vim/pack/tpope/start
git clone git://github.com/tpope/vim-abolish.git cd ~/.vim/pack/tpope/start
git clone https://tpope.io/vim/abolish.git
Once help tags have been generated, you can view the manual with vim -u NONE -c "helptags abolish/doc" -c q
`:help abolish`.
## Self-Promotion ## Self-Promotion

View file

@ -150,16 +150,15 @@ using the cr mapping (mnemonic: CoeRce) followed by one of the following
characters: characters:
c: camelCase c: camelCase
m: MixedCase p: PascalCase
m: MixedCase (aka PascalCase)
_: snake_case _: snake_case
s: snake_case s: snake_case
u: SNAKE_UPPERCASE u: SNAKE_UPPERCASE
U: SNAKE_UPPERCASE U: SNAKE_UPPERCASE
-: dash-case (not usually reversible; see |abolish-coercion-reversible|)
k: kebab-case (not usually reversible; see |abolish-coercion-reversible|) k: kebab-case (not usually reversible; see |abolish-coercion-reversible|)
-: dash-case (aka kebab-case)
.: dot.case (not usually reversible; see |abolish-coercion-reversible|) .: dot.case (not usually reversible; see |abolish-coercion-reversible|)
<space>: space case (not usually reversible; see |abolish-coercion-reversible|)
t: Title Case (not usually reversible; see |abolish-coercion-reversible|)
For example, cru on a lowercase word is a slightly easier to type equivalent For example, cru on a lowercase word is a slightly easier to type equivalent
to gUiw. to gUiw.

View file

@ -1,6 +1,6 @@
" abolish.vim - Language friendly searches, substitutions, and abbreviations " abolish.vim - Language friendly searches, substitutions, and abbreviations
" Maintainer: Tim Pope <http://tpo.pe/> " Maintainer: Tim Pope <http://tpo.pe/>
" Version: 1.1 " Version: 1.2
" GetLatestVimScripts: 1545 1 :AutoInstall: abolish.vim " GetLatestVimScripts: 1545 1 :AutoInstall: abolish.vim
" Initialization {{{1 " Initialization {{{1
@ -23,8 +23,8 @@ endif
" }}}1 " }}}1
" Utility functions {{{1 " Utility functions {{{1
function! s:function(name) function! s:function(name) abort
return function(substitute(a:name,'^s:',matchstr(expand('<sfile>'), '<SNR>\d\+_'),'')) return function(substitute(a:name,'^s:',matchstr(expand('<sfile>'), '.*\zs<SNR>\d\+_'),''))
endfunction endfunction
function! s:send(self,func,...) function! s:send(self,func,...)
@ -565,6 +565,7 @@ endfunction
call extend(Abolish.Coercions, { call extend(Abolish.Coercions, {
\ 'c': Abolish.camelcase, \ 'c': Abolish.camelcase,
\ 'm': Abolish.mixedcase, \ 'm': Abolish.mixedcase,
\ 'p': Abolish.mixedcase,
\ 's': Abolish.snakecase, \ 's': Abolish.snakecase,
\ '_': Abolish.snakecase, \ '_': Abolish.snakecase,
\ 'u': Abolish.uppercase, \ 'u': Abolish.uppercase,
@ -619,7 +620,7 @@ endfunction
nnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar())) nnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar()))
vnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar())) vnoremap <expr> <Plug>(abolish-coerce) <SID>coerce(nr2char(getchar()))
nnoremap <expr> <plug>(abolish-coerce-word) <SID>coerce(nr2char(getchar())).'iw' nnoremap <expr> <Plug>(abolish-coerce-word) <SID>coerce(nr2char(getchar())).'iw'
" }}}1 " }}}1

View file

@ -49,6 +49,12 @@ the `<F7>` key if so. For example, to remap it to `<F3>` instead, use:
autocmd FileType python map <buffer> <F3> :call flake8#Flake8()<CR> autocmd FileType python map <buffer> <F3> :call flake8#Flake8()<CR>
Since the `autocmd` order is not specified in Vim, the previous
recommendation is sometimes not sufficient to "unmap" `<F7>`. In such a
case, being more explicit about it should help (see `:h no_mail_maps`):
let g:no_flake8_maps = 1
For flake8 configuration options please consult the following page: For flake8 configuration options please consult the following page:
http://flake8.pycqa.org/en/latest/user/configuration.html http://flake8.pycqa.org/en/latest/user/configuration.html

View file

@ -142,14 +142,22 @@ function! s:Mods(mods, ...) abort
let mods = substitute(a:mods, '\C<mods>', '', '') let mods = substitute(a:mods, '\C<mods>', '', '')
let mods = mods =~# '\S$' ? mods . ' ' : mods let mods = mods =~# '\S$' ? mods . ' ' : mods
if a:0 && mods !~# '\<\%(aboveleft\|belowright\|leftabove\|rightbelow\|topleft\|botright\|tab\)\>' if a:0 && mods !~# '\<\%(aboveleft\|belowright\|leftabove\|rightbelow\|topleft\|botright\|tab\)\>'
if a:1 ==# 'Edge' let default = a:1
if default ==# 'SpanOrigin'
if s:OriginBufnr() > 0 && (mods =~# '\<vertical\>' ? &winfixheight : &winfixwidth)
let default = 'Edge'
else
let default = ''
endif
endif
if default ==# 'Edge'
if mods =~# '\<vertical\>' ? &splitright : &splitbelow if mods =~# '\<vertical\>' ? &splitright : &splitbelow
let mods = 'botright ' . mods let mods = 'botright ' . mods
else else
let mods = 'topleft ' . mods let mods = 'topleft ' . mods
endif endif
else else
let mods = a:1 . ' ' . mods let mods = default . ' ' . mods
endif endif
endif endif
return substitute(mods, '\s\+', ' ', 'g') return substitute(mods, '\s\+', ' ', 'g')
@ -157,7 +165,7 @@ endfunction
if exists('+shellslash') if exists('+shellslash')
let s:dir_commit_file = '\c^fugitive://\%(/[^/]\@=\)\=\(.\{-1,\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/.*\)\=\)\=$' let s:dir_commit_file = '\c^fugitive://\%(/[^/]\@=\)\=\([^?#]\{-1,\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/[^?#]*\)\=\)\=$'
function! s:Slash(path) abort function! s:Slash(path) abort
return tr(a:path, '\', '/') return tr(a:path, '\', '/')
@ -169,7 +177,7 @@ if exists('+shellslash')
else else
let s:dir_commit_file = '\c^fugitive://\(.\{-\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/.*\)\=\)\=$' let s:dir_commit_file = '\c^fugitive://\([^?#]\{-\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/[^?#]*\)\=\)\=$'
function! s:Slash(path) abort function! s:Slash(path) abort
return a:path return a:path
@ -275,8 +283,9 @@ endfunction
function! s:Map(mode, lhs, rhs, ...) abort function! s:Map(mode, lhs, rhs, ...) abort
let maps = [] let maps = []
let defer = a:0 && a:1 =~# '<unique>' || get(g:, 'fugitive_defer_to_existing_maps') let flags = a:0 && type(a:1) == type('') ? a:1 : ''
let flags = substitute(a:0 ? a:1 : '', '<unique>', '', '') . (a:rhs =~# '<Plug>' ? '' : '<script>') . '<nowait>' let defer = flags =~# '<unique>'
let flags = substitute(flags, '<unique>', '', '') . (a:rhs =~# '<Plug>' ? '' : '<script>') . '<nowait>'
for mode in split(a:mode, '\zs') for mode in split(a:mode, '\zs')
if a:0 <= 1 if a:0 <= 1
call add(maps, mode.'map <buffer>' . substitute(flags, '<unique>', '', '') . ' <Plug>fugitive:' . a:lhs . ' ' . a:rhs) call add(maps, mode.'map <buffer>' . substitute(flags, '<unique>', '', '') . ' <Plug>fugitive:' . a:lhs . ' ' . a:rhs)
@ -1018,7 +1027,7 @@ function! fugitive#Head(...) abort
if empty(dir) if empty(dir)
return '' return ''
endif endif
let file = FugitiveActualDir() . '/HEAD' let file = FugitiveActualDir(dir) . '/HEAD'
let ftime = getftime(file) let ftime = getftime(file)
if ftime == -1 if ftime == -1
return '' return ''
@ -2573,13 +2582,6 @@ function! s:ReplaceCmd(cmd) abort
endif endif
endfunction endfunction
function! s:QueryLog(refspec, limit) abort
let lines = s:LinesError(['log', '-n', '' . a:limit, '--pretty=format:%h%x09%s'] + a:refspec + ['--'])[0]
call map(lines, 'split(v:val, "\t", 1)')
call map(lines, '{"type": "Log", "commit": v:val[0], "subject": join(v:val[1 : -1], "\t")}')
return lines
endfunction
function! s:FormatLog(dict) abort function! s:FormatLog(dict) abort
return a:dict.commit . ' ' . a:dict.subject return a:dict.commit . ' ' . a:dict.subject
endfunction endfunction
@ -2624,18 +2626,31 @@ function! s:AddSection(label, lines, ...) abort
call append(line('$'), ['', a:label . (len(note) ? ': ' . note : ' (' . len(a:lines) . ')')] + s:Format(a:lines)) call append(line('$'), ['', a:label . (len(note) ? ': ' . note : ' (' . len(a:lines) . ')')] + s:Format(a:lines))
endfunction endfunction
function! s:AddLogSection(label, refspec) abort function! s:QueryLog(refspec, limit) abort
let limit = 256 let [log, exec_error] = s:LinesError(['log', '-n', '' . a:limit, '--pretty=format:%h%x09%s'] + a:refspec + ['--'])
let log = s:QueryLog(a:refspec, limit) call map(log, 'split(v:val, "\t", 1)')
if empty(log) call map(log, '{"type": "Log", "commit": v:val[0], "subject": join(v:val[1 : -1], "\t")}')
return let result = {'error': exec_error ? 1 : 0, 'overflow': 0, 'entries': log}
elseif len(log) == limit if len(log) == a:limit
call remove(log, -1) call remove(log, -1)
let label = a:label . ' (' . (limit - 1). '+)' let result.overflow = 1
else
let label = a:label . ' (' . len(log) . ')'
endif endif
call append(line('$'), ['', label] + s:Format(log)) return result
endfunction
function! s:QueryLogRange(old, new) abort
if empty(a:old) || empty(a:new)
return {'error': 2, 'overflow': 0, 'entries': []}
endif
return s:QueryLog([a:old . '..' . a:new], 256)
endfunction
function! s:AddLogSection(label, log) abort
if empty(a:log.entries)
return
endif
let label = a:label . ' (' . len(a:log.entries) . (a:log.overflow ? '+' : '') . ')'
call append(line('$'), ['', label] + s:Format(a:log.entries))
endfunction endfunction
let s:rebase_abbrevs = { let s:rebase_abbrevs = {
@ -2673,7 +2688,6 @@ function! fugitive#BufReadStatus(...) abort
let [staged, unstaged, untracked] = [[], [], []] let [staged, unstaged, untracked] = [[], [], []]
let props = {} let props = {}
let pull = ''
if empty(s:Tree()) if empty(s:Tree())
let branch = FugitiveHead(0) let branch = FugitiveHead(0)
let head = FugitiveHead(11) let head = FugitiveHead(11)
@ -2725,7 +2739,6 @@ function! fugitive#BufReadStatus(...) abort
else else
let head = FugitiveHead(11) let head = FugitiveHead(11)
endif endif
let pull = get(props, 'branch.upstream', '')
else " git < 2.11 else " git < 2.11
let cmd += ['status', '--porcelain', '-bz'] let cmd += ['status', '--porcelain', '-bz']
let [output, message, exec_error] = s:NullError(cmd) let [output, message, exec_error] = s:NullError(cmd)
@ -2738,7 +2751,7 @@ function! fugitive#BufReadStatus(...) abort
endwhile endwhile
let head = matchstr(output[0], '^## \zs\S\+\ze\%($\| \[\)') let head = matchstr(output[0], '^## \zs\S\+\ze\%($\| \[\)')
if head =~# '\.\.\.' if head =~# '\.\.\.'
let [head, pull] = split(head, '\.\.\.') let head = split(head, '\.\.\.')[0]
let branch = head let branch = head
elseif head ==# 'HEAD' || empty(head) elseif head ==# 'HEAD' || empty(head)
let head = FugitiveHead(11) let head = FugitiveHead(11)
@ -2790,8 +2803,25 @@ function! fugitive#BufReadStatus(...) abort
let b:fugitive_files['Unstaged'][dict.filename] = dict let b:fugitive_files['Unstaged'][dict.filename] = dict
endfor endfor
let fetch_remote = config.Get('branch.' . branch . '.remote', 'origin')
let push_remote = config.Get('branch.' . branch . '.pushRemote',
\ config.Get('remote.pushDefault', fetch_remote))
if fetch_remote !=# '.' && empty(config.Get('remote.' . fetch_remote . '.fetch'))
let fetch_remote = ''
endif
if push_remote !=# '.' && empty(config.Get('remote.' . push_remote . '.push', config.Get('remote.' . push_remote . '.fetch')))
let push_remote = ''
endif
let pull_type = 'Pull' let pull_type = 'Pull'
if len(pull) if empty(fetch_remote) || empty(branch)
let pull_ref = ''
elseif fetch_remote ==# '.'
let pull_ref = config.Get('branch.' . branch . '.merge', 'refs/heads/' . branch)
else
let pull_ref = substitute(config.Get('branch.' . branch . '.merge', 'refs/heads/' . branch), '^refs/heads/', 'refs/remotes/' . fetch_remote . '/', '')
endif
if len(pull_ref)
let rebase = FugitiveConfigGet('branch.' . branch . '.rebase', config) let rebase = FugitiveConfigGet('branch.' . branch . '.rebase', config)
if empty(rebase) if empty(rebase)
let rebase = FugitiveConfigGet('pull.rebase', config) let rebase = FugitiveConfigGet('pull.rebase', config)
@ -2803,28 +2833,23 @@ function! fugitive#BufReadStatus(...) abort
endif endif
endif endif
let push_remote = FugitiveConfigGet('branch.' . branch . '.pushRemote', config)
if empty(push_remote)
let push_remote = FugitiveConfigGet('remote.pushDefault', config)
endif
let fetch_remote = FugitiveConfigGet('branch.' . branch . '.remote', config)
if empty(fetch_remote)
let fetch_remote = 'origin'
endif
if empty(push_remote)
let push_remote = fetch_remote
endif
let push_default = FugitiveConfigGet('push.default', config) let push_default = FugitiveConfigGet('push.default', config)
if empty(push_default) if empty(push_default)
let push_default = fugitive#GitVersion(2) ? 'simple' : 'matching' let push_default = fugitive#GitVersion(2) ? 'simple' : 'matching'
endif endif
if push_default ==# 'upstream' if push_default ==# 'upstream'
let push = pull let push_ref = pull_ref
elseif empty(push_remote) || empty(branch)
let push_ref = ''
elseif push_remote ==# '.'
let push_ref = 'refs/heads/' . branch
else else
let push = len(branch) ? (push_remote ==# '.' ? '' : push_remote . '/') . branch : '' let push_ref = 'refs/remotes/' . push_remote . '/' . branch
endif endif
let push_short = substitute(push_ref, '^refs/\w\+/', '', '')
let pull_short = substitute(pull_ref, '^refs/\w\+/', '', '')
if isdirectory(fugitive#Find('.git/rebase-merge/')) if isdirectory(fugitive#Find('.git/rebase-merge/'))
let rebasing_dir = fugitive#Find('.git/rebase-merge/') let rebasing_dir = fugitive#Find('.git/rebase-merge/')
elseif isdirectory(fugitive#Find('.git/rebase-apply/')) elseif isdirectory(fugitive#Find('.git/rebase-apply/'))
@ -2869,9 +2894,9 @@ function! fugitive#BufReadStatus(...) abort
silent keepjumps %delete_ silent keepjumps %delete_
call s:AddHeader('Head', head) call s:AddHeader('Head', head)
call s:AddHeader(pull_type, pull) call s:AddHeader(pull_type, pull_short)
if push !=# pull if push_ref !=# pull_ref
call s:AddHeader('Push', push) call s:AddHeader('Push', push_short)
endif endif
if empty(s:Tree()) if empty(s:Tree())
if get(fugitive#ConfigGetAll('core.bare', config), 0, '') !~# '^\%(false\|no|off\|0\|\)$' if get(fugitive#ConfigGetAll('core.bare', config), 0, '') !~# '^\%(false\|no|off\|0\|\)$'
@ -2891,20 +2916,27 @@ function! fugitive#BufReadStatus(...) abort
call s:AddSection('Staged', staged) call s:AddSection('Staged', staged)
let staged_end = len(staged) ? line('$') : 0 let staged_end = len(staged) ? line('$') : 0
if len(push) && !(push ==# pull && get(props, 'branch.ab') =~# '^+0 ') let unique_push_ref = push_ref ==# pull_ref ? '' : push_ref
call s:AddLogSection('Unpushed to ' . push, [push . '..' . head]) let unpushed_push = s:QueryLogRange(unique_push_ref, head)
if get(props, 'branch.ab') =~# '^+0 '
let unpushed_pull = {'error': 0, 'overflow': 0, 'entries': []}
else
let unpushed_pull = s:QueryLogRange(pull_ref, head)
endif endif
if len(pull) && push !=# pull " If the push ref is defined but nowhere to be found at the remote,
call s:AddLogSection('Unpushed to ' . pull, [pull . '..' . head]) " pretend it's the same as the pull ref
if unpushed_push.error == 1
let unpushed_push = unpushed_pull
endif endif
if empty(pull) && empty(push) && empty(rebasing) call s:AddLogSection('Unpushed to ' . push_short, unpushed_push)
call s:AddLogSection('Unpushed to *', [head, '--not', '--remotes']) call s:AddLogSection('Unpushed to ' . pull_short, unpushed_pull)
if unpushed_push.error && unpushed_pull.error && empty(rebasing) &&
\ !empty(push_remote . fetch_remote)
call s:AddLogSection('Unpushed to *', s:QueryLog([head, '--not', '--remotes'], 256))
endif endif
if len(push) && push !=# pull call s:AddLogSection('Unpulled from ' . push_short, s:QueryLogRange(head, unique_push_ref))
call s:AddLogSection('Unpulled from ' . push, [head . '..' . push]) if len(pull_ref) && get(props, 'branch.ab') !~# ' -0$'
endif call s:AddLogSection('Unpulled from ' . pull_short, s:QueryLogRange(head, pull_ref))
if len(pull) && get(props, 'branch.ab') !~# ' -0$'
call s:AddLogSection('Unpulled from ' . pull, [head . '..' . pull])
endif endif
setlocal nomodified readonly noswapfile setlocal nomodified readonly noswapfile
@ -3293,6 +3325,11 @@ function! s:TempDelete(file) abort
return '' return ''
endfunction endfunction
function! s:OriginBufnr(...) abort
let state = s:TempState(a:0 ? a:1 : bufnr(''))
return get(state, 'origin_bufnr', -1)
endfunction
augroup fugitive_temp augroup fugitive_temp
autocmd! autocmd!
autocmd BufReadPre * exe s:TempReadPre( +expand('<abuf>')) autocmd BufReadPre * exe s:TempReadPre( +expand('<abuf>'))
@ -3345,7 +3382,8 @@ function! s:RunEdit(state, tmp, job) abort
let noequalalways = 1 let noequalalways = 1
setglobal equalalways setglobal equalalways
endif endif
exe substitute(a:state.mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file) let mods = s:Mods(a:state.mods, 'SpanOrigin')
exe substitute(mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
finally finally
if exists('l:noequalalways') if exists('l:noequalalways')
setglobal noequalalways setglobal noequalalways
@ -3802,13 +3840,13 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg, ...) abort
let stream = exists('*setbufline') let stream = exists('*setbufline')
let do_edit = substitute(s:Mods(a:mods, 'Edge'), '\<tab\>', '-tab', 'g') . 'pedit!' let do_edit = substitute(s:Mods(a:mods, 'Edge'), '\<tab\>', '-tab', 'g') . 'pedit!'
elseif pager elseif pager
let allow_pty = 0 let allow_pty = get(args, 0, '') is# 'shortlog'
if pager is# 2 && a:bang && a:line2 >= 0 if pager is# 2 && a:bang && a:line2 >= 0
let [do_edit, after_edit] = s:ReadPrepare(a:line1, a:line2, a:range, a:mods) let [do_edit, after_edit] = s:ReadPrepare(a:line1, a:line2, a:range, a:mods)
elseif pager is# 2 && a:bang elseif pager is# 2 && a:bang
let do_edit = s:Mods(a:mods) . 'pedit' let do_edit = s:Mods(a:mods, 'SpanOrigin') . 'pedit'
elseif !curwin elseif !curwin
let do_edit = s:Mods(a:mods) . 'split' let do_edit = s:Mods(a:mods, 'SpanOrigin') . 'split'
else else
let do_edit = s:Mods(a:mods) . 'edit' let do_edit = s:Mods(a:mods) . 'edit'
call s:BlurStatus() call s:BlurStatus()
@ -4214,7 +4252,9 @@ function! s:DoAutocmdChanged(dir) abort
finally finally
unlet! g:fugitive_event g:fugitive_result unlet! g:fugitive_event g:fugitive_result
" Force statusline reload with the buffer's Git dir " Force statusline reload with the buffer's Git dir
let &l:ro = &l:ro if dir isnot# FugitiveGitDir()
let &l:ro = &l:ro
endif
endtry endtry
return '' return ''
endfunction endfunction
@ -6131,15 +6171,15 @@ function! fugitive#Open(cmd, bang, mods, arg, ...) abort
return 'echoerr ' . string(':G' . a:cmd . '! for temp buffer output has been replaced by :' . get(s:bang_edits, a:cmd, 'Git') . ' --paginate') return 'echoerr ' . string(':G' . a:cmd . '! for temp buffer output has been replaced by :' . get(s:bang_edits, a:cmd, 'Git') . ' --paginate')
endif endif
let mods = s:Mods(a:mods)
if a:cmd ==# 'edit'
call s:BlurStatus()
endif
try try
let [file, pre] = s:OpenParse(a:arg, 1, 0) let [file, pre] = s:OpenParse(a:arg, 1, 0)
catch /^fugitive:/ catch /^fugitive:/
return 'echoerr ' . string(v:exception) return 'echoerr ' . string(v:exception)
endtry endtry
let mods = s:Mods(a:mods)
if a:cmd ==# 'edit'
call s:BlurStatus()
endif
return mods . a:cmd . pre . ' ' . s:fnameescape(file) return mods . a:cmd . pre . ' ' . s:fnameescape(file)
endfunction endfunction
@ -6765,8 +6805,12 @@ function! s:BlameCommitFileLnum(...) abort
endfunction endfunction
function! s:BlameLeave() abort function! s:BlameLeave() abort
let bufwinnr = bufwinnr(s:BlameBufnr()) let state = s:TempState()
if bufwinnr > 0 let bufwinnr = exists('*win_id2win') ? win_id2win(get(state, 'origin_winid')) : 0
if bufwinnr == 0
let bufwinnr = bufwinnr(get(state, 'origin_bufnr', -1))
endif
if get(state, 'filetype', '') ==# 'fugitiveblame' && bufwinnr > 0
let bufnr = bufnr('') let bufnr = bufnr('')
exe bufwinnr . 'wincmd w' exe bufwinnr . 'wincmd w'
return bufnr . 'bdelete' return bufnr . 'bdelete'
@ -6959,8 +7003,10 @@ function! s:BlameSubcommand(line1, count, range, bang, mods, options) abort
if a:mods =~# '\<tab\>' if a:mods =~# '\<tab\>'
silent tabedit % silent tabedit %
endif endif
let bufnr = bufnr('') let temp_state.origin_bufnr = bufnr('')
let temp_state.origin_bufnr = bufnr if exists('*win_getid')
let temp_state.origin_winid = win_getid()
endif
let restore = [] let restore = []
let mods = substitute(a:mods, '\<tab\>', '', 'g') let mods = substitute(a:mods, '\<tab\>', '', 'g')
for winnr in range(winnr('$'),1,-1) for winnr in range(winnr('$'),1,-1)
@ -6973,11 +7019,11 @@ function! s:BlameSubcommand(line1, count, range, bang, mods, options) abort
endif endif
endif endif
let win_blame_bufnr = s:BlameBufnr(winbufnr(winnr)) let win_blame_bufnr = s:BlameBufnr(winbufnr(winnr))
if getwinvar(winnr, '&scrollbind') ? win_blame_bufnr == bufnr : win_blame_bufnr > 0 if getwinvar(winnr, '&scrollbind') ? win_blame_bufnr == temp_state.origin_bufnr : win_blame_bufnr > 0
execute winbufnr(winnr).'bdelete' execute winbufnr(winnr).'bdelete'
endif endif
endfor endfor
let restore_winnr = exists('*win_getid') ? win_getid() : 'bufwinnr(' . bufnr . ')' let restore_winnr = get(temp_state, 'origin_winid', 'bufwinnr(' . temp_state.origin_bufnr . ')')
if !&l:scrollbind if !&l:scrollbind
call add(restore, 'call setwinvar(' . restore_winnr . ',"&scrollbind",0)') call add(restore, 'call setwinvar(' . restore_winnr . ',"&scrollbind",0)')
endif endif
@ -7156,6 +7202,9 @@ function! fugitive#BlameSyntax() abort
return return
endif endif
let seen = {} let seen = {}
for x in split('01234567890abcdef', '\zs')
exe 'syn match FugitiveblameHashGroup'.x '"\%(^\^\=[*?]*\)\@<='.x.'\x\{5,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite'
endfor
for lnum in range(1, line('$')) for lnum in range(1, line('$'))
let orig_hash = matchstr(getline(lnum), '^\^\=[*?]*\zs\x\{6\}') let orig_hash = matchstr(getline(lnum), '^\^\=[*?]*\zs\x\{6\}')
let hash = orig_hash let hash = orig_hash
@ -7177,8 +7226,8 @@ function! fugitive#BlameSyntax() abort
else else
let s:hash_colors[hash] = '' let s:hash_colors[hash] = ''
endif endif
let pattern = substitute(orig_hash, '^\(\x\)\x\(\x\)\x\(\x\)\x$', '\1\\x\2\\x\3\\x', '') . '*\>' let pattern = substitute(orig_hash, '^\(\x\)\x\(\x\)\x\(\x\)\x$', '\1\\x\2\\x\3\\x', '') . '*'
exe 'syn match FugitiveblameHash'.hash.' "\%(^\^\=[*?]*\)\@<='.pattern.'" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite' exe 'syn match FugitiveblameHash'.hash.' "\%(^\^\=[*?]*\)\@<='.pattern.'" contained containedin=FugitiveblameHashGroup' . orig_hash[0]
endfor endfor
syn match FugitiveblameUncommitted "\%(^\^\=[?*]*\)\@<=\<0\{7,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalLineNumber,FugitiveblameOriginalFile skipwhite syn match FugitiveblameUncommitted "\%(^\^\=[?*]*\)\@<=\<0\{7,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalLineNumber,FugitiveblameOriginalFile skipwhite
call s:BlameRehighlight() call s:BlameRehighlight()
@ -7196,6 +7245,7 @@ endfunction
function! s:BlameMaps(is_ftplugin) abort function! s:BlameMaps(is_ftplugin) abort
let ft = a:is_ftplugin let ft = a:is_ftplugin
call s:MapGitOps(ft)
call s:Map('n', '<F1>', ':help :Git_blame<CR>', '<silent>', ft) call s:Map('n', '<F1>', ':help :Git_blame<CR>', '<silent>', ft)
call s:Map('n', 'g?', ':help :Git_blame<CR>', '<silent>', ft) call s:Map('n', 'g?', ':help :Git_blame<CR>', '<silent>', ft)
call s:Map('n', 'gq', ':exe <SID>BlameQuit()<CR>', '<silent>', ft) call s:Map('n', 'gq', ':exe <SID>BlameQuit()<CR>', '<silent>', ft)
@ -7329,11 +7379,12 @@ function! fugitive#BrowseCommand(line1, count, range, bang, mods, arg, ...) abor
endfor endfor
return 'echoerr ' . string('fugitive: no URL found in output of :Git') return 'echoerr ' . string('fugitive: no URL found in output of :Git')
endif endif
exe s:DirCheck(dir) if empty(remote) && expanded =~# '^[^-./:^~][^:^~]*$' && !empty(dir)
let config = fugitive#Config(dir) let config = fugitive#Config(dir)
if empty(remote) && expanded =~# '^[^-./:^~][^:^~]*$' && !empty(FugitiveConfigGet('remote.' . expanded . '.url', config)) if !empty(FugitiveConfigGet('remote.' . expanded . '.url', config))
let remote = expanded let remote = expanded
let expanded = '' let expanded = ''
endif
endif endif
if empty(expanded) if empty(expanded)
let bufname = &buftype =~# '^\%(nofile\|terminal\)$' ? '' : s:BufName('%') let bufname = &buftype =~# '^\%(nofile\|terminal\)$' ? '' : s:BufName('%')
@ -7369,17 +7420,22 @@ function! fugitive#BrowseCommand(line1, count, range, bang, mods, arg, ...) abor
endif endif
endif endif
let path = path[1:-1] let path = path[1:-1]
elseif empty(s:Tree(dir)) elseif !empty(s:Tree(dir))
let path = '.git/' . full[strlen(dir)+1:-1] let relevant_dir = FugitiveExtractGitDir(full)
let type = '' if !empty(relevant_dir)
else let dir = relevant_dir
let path = fugitive#Path(full, '/')[1:-1] endif
let path = fugitive#Path(full, '/', dir)[1:-1]
if empty(path) || isdirectory(full) if empty(path) || isdirectory(full)
let type = 'tree' let type = 'tree'
else else
let type = 'blob' let type = 'blob'
endif endif
else
let path = '.git/' . full[strlen(dir)+1:-1]
let type = ''
endif endif
exe s:DirCheck(dir)
if path =~# '^\.git/' if path =~# '^\.git/'
let ref = matchstr(path, '^.git/\zs\%(refs/[^/]\+/[^/].*\|\w*HEAD\)$') let ref = matchstr(path, '^.git/\zs\%(refs/[^/]\+/[^/].*\|\w*HEAD\)$')
let type = empty(ref) ? 'root': 'ref' let type = empty(ref) ? 'root': 'ref'
@ -7397,6 +7453,9 @@ function! fugitive#BrowseCommand(line1, count, range, bang, mods, arg, ...) abor
endif endif
endif endif
if !exists('l:config') || s:Dir(config) !=# dir
let config = fugitive#Config(dir)
endif
let merge = '' let merge = ''
if !empty(remote) && ref =~# '^refs/remotes/[^/]\+/[^/]\|^refs/heads/[^/]' if !empty(remote) && ref =~# '^refs/remotes/[^/]\+/[^/]\|^refs/heads/[^/]'
let merge = matchstr(ref, '^refs/\%(heads/\|remotes/[^/]\+/\)\zs.\+') let merge = matchstr(ref, '^refs/\%(heads/\|remotes/[^/]\+/\)\zs.\+')
@ -7521,13 +7580,17 @@ function! fugitive#BrowseCommand(line1, count, range, bang, mods, arg, ...) abor
endif endif
endfor endfor
throw "fugitive: no GBrowse handler installed for '".raw."'" if !empty(remote_url)
return 'echoerr ' . string("fugitive: no GBrowse handler installed for '".remote_url."'")
else
return 'echoerr ' . string("fugitive: could not find remote named '".remote."'")
endif
catch /^fugitive:/ catch /^fugitive:/
return 'echoerr ' . string(v:exception) return 'echoerr ' . string(v:exception)
endtry endtry
endfunction endfunction
" Section: Go to file " Section: Maps
let s:ref_header = '\%(Merge\|Rebase\|Upstream\|Pull\|Push\)' let s:ref_header = '\%(Merge\|Rebase\|Upstream\|Pull\|Push\)'
@ -7585,7 +7648,10 @@ function! s:NavigateUp(count) abort
endfunction endfunction
function! s:ParseDiffHeader(str) abort function! s:ParseDiffHeader(str) abort
let list = matchlist(a:str, '\Cdiff --git \("\=[^/].*\|/dev/null\) \("\=[^/].*\|/dev/null\)$') let list = matchlist(a:str, '\Cdiff --git \("\=\w/.*\|/dev/null\) \("\=\w/.*\|/dev/null\)$')
if empty(list)
let list = matchlist(a:str, '\Cdiff --git \("\=[^/].*\|/dev/null\) \("\=[^/].*\|/dev/null\)$')
endif
return [fugitive#Unquote(get(list, 1, '')), fugitive#Unquote(get(list, 2, ''))] return [fugitive#Unquote(get(list, 1, '')), fugitive#Unquote(get(list, 2, ''))]
endfunction endfunction
@ -7617,6 +7683,81 @@ function! s:MapMotion(lhs, rhs) abort
return join(maps, '|') return join(maps, '|')
endfunction endfunction
function! s:MapGitOps(is_ftplugin) abort
let ft = a:is_ftplugin
if &modifiable
return ''
endif
exe s:Map('n', 'c<Space>', ':Git commit<Space>', '', ft)
exe s:Map('n', 'c<CR>', ':Git commit<CR>', '', ft)
exe s:Map('n', 'cv<Space>', ':tab Git commit -v<Space>', '', ft)
exe s:Map('n', 'cv<CR>', ':tab Git commit -v<CR>', '', ft)
exe s:Map('n', 'ca', ':<C-U>Git commit --amend<CR>', '<silent>', ft)
exe s:Map('n', 'cc', ':<C-U>Git commit<CR>', '<silent>', ft)
exe s:Map('n', 'ce', ':<C-U>Git commit --amend --no-edit<CR>', '<silent>', ft)
exe s:Map('n', 'cw', ':<C-U>Git commit --amend --only<CR>', '<silent>', ft)
exe s:Map('n', 'cva', ':<C-U>tab Git commit -v --amend<CR>', '<silent>', ft)
exe s:Map('n', 'cvc', ':<C-U>tab Git commit -v<CR>', '<silent>', ft)
exe s:Map('n', 'cRa', ':<C-U>Git commit --reset-author --amend<CR>', '<silent>', ft)
exe s:Map('n', 'cRe', ':<C-U>Git commit --reset-author --amend --no-edit<CR>', '<silent>', ft)
exe s:Map('n', 'cRw', ':<C-U>Git commit --reset-author --amend --only<CR>', '<silent>', ft)
exe s:Map('n', 'cf', ':<C-U>Git commit --fixup=<C-R>=<SID>SquashArgument()<CR>', '', ft)
exe s:Map('n', 'cF', ':<C-U><Bar>Git -c sequence.editor=true rebase --interactive --autosquash<C-R>=<SID>RebaseArgument()<CR><Home>Git commit --fixup=<C-R>=<SID>SquashArgument()<CR>', '', ft)
exe s:Map('n', 'cs', ':<C-U>Git commit --no-edit --squash=<C-R>=<SID>SquashArgument()<CR>', '', ft)
exe s:Map('n', 'cS', ':<C-U><Bar>Git -c sequence.editor=true rebase --interactive --autosquash<C-R>=<SID>RebaseArgument()<CR><Home>Git commit --no-edit --squash=<C-R>=<SID>SquashArgument()<CR>', '', ft)
exe s:Map('n', 'cA', ':<C-U>Git commit --edit --squash=<C-R>=<SID>SquashArgument()<CR>', '', ft)
exe s:Map('n', 'c?', ':<C-U>help fugitive_c<CR>', '<silent>', ft)
exe s:Map('n', 'cr<Space>', ':Git revert<Space>', '', ft)
exe s:Map('n', 'cr<CR>', ':Git revert<CR>', '', ft)
exe s:Map('n', 'crc', ':<C-U>Git revert <C-R>=<SID>SquashArgument()<CR><CR>', '<silent>', ft)
exe s:Map('n', 'crn', ':<C-U>Git revert --no-commit <C-R>=<SID>SquashArgument()<CR><CR>', '<silent>', ft)
exe s:Map('n', 'cr?', ':<C-U>help fugitive_cr<CR>', '<silent>', ft)
exe s:Map('n', 'cm<Space>', ':Git merge<Space>', '', ft)
exe s:Map('n', 'cm<CR>', ':Git merge<CR>', '', ft)
exe s:Map('n', 'cmt', ':Git mergetool', '', ft)
exe s:Map('n', 'cm?', ':<C-U>help fugitive_cm<CR>', '<silent>', ft)
exe s:Map('n', 'cz<Space>', ':Git stash<Space>', '', ft)
exe s:Map('n', 'cz<CR>', ':Git stash<CR>', '', ft)
exe s:Map('n', 'cza', ':<C-U>Git stash apply --quiet --index stash@{<C-R>=v:count<CR>}<CR>', '', ft)
exe s:Map('n', 'czA', ':<C-U>Git stash apply --quiet stash@{<C-R>=v:count<CR>}<CR>', '', ft)
exe s:Map('n', 'czp', ':<C-U>Git stash pop --quiet --index stash@{<C-R>=v:count<CR>}<CR>', '', ft)
exe s:Map('n', 'czP', ':<C-U>Git stash pop --quiet stash@{<C-R>=v:count<CR>}<CR>', '', ft)
exe s:Map('n', 'czs', ':<C-U>Git stash push --staged<CR>', '', ft)
exe s:Map('n', 'czv', ':<C-U>exe "Gedit" fugitive#RevParse("stash@{" . v:count . "}")<CR>', '<silent>', ft)
exe s:Map('n', 'czw', ':<C-U>Git stash push --keep-index<C-R>=v:count > 1 ? " --all" : v:count ? " --include-untracked" : ""<CR><CR>', '', ft)
exe s:Map('n', 'czz', ':<C-U>Git stash push <C-R>=v:count > 1 ? " --all" : v:count ? " --include-untracked" : ""<CR><CR>', '', ft)
exe s:Map('n', 'cz?', ':<C-U>help fugitive_cz<CR>', '<silent>', ft)
exe s:Map('n', 'co<Space>', ':Git checkout<Space>', '', ft)
exe s:Map('n', 'co<CR>', ':Git checkout<CR>', '', ft)
exe s:Map('n', 'coo', ':<C-U>Git checkout <C-R>=substitute(<SID>SquashArgument(),"^$",get(<SID>TempState(),"filetype","") ==# "git" ? expand("<cfile>") : "","")<CR> --<CR>', '', ft)
exe s:Map('n', 'co?', ':<C-U>help fugitive_co<CR>', '<silent>', ft)
exe s:Map('n', 'cb<Space>', ':Git branch<Space>', '', ft)
exe s:Map('n', 'cb<CR>', ':Git branch<CR>', '', ft)
exe s:Map('n', 'cb?', ':<C-U>help fugitive_cb<CR>', '<silent>', ft)
exe s:Map('n', 'r<Space>', ':Git rebase<Space>', '', ft)
exe s:Map('n', 'r<CR>', ':Git rebase<CR>', '', ft)
exe s:Map('n', 'ri', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><CR>', '<silent>', ft)
exe s:Map('n', 'rf', ':<C-U>Git -c sequence.editor=true rebase --interactive --autosquash<C-R>=<SID>RebaseArgument()<CR><CR>', '<silent>', ft)
exe s:Map('n', 'ru', ':<C-U>Git rebase --interactive @{upstream}<CR>', '<silent>', ft)
exe s:Map('n', 'rp', ':<C-U>Git rebase --interactive @{push}<CR>', '<silent>', ft)
exe s:Map('n', 'rw', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/reword/e<CR>', '<silent>', ft)
exe s:Map('n', 'rm', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/edit/e<CR>', '<silent>', ft)
exe s:Map('n', 'rd', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/drop/e<CR>', '<silent>', ft)
exe s:Map('n', 'rk', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/drop/e<CR>', '<silent>', ft)
exe s:Map('n', 'rx', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/drop/e<CR>', '<silent>', ft)
exe s:Map('n', 'rr', ':<C-U>Git rebase --continue<CR>', '<silent>', ft)
exe s:Map('n', 'rs', ':<C-U>Git rebase --skip<CR>', '<silent>', ft)
exe s:Map('n', 're', ':<C-U>Git rebase --edit-todo<CR>', '<silent>', ft)
exe s:Map('n', 'ra', ':<C-U>Git rebase --abort<CR>', '<silent>', ft)
exe s:Map('n', 'r?', ':<C-U>help fugitive_r<CR>', '<silent>', ft)
endfunction
function! fugitive#MapJumps(...) abort function! fugitive#MapJumps(...) abort
if !&modifiable if !&modifiable
if get(b:, 'fugitive_type', '') ==# 'blob' if get(b:, 'fugitive_type', '') ==# 'blob'
@ -7681,75 +7822,6 @@ function! fugitive#MapJumps(...) abort
call s:Map('n', 'gi', ":<C-U>exe 'Gsplit' (v:count ? '.gitignore' : '.git/info/exclude')<CR>", '<silent>') call s:Map('n', 'gi', ":<C-U>exe 'Gsplit' (v:count ? '.gitignore' : '.git/info/exclude')<CR>", '<silent>')
call s:Map('x', 'gi', ":<C-U>exe 'Gsplit' (v:count ? '.gitignore' : '.git/info/exclude')<CR>", '<silent>') call s:Map('x', 'gi', ":<C-U>exe 'Gsplit' (v:count ? '.gitignore' : '.git/info/exclude')<CR>", '<silent>')
call s:Map('n', 'c<Space>', ':Git commit<Space>')
call s:Map('n', 'c<CR>', ':Git commit<CR>')
call s:Map('n', 'cv<Space>', ':tab Git commit -v<Space>')
call s:Map('n', 'cv<CR>', ':tab Git commit -v<CR>')
call s:Map('n', 'ca', ':<C-U>Git commit --amend<CR>', '<silent>')
call s:Map('n', 'cc', ':<C-U>Git commit<CR>', '<silent>')
call s:Map('n', 'ce', ':<C-U>Git commit --amend --no-edit<CR>', '<silent>')
call s:Map('n', 'cw', ':<C-U>Git commit --amend --only<CR>', '<silent>')
call s:Map('n', 'cva', ':<C-U>tab Git commit -v --amend<CR>', '<silent>')
call s:Map('n', 'cvc', ':<C-U>tab Git commit -v<CR>', '<silent>')
call s:Map('n', 'cRa', ':<C-U>Git commit --reset-author --amend<CR>', '<silent>')
call s:Map('n', 'cRe', ':<C-U>Git commit --reset-author --amend --no-edit<CR>', '<silent>')
call s:Map('n', 'cRw', ':<C-U>Git commit --reset-author --amend --only<CR>', '<silent>')
call s:Map('n', 'cf', ':<C-U>Git commit --fixup=<C-R>=<SID>SquashArgument()<CR>')
call s:Map('n', 'cF', ':<C-U><Bar>Git -c sequence.editor=true rebase --interactive --autosquash<C-R>=<SID>RebaseArgument()<CR><Home>Git commit --fixup=<C-R>=<SID>SquashArgument()<CR>')
call s:Map('n', 'cs', ':<C-U>Git commit --no-edit --squash=<C-R>=<SID>SquashArgument()<CR>')
call s:Map('n', 'cS', ':<C-U><Bar>Git -c sequence.editor=true rebase --interactive --autosquash<C-R>=<SID>RebaseArgument()<CR><Home>Git commit --no-edit --squash=<C-R>=<SID>SquashArgument()<CR>')
call s:Map('n', 'cA', ':<C-U>Git commit --edit --squash=<C-R>=<SID>SquashArgument()<CR>')
call s:Map('n', 'c?', ':<C-U>help fugitive_c<CR>', '<silent>')
call s:Map('n', 'cr<Space>', ':Git revert<Space>')
call s:Map('n', 'cr<CR>', ':Git revert<CR>')
call s:Map('n', 'crc', ':<C-U>Git revert <C-R>=<SID>SquashArgument()<CR><CR>', '<silent>')
call s:Map('n', 'crn', ':<C-U>Git revert --no-commit <C-R>=<SID>SquashArgument()<CR><CR>', '<silent>')
call s:Map('n', 'cr?', ':<C-U>help fugitive_cr<CR>', '<silent>')
call s:Map('n', 'cm<Space>', ':Git merge<Space>')
call s:Map('n', 'cm<CR>', ':Git merge<CR>')
call s:Map('n', 'cmt', ':Git mergetool')
call s:Map('n', 'cm?', ':<C-U>help fugitive_cm<CR>', '<silent>')
call s:Map('n', 'cz<Space>', ':Git stash<Space>')
call s:Map('n', 'cz<CR>', ':Git stash<CR>')
call s:Map('n', 'cza', ':<C-U>Git stash apply --quiet --index stash@{<C-R>=v:count<CR>}<CR>')
call s:Map('n', 'czA', ':<C-U>Git stash apply --quiet stash@{<C-R>=v:count<CR>}<CR>')
call s:Map('n', 'czp', ':<C-U>Git stash pop --quiet --index stash@{<C-R>=v:count<CR>}<CR>')
call s:Map('n', 'czP', ':<C-U>Git stash pop --quiet stash@{<C-R>=v:count<CR>}<CR>')
call s:Map('n', 'czs', ':<C-U>Git stash push --staged<CR>')
call s:Map('n', 'czv', ':<C-U>exe "Gedit" fugitive#RevParse("stash@{" . v:count . "}")<CR>', '<silent>')
call s:Map('n', 'czw', ':<C-U>Git stash push --keep-index<C-R>=v:count > 1 ? " --all" : v:count ? " --include-untracked" : ""<CR><CR>')
call s:Map('n', 'czz', ':<C-U>Git stash push <C-R>=v:count > 1 ? " --all" : v:count ? " --include-untracked" : ""<CR><CR>')
call s:Map('n', 'cz?', ':<C-U>help fugitive_cz<CR>', '<silent>')
call s:Map('n', 'co<Space>', ':Git checkout<Space>')
call s:Map('n', 'co<CR>', ':Git checkout<CR>')
call s:Map('n', 'coo', ':<C-U>Git checkout <C-R>=substitute(<SID>SquashArgument(),"^$",get(<SID>TempState(),"filetype","") ==# "git" ? expand("<cfile>") : "","")<CR> --<CR>')
call s:Map('n', 'co?', ':<C-U>help fugitive_co<CR>', '<silent>')
call s:Map('n', 'cb<Space>', ':Git branch<Space>')
call s:Map('n', 'cb<CR>', ':Git branch<CR>')
call s:Map('n', 'cb?', ':<C-U>help fugitive_cb<CR>', '<silent>')
call s:Map('n', 'r<Space>', ':Git rebase<Space>')
call s:Map('n', 'r<CR>', ':Git rebase<CR>')
call s:Map('n', 'ri', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><CR>', '<silent>')
call s:Map('n', 'rf', ':<C-U>Git -c sequence.editor=true rebase --interactive --autosquash<C-R>=<SID>RebaseArgument()<CR><CR>', '<silent>')
call s:Map('n', 'ru', ':<C-U>Git rebase --interactive @{upstream}<CR>', '<silent>')
call s:Map('n', 'rp', ':<C-U>Git rebase --interactive @{push}<CR>', '<silent>')
call s:Map('n', 'rw', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/reword/e<CR>', '<silent>')
call s:Map('n', 'rm', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/edit/e<CR>', '<silent>')
call s:Map('n', 'rd', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/drop/e<CR>', '<silent>')
call s:Map('n', 'rk', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/drop/e<CR>', '<silent>')
call s:Map('n', 'rx', ':<C-U>Git rebase --interactive<C-R>=<SID>RebaseArgument()<CR><Bar>s/^pick/drop/e<CR>', '<silent>')
call s:Map('n', 'rr', ':<C-U>Git rebase --continue<CR>', '<silent>')
call s:Map('n', 'rs', ':<C-U>Git rebase --skip<CR>', '<silent>')
call s:Map('n', 're', ':<C-U>Git rebase --edit-todo<CR>', '<silent>')
call s:Map('n', 'ra', ':<C-U>Git rebase --abort<CR>', '<silent>')
call s:Map('n', 'r?', ':<C-U>help fugitive_r<CR>', '<silent>')
call s:Map('n', '.', ":<C-U> <C-R>=<SID>fnameescape(fugitive#Real(@%))<CR><Home>") call s:Map('n', '.', ":<C-U> <C-R>=<SID>fnameescape(fugitive#Real(@%))<CR><Home>")
call s:Map('x', '.', ":<C-U> <C-R>=<SID>fnameescape(fugitive#Real(@%))<CR><Home>") call s:Map('x', '.', ":<C-U> <C-R>=<SID>fnameescape(fugitive#Real(@%))<CR><Home>")
call s:Map('n', 'g?', ":<C-U>help fugitive-map<CR>", '<silent>') call s:Map('n', 'g?', ":<C-U>help fugitive-map<CR>", '<silent>')
@ -7762,6 +7834,7 @@ function! fugitive#MapJumps(...) abort
if new_browsex !=# old_browsex if new_browsex !=# old_browsex
exe 'nnoremap <silent> <buffer> <Plug>NetrwBrowseX' new_browsex exe 'nnoremap <silent> <buffer> <Plug>NetrwBrowseX' new_browsex
endif endif
call s:MapGitOps(0)
endfunction endfunction
function! fugitive#GX() abort function! fugitive#GX() abort
@ -8115,6 +8188,9 @@ function! fugitive#Foldtext() abort
endif endif
elseif line_foldstart =~# '^@@\+ .* @@' elseif line_foldstart =~# '^@@\+ .* @@'
return '+-' . v:folddashes . ' ' . line_foldstart return '+-' . v:folddashes . ' ' . line_foldstart
elseif &filetype ==# 'fugitive' && line_foldstart =~# '^[A-Z][a-z].* (\d\+)$'
let c = +matchstr(line_foldstart, '(\zs\d\+\ze)$')
return '+-' . v:folddashes . printf('%3d item', c) . (c == 1 ? ': ' : 's: ') . matchstr(line_foldstart, '.*\ze (\d\+)$')
elseif &filetype ==# 'gitcommit' && line_foldstart =~# '^# .*:$' elseif &filetype ==# 'gitcommit' && line_foldstart =~# '^# .*:$'
let lines = getline(v:foldstart, v:foldend) let lines = getline(v:foldstart, v:foldend)
call filter(lines, 'v:val =~# "^#\t"') call filter(lines, 'v:val =~# "^#\t"')

View file

@ -510,9 +510,11 @@ Stash maps ~
czz Push stash. Pass a [count] of 1 to add czz Push stash. Pass a [count] of 1 to add
`--include-untracked` or 2 to add `--all`. `--include-untracked` or 2 to add `--all`.
czw Push stash of worktree. Like `czz` with czw Push stash of the work-tree. Like `czz` with
`--keep-index`. `--keep-index`.
czs Push stash of the stage. Does not accept a count.
czA Apply topmost stash, or stash@{count}. czA Apply topmost stash, or stash@{count}.
cza Apply topmost stash, or stash@{count}, preserving the cza Apply topmost stash, or stash@{count}, preserving the

View file

@ -607,7 +607,7 @@ if exists(':Gdelete') != 2 && get(g:, 'fugitive_legacy_commands', 0)
exe 'command! -bar -bang -nargs=0 Gdelete exe fugitive#DeleteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)' exe 'command! -bar -bang -nargs=0 Gdelete exe fugitive#DeleteCommand(<line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)'
\ '|echohl WarningMSG|echomsg ":Gdelete is deprecated in favor of :GDelete"|echohl NONE' \ '|echohl WarningMSG|echomsg ":Gdelete is deprecated in favor of :GDelete"|echohl NONE'
elseif exists(':Gdelete') != 2 && !exists('g:fugitive_legacy_commands') elseif exists(':Gdelete') != 2 && !exists('g:fugitive_legacy_commands')
exe 'command! -bar -bang -nargs=0 Gdelete echoerr ":Gremove has been removed in favor of :GRemove"' exe 'command! -bar -bang -nargs=0 Gdelete echoerr ":Gdelete has been removed in favor of :GDelete"'
endif endif
if exists(':Gmove') != 2 && get(g:, 'fugitive_legacy_commands', 0) if exists(':Gmove') != 2 && get(g:, 'fugitive_legacy_commands', 0)
exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#CompleteObject Gmove exe fugitive#MoveCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)' exe 'command! -bar -bang -nargs=1 -complete=customlist,fugitive#CompleteObject Gmove exe fugitive#MoveCommand( <line1>, <count>, +"<range>", <bang>0, "<mods>", <q-args>)'

View file

@ -13,7 +13,7 @@ syn match fugitiveHeader /^Pull:\|^Rebase:\|^Merge:\|^Push:/ nextgroup=fugitiveS
syn match fugitiveHelpHeader /^Help:/ nextgroup=fugitiveHelpTag skipwhite syn match fugitiveHelpHeader /^Help:/ nextgroup=fugitiveHelpTag skipwhite
syn match fugitiveHelpTag /\S\+/ contained syn match fugitiveHelpTag /\S\+/ contained
syn region fugitiveSection start=/^\%(.*(\d\++\=)$\)\@=/ contains=fugitiveHeading end=/^$/ syn region fugitiveSection start=/^\%(.*(\d\++\=)$\)\@=/ contains=fugitiveHeading end=/^$/ fold
syn cluster fugitiveSection contains=fugitiveSection syn cluster fugitiveSection contains=fugitiveSection
syn match fugitiveHeading /^[A-Z][a-z][^:]*\ze (\d\++\=)$/ contains=fugitivePreposition contained nextgroup=fugitiveCount skipwhite syn match fugitiveHeading /^[A-Z][a-z][^:]*\ze (\d\++\=)$/ contains=fugitivePreposition contained nextgroup=fugitiveCount skipwhite
syn match fugitiveCount /(\d\++\=)/hs=s+1,he=e-1 contained syn match fugitiveCount /(\d\++\=)/hs=s+1,he=e-1 contained
@ -30,7 +30,7 @@ syn match fugitiveHash /\S\@<!\x\{4,\}\S\@!/ contained
syn region fugitiveHunk start=/^\%(@@\+ -\)\@=/ end=/^\%([A-Za-z?@]\|$\)\@=/ contains=diffLine,diffRemoved,diffAdded,diffNoEOL containedin=@fugitiveSection fold syn region fugitiveHunk start=/^\%(@@\+ -\)\@=/ end=/^\%([A-Za-z?@]\|$\)\@=/ contains=diffLine,diffRemoved,diffAdded,diffNoEOL containedin=@fugitiveSection fold
for s:section in ['Untracked', 'Unstaged', 'Staged'] for s:section in ['Untracked', 'Unstaged', 'Staged']
exe 'syn region fugitive' . s:section . 'Section start=/^\%(' . s:section . ' .*(\d\++\=)$\)\@=/ contains=fugitive' . s:section . 'Heading end=/^$/' exe 'syn region fugitive' . s:section . 'Section start=/^\%(' . s:section . ' .*(\d\++\=)$\)\@=/ contains=fugitive' . s:section . 'Heading end=/^$/ fold'
exe 'syn match fugitive' . s:section . 'Modifier /^[MADRCU?] / contained containedin=fugitive' . s:section . 'Section' exe 'syn match fugitive' . s:section . 'Modifier /^[MADRCU?] / contained containedin=fugitive' . s:section . 'Section'
exe 'syn cluster fugitiveSection add=fugitive' . s:section . 'Section' exe 'syn cluster fugitiveSection add=fugitive' . s:section . 'Section'
exe 'syn match fugitive' . s:section . 'Heading /^[A-Z][a-z][^:]*\ze (\d\++\=)$/ contains=fugitivePreposition contained nextgroup=fugitiveCount skipwhite' exe 'syn match fugitive' . s:section . 'Heading /^[A-Z][a-z][^:]*\ze (\d\++\=)$/ contains=fugitivePreposition contained nextgroup=fugitiveCount skipwhite'

View file

@ -528,7 +528,14 @@ Add `let g:gitgutter_preview_win_floating = 1` to your `~/.vimrc`. Note that on
#### The appearance of a floating/popup window for hunk previews #### The appearance of a floating/popup window for hunk previews
Set `g:gitgutter_floating_window_options` to a dictionary of the options you want. This dictionary is passed directly to `popup_create()` (Vim) / `nvim_open_win()` (Neovim). Either set `g:gitgutter_floating_window_options` to a dictionary of the options you want. This dictionary is passed directly to `popup_create()` (Vim) / `nvim_open_win()` (Neovim).
Or if you just want to override one or two of the defaults, you can do that with a file in an `after/` directory. For example:
```viml
" ~/.vim/after/vim-gitgutter/overrides.vim
let g:gitgutter_floating_window_options['border'] = 'single'
```
#### To load all hunks into the current window's location list instead of the quickfix list #### To load all hunks into the current window's location list instead of the quickfix list

View file

@ -328,6 +328,9 @@ function! s:undo(hunk_diff)
call append(lnum-1, lines[0:hunk[1]]) call append(lnum-1, lines[0:hunk[1]])
execute (lnum+hunk[1]) .','. (lnum+hunk[1]+hunk[3]) .'d _' execute (lnum+hunk[1]) .','. (lnum+hunk[1]+hunk[3]) .'d _'
endif endif
" Refresh gitgutter's view of buffer.
call gitgutter#process_buffer(bufnr(''), 1)
endfunction endfunction
@ -433,7 +436,7 @@ function! s:open_hunk_preview_window()
call nvim_buf_set_name(buf, 'gitgutter://hunk-preview') call nvim_buf_set_name(buf, 'gitgutter://hunk-preview')
" Assumes cursor is in original window. " Assumes cursor is in original window.
autocmd CursorMoved <buffer> ++once call gitgutter#hunk#close_hunk_preview_window() autocmd CursorMoved,TabLeave <buffer> ++once call gitgutter#hunk#close_hunk_preview_window()
if g:gitgutter_close_preview_on_escape if g:gitgutter_close_preview_on_escape
" Map <Esc> to close the floating preview. " Map <Esc> to close the floating preview.
@ -565,7 +568,7 @@ endfunction
function! s:screen_lines(lines) function! s:screen_lines(lines)
let [_virtualedit, &virtualedit]=[&virtualedit, 'all'] let [_virtualedit, &virtualedit]=[&virtualedit, 'all']
let cursor = getcurpos() let cursor = getcurpos()
normal! g$ normal! 0g$
let available_width = virtcol('.') let available_width = virtcol('.')
call setpos('.', cursor) call setpos('.', cursor)
let &virtualedit=_virtualedit let &virtualedit=_virtualedit

View file

@ -547,6 +547,13 @@ Default:
This dictionary is passed directly to |popup_create()| (Vim) or This dictionary is passed directly to |popup_create()| (Vim) or
|nvim_open_win()| (Neovim). |nvim_open_win()| (Neovim).
If you simply want to override one or two of the default values, create a file
in an after/ directory. For example:
>
" ~/.vim/after/vim-gitgutter/overrides.vim
let g:gitgutter_floating_window_options['border'] = 'single'
<
*g:gitgutter_close_preview_on_escape* *g:gitgutter_close_preview_on_escape*
Default: 0 Default: 0

View file

@ -0,0 +1,15 @@
name: Vint
on: [push]
jobs:
vint:
name: vint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
- name: Setup dependencies
run: pip install vim-vint
- name: Lint Vimscript
run: vint .

View file

@ -1,4 +1,7 @@
# Indent Guides (unmaintained) # Indent Guides
[![Vint](https://github.com/preservim/vim-indent-guides/workflows/Vint/badge.svg)](https://github.com/preservim/vim-indent-guides/actions?workflow=Vint)
Indent Guides is a plugin for visually displaying indent levels in Vim. Indent Guides is a plugin for visually displaying indent levels in Vim.
<img src="http://i.imgur.com/ONgoj.png" width="448" height="448" alt="" /> <img src="http://i.imgur.com/ONgoj.png" width="448" height="448" alt="" />
@ -24,7 +27,7 @@ If you have [Pathogen](http://www.vim.org/scripts/script.php?script_id=2332) ins
```bash ```bash
cd ~/.vim/bundle cd ~/.vim/bundle
git clone git://github.com/nathanaelkane/vim-indent-guides.git git clone git://github.com/preservim/vim-indent-guides.git
``` ```
### Vundle ### Vundle

View file

@ -1,5 +1,5 @@
" Author: Nate Kane <nathanaelkane AT gmail DOT com> " Author: Nate Kane <nathanaelkane AT gmail DOT com>
" Homepage: http://github.com/nathanaelkane/vim-indent-guides " Homepage: http://github.com/preservim/vim-indent-guides
" "
" Return hex string equivalent to given decimal string or number. " Return hex string equivalent to given decimal string or number.
@ -10,7 +10,7 @@
" Example: color_helper#dec_to_hex(255, 5) " Example: color_helper#dec_to_hex(255, 5)
" Returns: '000FF' " Returns: '000FF'
" "
function! color_helper#dec_to_hex(arg, padding) function! color_helper#dec_to_hex(arg, padding) abort
return toupper(printf('%0' . a:padding . 'x', a:arg + 0)) return toupper(printf('%0' . a:padding . 'x', a:arg + 0))
endfunction endfunction
@ -26,7 +26,7 @@ endfunction
" Example: color_helper#hex_to_dec('00') " Example: color_helper#hex_to_dec('00')
" Returns: 0 " Returns: 0
" "
function! color_helper#hex_to_dec(arg) function! color_helper#hex_to_dec(arg) abort
return (a:arg =~? '^0x') ? a:arg + 0 : ('0x'.a:arg) + 0 return (a:arg =~? '^0x') ? a:arg + 0 : ('0x'.a:arg) + 0
endfunction endfunction
@ -36,7 +36,7 @@ endfunction
" Example: color_helper#hex_color_to_rgb('#0088FF') " Example: color_helper#hex_color_to_rgb('#0088FF')
" Returns: [0, 136, 255] " Returns: [0, 136, 255]
" "
function! color_helper#hex_color_to_rgb(hex_color) function! color_helper#hex_color_to_rgb(hex_color) abort
let l:rgb = [] let l:rgb = []
if a:hex_color =~ g:indent_guides_color_hex_pattern if a:hex_color =~ g:indent_guides_color_hex_pattern
@ -55,7 +55,7 @@ endfunction
" Example: color_helper#rgb_color_to_hex([0, 136, 255]) " Example: color_helper#rgb_color_to_hex([0, 136, 255])
" Returns: '#0088FF' " Returns: '#0088FF'
" "
function! color_helper#rgb_color_to_hex(rgb_color) function! color_helper#rgb_color_to_hex(rgb_color) abort
let l:hex_color = '#' let l:hex_color = '#'
let l:hex_color .= color_helper#dec_to_hex(a:rgb_color[0], 2) " red let l:hex_color .= color_helper#dec_to_hex(a:rgb_color[0], 2) " red
let l:hex_color .= color_helper#dec_to_hex(a:rgb_color[1], 2) " green let l:hex_color .= color_helper#dec_to_hex(a:rgb_color[1], 2) " green
@ -71,7 +71,7 @@ endfunction
" Example: color_helper#hex_color_lighten('#000000', 0.10) " Example: color_helper#hex_color_lighten('#000000', 0.10)
" Returns: '#191919' " Returns: '#191919'
" "
function! color_helper#hex_color_lighten(color, percent) function! color_helper#hex_color_lighten(color, percent) abort
let l:rgb = color_helper#hex_color_to_rgb(a:color) let l:rgb = color_helper#hex_color_to_rgb(a:color)
let l:rgb_lightened = [] let l:rgb_lightened = []
@ -89,7 +89,7 @@ endfunction
" Example: color_helper#hex_color_darken('#FFFFFF', 0.10) " Example: color_helper#hex_color_darken('#FFFFFF', 0.10)
" Returns: '#E5E5E5' " Returns: '#E5E5E5'
" "
function! color_helper#hex_color_darken(color, percent) function! color_helper#hex_color_darken(color, percent) abort
let l:rgb = color_helper#hex_color_to_rgb(a:color) let l:rgb = color_helper#hex_color_to_rgb(a:color)
let l:rgb_darkened = [] let l:rgb_darkened = []
@ -106,7 +106,7 @@ endfunction
" Example: color_helper#color_name_to_hex('darkslategray') " Example: color_helper#color_name_to_hex('darkslategray')
" Returns: '#2F4F4F' " Returns: '#2F4F4F'
" "
function! color_helper#color_name_to_hex(color_name) function! color_helper#color_name_to_hex(color_name) abort
let l:hex_code = '' let l:hex_code = ''
let l:color_name = tolower(a:color_name) let l:color_name = tolower(a:color_name)

View file

@ -1,10 +1,10 @@
" Author: Nate Kane <nathanaelkane AT gmail DOT com> " Author: Nate Kane <nathanaelkane AT gmail DOT com>
" Homepage: http://github.com/nathanaelkane/vim-indent-guides " Homepage: http://github.com/preservim/vim-indent-guides
" "
" Toggles the indent guides on and off. " Toggles the indent guides on and off.
" "
function! indent_guides#toggle() function! indent_guides#toggle() abort
call indent_guides#init_matches() call indent_guides#init_matches()
if empty(w:indent_guides_matches) if empty(w:indent_guides_matches)
@ -18,7 +18,7 @@ endfunction
" Called from autocmds, keeps indent guides enabled or disabled when entering " Called from autocmds, keeps indent guides enabled or disabled when entering
" other buffers and windows. " other buffers and windows.
" "
function! indent_guides#process_autocmds() function! indent_guides#process_autocmds() abort
if g:indent_guides_autocmds_enabled if g:indent_guides_autocmds_enabled
call indent_guides#enable() call indent_guides#enable()
else else
@ -30,7 +30,7 @@ endfunction
" Enables the indent guides for the current buffer and any other buffer upon " Enables the indent guides for the current buffer and any other buffer upon
" entering it. " entering it.
" "
function! indent_guides#enable() function! indent_guides#enable() abort
let g:indent_guides_autocmds_enabled = 1 let g:indent_guides_autocmds_enabled = 1
if &diff || indent_guides#exclude_filetype() if &diff || indent_guides#exclude_filetype()
@ -64,7 +64,7 @@ endfunction
" Disables the indent guides for the current buffer and any other buffer upon " Disables the indent guides for the current buffer and any other buffer upon
" entering it. " entering it.
" "
function! indent_guides#disable() function! indent_guides#disable() abort
let g:indent_guides_autocmds_enabled = 0 let g:indent_guides_autocmds_enabled = 0
call indent_guides#clear_matches() call indent_guides#clear_matches()
endfunction endfunction
@ -72,7 +72,7 @@ endfunction
" "
" Clear all highlight matches for the current window. " Clear all highlight matches for the current window.
" "
function! indent_guides#clear_matches() function! indent_guides#clear_matches() abort
call indent_guides#init_matches() call indent_guides#init_matches()
if !empty(w:indent_guides_matches) if !empty(w:indent_guides_matches)
let l:index = 0 let l:index = 0
@ -86,14 +86,21 @@ function! indent_guides#clear_matches()
let l:index += l:index let l:index += l:index
endfor endfor
endif endif
" Make sure to clear indent guide if remembered match id has gone somehow.
for l:match in getmatches()
if l:match.group =~# '^IndentGuides\v(Even|Odd)$'
call matchdelete(l:match.id)
endif
endfor
endfunction endfunction
" "
" Automagically calculates and defines the indent highlight colors. " Automagically calculates and defines the indent highlight colors.
" "
function! indent_guides#highlight_colors() function! indent_guides#highlight_colors() abort
if s:auto_colors if s:auto_colors
if has('gui_running') || has('nvim') if has('gui_running') || has('nvim') || (has('termguicolors') && &termguicolors)
call indent_guides#gui_highlight_colors() call indent_guides#gui_highlight_colors()
else else
call indent_guides#basic_highlight_colors() call indent_guides#basic_highlight_colors()
@ -105,9 +112,9 @@ endfunction
" Defines some basic indent highlight colors that work for Terminal Vim and " Defines some basic indent highlight colors that work for Terminal Vim and
" gVim when colors can't be automatically calculated. " gVim when colors can't be automatically calculated.
" "
function! indent_guides#basic_highlight_colors() function! indent_guides#basic_highlight_colors() abort
let l:cterm_colors = (&g:background == 'dark') ? ['darkgrey', 'black'] : ['lightgrey', 'white'] let l:cterm_colors = (&g:background ==# 'dark') ? ['darkgrey', 'black'] : ['lightgrey', 'white']
let l:gui_colors = (&g:background == 'dark') ? ['grey15', 'grey30'] : ['grey70', 'grey85'] let l:gui_colors = (&g:background ==# 'dark') ? ['grey15', 'grey30'] : ['grey70', 'grey85']
exe 'hi IndentGuidesEven guibg=' . l:gui_colors[0] . ' guifg=' . l:gui_colors[1] . ' ctermbg=' . l:cterm_colors[0] . ' ctermfg=' . l:cterm_colors[1] exe 'hi IndentGuidesEven guibg=' . l:gui_colors[0] . ' guifg=' . l:gui_colors[1] . ' ctermbg=' . l:cterm_colors[0] . ' ctermfg=' . l:cterm_colors[1]
exe 'hi IndentGuidesOdd guibg=' . l:gui_colors[1] . ' guifg=' . l:gui_colors[0] . ' ctermbg=' . l:cterm_colors[1] . ' ctermfg=' . l:cterm_colors[0] exe 'hi IndentGuidesOdd guibg=' . l:gui_colors[1] . ' guifg=' . l:gui_colors[0] . ' ctermbg=' . l:cterm_colors[1] . ' ctermfg=' . l:cterm_colors[0]
@ -117,7 +124,7 @@ endfunction
" Automagically calculates and defines the indent highlight colors for gui " Automagically calculates and defines the indent highlight colors for gui
" vim. " vim.
" "
function! indent_guides#gui_highlight_colors() function! indent_guides#gui_highlight_colors() abort
let l:hi_normal_guibg = '' let l:hi_normal_guibg = ''
" capture the backgroud color from the normal highlight " capture the backgroud color from the normal highlight
@ -150,10 +157,10 @@ endfunction
" Takes a color and darkens or lightens it depending on whether a dark or light " Takes a color and darkens or lightens it depending on whether a dark or light
" colorscheme is being used. " colorscheme is being used.
" "
function! indent_guides#lighten_or_darken_color(color) function! indent_guides#lighten_or_darken_color(color) abort
let l:new_color = '' let l:new_color = ''
if (&g:background == 'dark') if (&g:background ==# 'dark')
let l:new_color = color_helper#hex_color_lighten(a:color, s:change_percent) let l:new_color = color_helper#hex_color_lighten(a:color, s:change_percent)
else else
let l:new_color = color_helper#hex_color_darken (a:color, s:change_percent) let l:new_color = color_helper#hex_color_darken (a:color, s:change_percent)
@ -165,7 +172,7 @@ endfunction
" "
" Define default highlights. " Define default highlights.
" "
function! indent_guides#define_default_highlights() function! indent_guides#define_default_highlights() abort
hi default clear IndentGuidesOdd hi default clear IndentGuidesOdd
hi default clear IndentGuidesEven hi default clear IndentGuidesEven
endfunction endfunction
@ -173,7 +180,7 @@ endfunction
" "
" Init the w:indent_guides_matches variable. " Init the w:indent_guides_matches variable.
" "
function! indent_guides#init_matches() function! indent_guides#init_matches() abort
let w:indent_guides_matches = exists('w:indent_guides_matches') ? w:indent_guides_matches : [] let w:indent_guides_matches = exists('w:indent_guides_matches') ? w:indent_guides_matches : []
endfunction endfunction
@ -181,7 +188,7 @@ endfunction
" We need to initialize these vars every time a buffer is entered while the " We need to initialize these vars every time a buffer is entered while the
" plugin is enabled. " plugin is enabled.
" "
function! indent_guides#init_script_vars() function! indent_guides#init_script_vars() abort
if &l:shiftwidth > 0 && &l:expandtab if &l:shiftwidth > 0 && &l:expandtab
let s:indent_size = &l:shiftwidth let s:indent_size = &l:shiftwidth
else else
@ -191,7 +198,7 @@ function! indent_guides#init_script_vars()
let s:hi_normal = indent_guides#capture_highlight('Normal') let s:hi_normal = indent_guides#capture_highlight('Normal')
" remove 'font=<value>' from the s:hi_normal string (only seems to happen on Vim startup in Windows) " remove 'font=<value>' from the s:hi_normal string (only seems to happen on Vim startup in Windows)
let s:hi_normal = substitute(s:hi_normal, ' font=[A-Za-z0-9:]\+', "", "") let s:hi_normal = substitute(s:hi_normal, ' font=[A-Za-z0-9:]\+', '', '')
" shortcuts to the global variables - this makes the code easier to read " shortcuts to the global variables - this makes the code easier to read
let s:debug = g:indent_guides_debug let s:debug = g:indent_guides_debug
@ -229,7 +236,7 @@ endfunction
" "
" NOTE: Currently, this only works when soft-tabs are being used. " NOTE: Currently, this only works when soft-tabs are being used.
" "
function! indent_guides#calculate_guide_size() function! indent_guides#calculate_guide_size() abort
let l:guide_size = g:indent_guides_guide_size let l:guide_size = g:indent_guides_guide_size
if l:guide_size == 0 || l:guide_size > s:indent_size if l:guide_size == 0 || l:guide_size > s:indent_size
@ -245,12 +252,9 @@ endfunction
" Example: indent_guides#capture_highlight('normal') " Example: indent_guides#capture_highlight('normal')
" Returns: 'Normal xxx guifg=#323232 guibg=#ffffff' " Returns: 'Normal xxx guifg=#323232 guibg=#ffffff'
" "
function! indent_guides#capture_highlight(group_name) function! indent_guides#capture_highlight(group_name) abort
redir => l:output let l:output = execute('hi ' . a:group_name, 'silent')
exe "silent hi " . a:group_name let l:output = substitute(l:output, '\n', '', '')
redir END
let l:output = substitute(l:output, "\n", "", "")
return l:output return l:output
endfunction endfunction
@ -266,7 +270,7 @@ endfunction
" Example: indent_guides#indent_highlight_pattern('\t', 9, 2) " Example: indent_guides#indent_highlight_pattern('\t', 9, 2)
" Returns: /^\t*\%9v\zs\t*\%11v\ze/ " Returns: /^\t*\%9v\zs\t*\%11v\ze/
" "
function! indent_guides#indent_highlight_pattern(indent_pattern, column_start, indent_size) function! indent_guides#indent_highlight_pattern(indent_pattern, column_start, indent_size) abort
let l:pattern = '^' . a:indent_pattern . '*\%' . a:column_start . 'v\zs' let l:pattern = '^' . a:indent_pattern . '*\%' . a:column_start . 'v\zs'
let l:pattern .= a:indent_pattern . '*\%' . (a:column_start + a:indent_size) . 'v' let l:pattern .= a:indent_pattern . '*\%' . (a:column_start + a:indent_size) . 'v'
let l:pattern .= '\ze' let l:pattern .= '\ze'
@ -276,8 +280,13 @@ endfunction
" "
" Detect if any of the buffer filetypes should be excluded. " Detect if any of the buffer filetypes should be excluded.
" "
function! indent_guides#exclude_filetype() function! indent_guides#exclude_filetype() abort
for ft in split(&ft, '\.') if exists('g:indent_guides_exclude_buftype')
if g:indent_guides_exclude_buftype && &buftype !=# ''
return 1
endif
endif
for ft in split(&ft, '\.', 1)
if index(g:indent_guides_exclude_filetypes, ft) > -1 if index(g:indent_guides_exclude_filetypes, ft) > -1
return 1 return 1
end end

View file

@ -170,9 +170,18 @@ Default: 0. Values: 0 or 1.
let g:indent_guides_enable_on_vim_startup = 0 let g:indent_guides_enable_on_vim_startup = 0
< <
------------------------------------------------------------------------------
*'indent_guides_exclude_buftype'*
Use this option to try and disable the plugin on non-file buffers
Default: 0. Values: 0 or 1
>
let g:indent_guides_exclude_buftype = 0
<
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
*'indent_guides_exclude_filetypes'* *'indent_guides_exclude_filetypes'*
Use this option to specify a list of filetypes to disable the plugin for. Use this option to specify a list of filetypes to disable the plugin for. Use
'' for files with no filetypes set.
Default: ['help']. Values: list of strings. Default: ['help']. Values: list of strings.
> >
@ -248,8 +257,8 @@ Why did I build this plugin?~
* I wanted to learn me some VimL. * I wanted to learn me some VimL.
Links:~ Links:~
* Github: https://github.com/nathanaelkane/vim-indent-guides * Github: https://github.com/preservim/vim-indent-guides
* Bugs & Issues: https://github.com/nathanaelkane/vim-indent-guides/issues * Bugs & Issues: https://github.com/preservim/vim-indent-guides/issues
Credits:~ Credits:~
* Matt Wozniski (godlygeek) for letting me use the list of color names and * Matt Wozniski (godlygeek) for letting me use the list of color names and
@ -265,8 +274,9 @@ Bug reports, feedback, suggestions etc are welcomed.
7. CHANGELOG *indent-guides-changelog* 7. CHANGELOG *indent-guides-changelog*
1.8 (pending release)~ 1.8 (pending release)~
* Allow exclude files with no 'filetype' set (thanks @noscript).
* Added option g:|indent_guides_soft_pattern| to control the pattern for * Added option g:|indent_guides_soft_pattern| to control the pattern for
soft indentation (thanks @sergey-vlasov). soft indentation (thanks @noscript).
* Added option g:|indent_guides_default_mapping| to control whether the * Added option g:|indent_guides_default_mapping| to control whether the
default mapping (<Leader>ig) gets set (thanks @suy). default mapping (<Leader>ig) gets set (thanks @suy).
* Set size of indent guide to `tabstop` value when `shiftwidth=0` or * Set size of indent guide to `tabstop` value when `shiftwidth=0` or

View file

@ -1,5 +1,5 @@
" Author: Nate Kane <nathanaelkane AT gmail DOT com> " Author: Nate Kane <nathanaelkane AT gmail DOT com>
" Homepage: http://github.com/nathanaelkane/vim-indent-guides " Homepage: http://github.com/preservim/vim-indent-guides
" Do not load if vim is too old " Do not load if vim is too old
if (v:version == 701 && !exists('*matchadd')) || (v:version < 701) if (v:version == 701 && !exists('*matchadd')) || (v:version < 701)
@ -35,7 +35,7 @@ command! -bar IndentGuidesDisable call s:IndentGuidesDisable()
" "
function s:InitVariable(var, value) function s:InitVariable(var, value)
if !exists(a:var) if !exists(a:var)
if type(a:value) == type("") if type(a:value) == type('')
exec 'let ' . a:var . ' = ' . "'" . a:value . "'" exec 'let ' . a:var . ' = ' . "'" . a:value . "'"
else else
exec 'let ' . a:var . ' = ' . a:value exec 'let ' . a:var . ' = ' . a:value
@ -67,7 +67,7 @@ if !exists('g:indent_guides_exclude_filetypes')
endif endif
" Default mapping " Default mapping
if !hasmapto('<Plug>IndentGuidesToggle', 'n') && maparg('<Leader>ig', 'n') == '' if !hasmapto('<Plug>IndentGuidesToggle', 'n') && maparg('<Leader>ig', 'n') ==# ''
\ && g:indent_guides_default_mapping != 0 \ && g:indent_guides_default_mapping != 0
nmap <silent><unique> <Leader>ig <Plug>IndentGuidesToggle nmap <silent><unique> <Leader>ig <Plug>IndentGuidesToggle
endif endif
@ -86,6 +86,9 @@ augroup indent_guides
endif endif
autocmd BufEnter,WinEnter,FileType * call indent_guides#process_autocmds() autocmd BufEnter,WinEnter,FileType * call indent_guides#process_autocmds()
if (v:version == 704 && has('patch786')) || (v:version > 704)
autocmd OptionSet tabstop,shiftwidth,expandtab call indent_guides#process_autocmds()
endif
" Trigger BufEnter and process modelines. " Trigger BufEnter and process modelines.
autocmd ColorScheme * doautocmd indent_guides BufEnter autocmd ColorScheme * doautocmd indent_guides BufEnter

View file

@ -47,6 +47,8 @@ sudo make install
vim-addon-manager install markdown vim-addon-manager install markdown
``` ```
If you are using a package manager with semver support (like [lazy.nvim](https://github.com/folke/lazy.nvim)) make sure you are following the master branch (see https://github.com/preservim/vim-markdown/issues/616).
If you are not using any package manager, download the [tarball](https://github.com/preservim/vim-markdown/archive/master.tar.gz) and do this: If you are not using any package manager, download the [tarball](https://github.com/preservim/vim-markdown/archive/master.tar.gz) and do this:
```sh ```sh

View file

@ -296,6 +296,8 @@ endfunction
" Section: Fugitive :GBrowse support " Section: Fugitive :GBrowse support
" https://github.com/github/markup
let s:markup_exts = ['markdown', 'mdown', 'mkdn', 'md', 'textile', 'rdoc', 'org', 'creole', 'mediawiki', 'wiki', 'rst', 'asciidoc', 'adoc', 'asc', 'pod']
function! rhubarb#FugitiveUrl(...) abort function! rhubarb#FugitiveUrl(...) abort
if a:0 == 1 || type(a:1) == type({}) if a:0 == 1 || type(a:1) == type({})
let opts = a:1 let opts = a:1
@ -323,6 +325,9 @@ function! rhubarb#FugitiveUrl(...) abort
elseif get(opts, 'type', '') ==# 'blob' || opts.path =~# '[^/]$' elseif get(opts, 'type', '') ==# 'blob' || opts.path =~# '[^/]$'
let escaped_commit = substitute(commit, '#', '%23', 'g') let escaped_commit = substitute(commit, '#', '%23', 'g')
let url = root . '/blob/' . escaped_commit . '/' . path let url = root . '/blob/' . escaped_commit . '/' . path
if get(opts, 'line1') > 0 && index(s:markup_exts, fnamemodify(path, ':e')) >= 0
let url .= '?plain=1'
endif
if get(opts, 'line2') > 0 && get(opts, 'line1') == opts.line2 if get(opts, 'line2') > 0 && get(opts, 'line1') == opts.line2
let url .= '#L' . opts.line1 let url .= '#L' . opts.line1
elseif get(opts, 'line1') > 0 && get(opts, 'line2') > 0 elseif get(opts, 'line1') > 0 && get(opts, 'line2') > 0

View file

@ -40,6 +40,18 @@ describe "Syntax highlighting" do
EOF EOF
end end
specify "magic comments with -" do
assert_correct_highlighting <<~'EOF', 'frozen-string-literal', 'rubyMagicComment'
# frozen-string-literal: true
EOF
end
specify "magic comments with - and _" do
assert_correct_highlighting <<~'EOF', 'frozen-string_literal', 'rubyMagicComment'
# frozen-string_literal: true
EOF
end
specify "magic comments - shareable_constant_value" do specify "magic comments - shareable_constant_value" do
assert_correct_highlighting <<~'EOF', 'shareable_constant_value', 'rubyMagicComment' assert_correct_highlighting <<~'EOF', 'shareable_constant_value', 'rubyMagicComment'
# shareable_constant_value: literal # shareable_constant_value: literal

View file

@ -434,8 +434,8 @@ syn match rubySharpBang "\%^#!.*" display
syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained
syn match rubyEncoding "[[:alnum:]-_]\+" contained display syn match rubyEncoding "[[:alnum:]-_]\+" contained display
syn match rubyMagicComment "\c\%<3l#\s*\zs\%(coding\|encoding\):" contained nextgroup=rubyEncoding skipwhite syn match rubyMagicComment "\c\%<3l#\s*\zs\%(coding\|encoding\):" contained nextgroup=rubyEncoding skipwhite
syn match rubyMagicComment "\c\%<10l#\s*\zs\%(frozen_string_literal\|warn_indent\|warn_past_scope\):" contained nextgroup=rubyBoolean skipwhite syn match rubyMagicComment "\c\%<10l#\s*\zs\%(frozen[-_]string[-_]literal\|warn[-_]indent\|warn[-_]past[-_]scope\):" contained nextgroup=rubyBoolean skipwhite
syn match rubyMagicComment "\c\%<10l#\s*\zs\%(shareable_constant_value\):" contained nextgroup=rubyEncoding skipwhite syn match rubyMagicComment "\c\%<10l#\s*\zs\%(shareable[-_]constant[-_]value\):" contained nextgroup=rubyEncoding skipwhite
syn match rubyComment "#.*" contains=@rubyCommentSpecial,rubySpaceError,@Spell syn match rubyComment "#.*" contains=@rubyCommentSpecial,rubySpaceError,@Spell
syn cluster rubyCommentSpecial contains=rubySharpBang,rubyTodo,rubyMagicComment syn cluster rubyCommentSpecial contains=rubySharpBang,rubyTodo,rubyMagicComment

View file

@ -109,7 +109,9 @@ function! s:state_update_changes() dict abort
let self.end_col += change_len let self.end_col += change_len
let col = col('.') let col = col('.')
if line('.') != self.cur_stop.line || col < self.start_col || col > self.end_col " Increase the endpoint by 1 for &sel = exclusive
if line('.') != self.cur_stop.line || col < self.start_col
\ || col > (self.end_col + (&sel == 'exclusive'))
return self.remove() return self.remove()
endif endif

View file

@ -245,7 +245,6 @@ This list is kept up-to-date on a best effort basis.
* Python - [honza](http://github.com/honza) * Python - [honza](http://github.com/honza)
* Ruby - [taq](http://github.com/taq) * Ruby - [taq](http://github.com/taq)
* Scala - [gorodinskiy](https://github.com/gorodinskiy) * Scala - [gorodinskiy](https://github.com/gorodinskiy)
* Supercollider - [lpil](https://github.com/lpil)
License License
------- -------

View file

@ -44,13 +44,13 @@ snippet fi "<%= Fixtures.identify(:symbol) %>"
endsnippet endsnippet
snippet ft "form_tag" w snippet ft "form_tag" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`form_tag(${1::action => '${2:update}'}${3:, ${4:${5:class} => '${6:form}'\}}}) do`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`form_tag(${1:action: '${2:update}'}${3:, ${4:${5:class}: '${6:form}'\}}}) do`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
$0 $0
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
endsnippet endsnippet
snippet ffs "form_for submit 2" w snippet ffs "form_for submit 2" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`${1:f}.submit '${2:Submit}'${3:, :disable_with => '${4:$2ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`${1:f}.submit '${2:Submit}'${3:, disable_with: '${4:$2ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet f. "f_fields_for (nff)" w snippet f. "f_fields_for (nff)" w
@ -84,7 +84,7 @@ snippet f. "f.radio_button" w
endsnippet endsnippet
snippet f. "f.submit" w snippet f. "f.submit" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.submit "${1:Submit}"${2:, :disable_with => '${3:$1ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.submit "${1:Submit}"${2:, disable_with: '${3:$1ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet f. "f.text_area" w snippet f. "f.text_area" w
@ -110,19 +110,19 @@ snippet ff "form_for" w
endsnippet endsnippet
snippet ist "image_submit_tag" w snippet ist "image_submit_tag" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_submit_tag("${1:agree.png}"${2:${3:, :id => "${4:${1/^(\w+)(\.\w*)?$/$1/}}"}${5:, :name => "${6:${1/^(\w+)(\.\w*)?$/$1/}}"}${7:, :class => "${8:${1/^(\w+)(\.\w*)?$/$1/}-button}"}${9:, :disabled => ${10:false}}})`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_submit_tag("${1:agree.png}"${2:${3:, id: "${4:${1/^(\w+)(\.\w*)?$/$1/}}"}${5:, name: "${6:${1/^(\w+)(\.\w*)?$/$1/}}"}${7:, class: "${8:${1/^(\w+)(\.\w*)?$/$1/}-button}"}${9:, disabled: ${10:false}}})`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet it "image_tag" w snippet it "image_tag" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_tag "$1${2:.png}"${3:${4:, :title => "${5:title}"}${6:, :class => "${7:class}"}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_tag "$1${2:.png}"${3:${4:, title: "${5:title}"}${6:, class: "${7:class}"}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet layout "layout" snippet layout "layout"
layout "${1:template_name}"${2:${3:, :only => ${4:[:${5:action}, :${6:action}]}}${7:, :except => ${8:[:${9:action}, :${10:action}]}}} layout "${1:template_name}"${2:${3:, only: ${4:[:${5:action}, :${6:action}]}}${7:, except: ${8:[:${9:action}, :${10:action}]}}}
endsnippet endsnippet
snippet jit "javascript_include_tag" w snippet jit "javascript_include_tag" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`javascript_include_tag ${1::all}${2:, :cache => ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`javascript_include_tag ${1::all}${2:, cache: ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet lt "link_to (name, dest)" w snippet lt "link_to (name, dest)" w
@ -130,23 +130,23 @@ snippet lt "link_to (name, dest)" w
endsnippet endsnippet
snippet lia "link_to (action)" w snippet lia "link_to (action)" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :action => "${2:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", action: "${2:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet liai "link_to (action, id)" w snippet liai "link_to (action, id)" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :action => "${2:edit}", :id => ${3:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", action: "${2:edit}", id: ${3:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet lic "link_to (controller)" w snippet lic "link_to (controller)" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", controller: "${2:items}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet lica "link_to (controller, action)" w snippet lica "link_to (controller, action)" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}", :action => "${3:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", controller: "${2:items}", action: "${3:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet licai "link_to (controller, action, id)" w snippet licai "link_to (controller, action, id)" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}", :action => "${3:edit}", :id => ${4:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", controller: "${2:items}", action: "${3:edit}", id: ${4:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet linpp "link_to (nested path plural)" w snippet linpp "link_to (nested path plural)" w
@ -174,15 +174,15 @@ page.hide ${1:"${2:id(s)}"}
endsnippet endsnippet
snippet ins "page.insert_html (position, id, partial)" snippet ins "page.insert_html (position, id, partial)"
page.insert_html :${1:top}, ${2:"${3:id}"}, :${4:partial => "${5:template}"} page.insert_html :${1:top}, ${2:"${3:id}"}, ${4:partial: "${5:template}"}
endsnippet endsnippet
snippet rep "page.replace (id, partial)" snippet rep "page.replace (id, partial)"
page.replace ${1:"${2:id}"}, :${3:partial => "${4:template}"} page.replace ${1:"${2:id}"}, ${3:partial: "${4:template}"}
endsnippet endsnippet
snippet reph "page.replace_html (id, partial)" snippet reph "page.replace_html (id, partial)"
page.replace_html ${1:"${2:id}"}, :${3:partial => "${4:template}"} page.replace_html ${1:"${2:id}"}, ${3:partial: "${4:template}"}
endsnippet endsnippet
snippet show "page.show (*ids)" snippet show "page.show (*ids)"
@ -198,31 +198,31 @@ page.visual_effect :${1:toggle_slide}, ${2:"${3:DOM ID}"}
endsnippet endsnippet
snippet rp "render (partial) (rp)" snippet rp "render (partial) (rp)"
render :partial => "${1:item}" render partial: "${1:item}"
endsnippet endsnippet
snippet rpc "render (partial,collection) (rpc)" snippet rpc "render (partial,collection) (rpc)"
render :partial => "${1:item}", :collection => ${2:@$1s} render partial: "${1:item}", collection: ${2:@$1s}
endsnippet endsnippet
snippet rpl "render (partial,locals) (rpl)" snippet rpl "render (partial,locals) (rpl)"
render :partial => "${1:item}", :locals => { :${2:$1} => ${3:@$1}$0 } render partial: "${1:item}", locals: { ${2:$1}: ${3:@$1}$0 }
endsnippet endsnippet
snippet rpo "render (partial,object) (rpo)" snippet rpo "render (partial,object) (rpo)"
render :partial => "${1:item}", :object => ${2:@$1} render partial: "${1:item}", object: ${2:@$1}
endsnippet endsnippet
snippet rps "render (partial,status) (rps)" snippet rps "render (partial,status) (rps)"
render :partial => "${1:item}", :status => ${2:500} render partial: "${1:item}", status: ${2:500}
endsnippet endsnippet
snippet slt "stylesheet_link_tag" w snippet slt "stylesheet_link_tag" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`stylesheet_link_tag ${1::all}${2:, :cache => ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`stylesheet_link_tag ${1::all}${2:, cache: ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet st "submit_tag" w snippet st "submit_tag" w
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`submit_tag "${1:Save changes}"${2:, :id => "${3:submit}"}${4:, :name => "${5:$3}"}${6:, :class => "${7:form_$3}"}${8:, :disabled => ${9:false}}${10:, :disable_with => "${11:Please wait...}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)` `!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`submit_tag "${1:Save changes}"${2:, id: "${3:submit}"}${4:, name: "${5:$3}"}${6:, class: "${7:form_$3}"}${8:, disabled: ${9:false}}${10:, disable_with: "${11:Please wait...}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
endsnippet endsnippet
snippet else "else (ERB)" snippet else "else (ERB)"

View file

@ -127,14 +127,18 @@ def triple_quotes_handle_trailing(snip, quoting_style):
if not snip.c: if not snip.c:
# Do this only once, otherwise the following error would happen: # Do this only once, otherwise the following error would happen:
# RuntimeError: The snippets content did not converge: … # RuntimeError: The snippets content did not converge: …
_, col = vim.current.window.cursor row, col = vim.current.window.cursor
line = vim.current.line
# before ultisnip expansion, chars ahead cursor is at row - 1, col
# after ultisnip expansion, they are pushed to row + 1, col - 1
# when this function is run, it's already after ultisni expansion
line = snip.buffer[row + 1]
# Handle already existing quote chars after the trigger. # Handle already existing quote chars after the trigger.
_ret = quoting_style * 3 _ret = quoting_style * 3
while True: while True:
try: try:
nextc = line[col] nextc = line[col - 1]
except IndexError: except IndexError:
break break
if nextc == quoting_style and len(_ret): if nextc == quoting_style and len(_ret):

View file

@ -160,9 +160,9 @@ snippet abs "abstract environment" b
endsnippet endsnippet
snippet tab "tabular / array environment" b snippet tab "tabular / array environment" b
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}} \begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
$0${2/(?<=.)(c|l|r)|./(?1: & )/g} $0${2/(?<=.)(c|l|r)|./(?1: & )/g}
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}} \end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
endsnippet endsnippet
snippet table "Table environment" b snippet table "Table environment" b
@ -384,7 +384,7 @@ snippet nn "Tikz node" w
$0 $0
endsnippet endsnippet
snippet lll "l" Aw snippet lll "l" w
\ell \ell
endsnippet endsnippet
@ -400,7 +400,7 @@ snippet <! "normal" Aw
\triangleleft \triangleleft
endsnippet endsnippet
snippet "(\d|\w)+invs" "inverse" Awr snippet "((\d|\w)+)invs" "inverse" Awr
`!p snip.rv = match.group(1)`^{-1} `!p snip.rv = match.group(1)`^{-1}
endsnippet endsnippet
@ -520,4 +520,59 @@ snippet subpar* "Sub Paragraph*" wi
\subparagraph*{$1${VISUAL}} \subparagraph*{$1${VISUAL}}
endsnippet endsnippet
snippet chapl "Chapter with label" wi
\chapter{$1${VISUAL}}
\label{cha:${2:${1/\W+/-/g}}}
endsnippet
snippet secl "Section with label" wi
\section{$1${VISUAL}}
\label{sec:${2:${1/\W+/-/g}}}
endsnippet
snippet sec*l "Section* with label" wi
\section*{$1${VISUAL}}
\label{sec:${2:${1/\W+/-/g}}}
endsnippet
snippet subl "Subsection with label" wi
\subsection{$1${VISUAL}}
\label{sub:${2:${1/\W+/-/g}}}
endsnippet
snippet sub*l "Subsection* with label" wi
\subsection*{$1${VISUAL}}
\label{sub:${2:${1/\W+/-/g}}}
endsnippet
snippet subsubl "Subsection with label" wi
\subsubsection{$1${VISUAL}}
\label{ssub:${2:${1/\W+/-/g}}}
endsnippet
snippet subsub*l "Subsubsection with label" wi
\subsubsection*{$1${VISUAL}}
\label{ssub:${2:${1/\W+/-/g}}}
endsnippet
snippet parl "Paragraph with label" wi
\paragraph{$1${VISUAL}}
\label{par:${2:${1/\W+/-/g}}}
endsnippet
snippet par*l "Paragraph* with label" wi
\paragraph*{$1${VISUAL}}
\label{par:${2:${1/\W+/-/g}}}
endsnippet
snippet subparl "Sub Paragraph with label" wi
\subparagraph{$1${VISUAL}}
\label{subp:${2:${1/\W+/-/g}}}
endsnippet
snippet subpar*l "Sub Paragraph* with label" wi
\subparagraph*{$1${VISUAL}}
\label{subp:${2:${1/\W+/-/g}}}
endsnippet
# vim:ft=snippets: # vim:ft=snippets:

View file

@ -3,6 +3,8 @@
# Flutter stateless widget # Flutter stateless widget
snippet stless snippet stless
class $1 extends StatelessWidget { class $1 extends StatelessWidget {
const $1({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -14,8 +16,10 @@ snippet stless
# Flutter stateful widget # Flutter stateful widget
snippet stful snippet stful
class $1 extends StatefulWidget { class $1 extends StatefulWidget {
const $1({super.key});
@override @override
_$1State createState() => _$1State(); State<$1> createState() => _$1State();
} }
class _$1State extends State<$1> { class _$1State extends State<$1> {
@ -30,8 +34,10 @@ snippet stful
# Flutter widget with AnimationController # Flutter widget with AnimationController
snippet stanim snippet stanim
class $1 extends StatefulWidget { class $1 extends StatefulWidget {
const $1({super.key});
@override @override
_$1State createState() => _$1State(); State<$1> createState() => _$1State();
} }
class _$1State extends State<$1> class _$1State extends State<$1>
@ -85,5 +91,3 @@ snippet fsa
); );
} }
} }

View file

@ -0,0 +1,125 @@
snippet class
class $1 extends ${2:Reference}
\t$3
snippet pr
print($1)
snippet ready
func _ready():
\t${1:pass}
snippet init
func _init():
\t${1:pass}
snippet process
func _process(delta):
\t${1:pass}
snippet input
func _input(event):
\t${1:pass}
snippet inpute
func _input_event(event):
\t${1:pass}
snippet draw
func _draw():
\t${1:pass}
snippet guii
func _gui_input(event):
\t${1:pass}
snippet for
for $1 in $2:
\t${3:pass}
snippet for
for $1 in range(${2:start}{$3:,end}):
\t${4:pass}
snippet if
if ${1:condition}:
\t${3:pass}
elif ${2:condition}:
\t${4:pass}
else:
\t${5:pass}
snippet if
if ${1:condition}:
\t${2:pass}
else:
\t${3:pass}
snippet if
if ${1:condition}:
\t${2:pass}
snippet while
while ${1:condition}:
\t${2:pass}
snippet func
func ${1:method}(${2:args}):
\t${3:pass}
snippet signal
signal ${1:signalname}(${2:args})
snippet export
export(${1:type}${2:,other_configs}) var ${3:name}${4: = default}${5: setget }
snippet var
var ${1:name}${2: = default}${3: setget }
snippet onready
onready var ${1:name} = get_node($2)
snippet is
${1:instance} is ${2:class}
snippet in
${1:element} in ${$2:array}
snippet gdscript
extends ${1:BaseClass}
# class member variables go here, for example:
# var a = 2
# var b = \textvar\
func _ready():
\t# Called every time the node is added to the scene.
\t# Initialization here
\tpass
# snippet pass ##### do we really need this?
# pass

View file

@ -0,0 +1 @@
extends eelixir

View file

@ -0,0 +1,135 @@
# Org Mode Snippets Imported from (https://github.com/doomemacs/snippets/)
# Imported by ybenel (github.com/m1ndo)
# Begin
snippet begin
#+begin_${1:type} ${2:options}
$0
#+end_$1
# Begin Center
snippet <C
#+begin_center
$0
#+end_center
# Begin Comment
snippet <c
#+begin_comment
$0
#+end_comment
# Begin Example
snippet <e
#+begin_example
$0
#+end_example
# Begin Export Ascii
snippet <a
#+begin_export ascii
$0
#+end_export
# Begin export html
snippet <h
#+begin_export html
$0
#+end_export
# Begin export Latex
snippet <l
#+begin_export latex
$0
#+end_export
# Begin export python
snippet <p
#+begin_export python
$0
#+end_export
# Begin export shell
snippet <s
#+begin_export shell
$0
#+end_export
# dot
snippet dot
#+begin_src dot :file ${1:file}.${2:svg} :results file graphics
$0
#+end_src
# elisp
snippet elisp
#+begin_src emacs-lisp :tangle yes
$0
#+end_src
# Entry
snippet entry
#+begin_html
---
layout: ${1:default}
title: ${2:title}
---
#+end_html
$0
# Begin example
snippet ex
#+begin_example
$0
#+end_example
# Begin export
snippet export
#+begin_export ${1:type}
$0
#+end_export
# Figure
snippet fig
#+caption: ${1:caption}
#+attr_latex: ${2:scale=0.75}
#+name: fig-${3:label}
# Org Header
snippet head
#+title: ${1:untitled document}
#+author: ${2:user-full-name}
#+email: ${3:user-mail-address}
# Image
snippet img
#+attr_html: :alt $2 :align ${3:left} :class img
[[${1:src}]${4:[${5:title}]}]
$0
# Inline
snippet inl
src_${1:language}${2:[${3::exports code}]}{${4:code}}
# Inline source
snippet srci
src_${1:language}[${2:header}]{${0:body}}
# Jupyter
snippet jupyter
#+begin_src jupyter-${1:$$(yas-choose-value '("python" "julia" "R"))}${2: :session $3}${4: :async yes}
$0
#+end_src
# Matrix (latex)
snippet matrix
\left \(
\begin{array}{${1:ccc}}
${2:v1 & v2} \\
$0
\end{array}
\right \)
# Name
snippet name
#+name: $0
# Quote
snippet quote
#+begin_quote
$0
#+end_quote
# Source
snippet src
#+begin_src $1
$0
#+end_src
# Todo
snippet todo
TODO ${1:task description}
# Verse
snippet verse
#+begin_verse
$0
#+end_verse
# Atrribute Width
snippet #+attr_html:width
#+attr_html: :width ${1:500px}

View file

@ -44,6 +44,10 @@ snippet def
def ${1:method_name} def ${1:method_name}
${0} ${0}
end end
snippet defm
def ${1:method}
@$1 ||= ${0}
end
snippet deft snippet deft
def test_${1:case_name} def test_${1:case_name}
${0} ${0}
@ -372,6 +376,8 @@ snippet finad
end end
snippet gre snippet gre
grep(${1:/pattern/}) { |${2:match}| ${0} } grep(${1:/pattern/}) { |${2:match}| ${0} }
snippet grepv
select { |${1:line}| $1 !~ ${2:/pattern/} }${0}
snippet sub snippet sub
${1:g}sub(${2:/pattern/}) { |${3:match}| ${0} } ${1:g}sub(${2:/pattern/}) { |${3:match}| ${0} }
snippet sca snippet sca

View file

@ -68,6 +68,7 @@ vim-indent-guides https://github.com/nathanaelkane/vim-indent-guides
mru.vim https://github.com/vim-scripts/mru.vim mru.vim https://github.com/vim-scripts/mru.vim
editorconfig-vim https://github.com/editorconfig/editorconfig-vim editorconfig-vim https://github.com/editorconfig/editorconfig-vim
dracula https://github.com/dracula/vim dracula https://github.com/dracula/vim
co-pilot.vim https://github.com/github/copilot.vim
""".strip() """.strip()
GITHUB_ZIP = "%s/archive/master.zip" GITHUB_ZIP = "%s/archive/master.zip"