Add editorconfig-vim
This commit is contained in:
parent
6dcddbb0dc
commit
df64adb290
36 changed files with 3545 additions and 0 deletions
107
pack/acp/start/editorconfig-vim/.appveyor.yml
Normal file
107
pack/acp/start/editorconfig-vim/.appveyor.yml
Normal file
|
@ -0,0 +1,107 @@
|
|||
# appveyor.yml for editorconfig-vim. Currently only tests the core.
|
||||
# Modified from https://github.com/ppalaga/ec4j/commit/1c849658fb189cd95bc41af95acd43b4f0d75a48
|
||||
#
|
||||
# Copyright (c) 2017--2019 Angelo Zerr and other contributors as
|
||||
# indicated by the @author tags.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# @author Chris White (cxw42) - Adapted to editorconfig-vim
|
||||
|
||||
# === When to build ===
|
||||
# See https://www.appveyor.com/docs/how-to/filtering-commits/
|
||||
|
||||
skip_commits:
|
||||
message: /\[minor\]/
|
||||
files:
|
||||
- '**/*.md'
|
||||
|
||||
# === Build matrix ===
|
||||
|
||||
# Win is default; Ubuntu is override. See
|
||||
# https://www.appveyor.com/blog/2018/04/25/specialized-build-matrix-configuration-in-appveyor/
|
||||
image:
|
||||
- Visual Studio 2013
|
||||
- Ubuntu1604
|
||||
|
||||
# === How to build ===
|
||||
|
||||
cache:
|
||||
- C:\vim -> .appveyor.yml, tests\fetch-vim.bat
|
||||
|
||||
environment:
|
||||
VIM_EXE: C:\vim\vim\vim80\vim.exe
|
||||
|
||||
for:
|
||||
# Don't run the Windows build if the commit message includes "[ci-linux]"
|
||||
-
|
||||
matrix:
|
||||
only:
|
||||
- image: Visual Studio 2013
|
||||
skip_commits:
|
||||
message: /\[ci-linux\]/
|
||||
|
||||
# Platform-specific configuration for Ubuntu
|
||||
-
|
||||
matrix:
|
||||
only:
|
||||
- image: Ubuntu1604
|
||||
# $APPVEYOR_BUILD_FOLDER isn't expanded in the environment section
|
||||
# here, so I can't set $VIM_EXE the way I want to. Instead,
|
||||
# I set $VIM_EXE in the sh-specific install steps below.
|
||||
environment:
|
||||
VIM_EXE: UNDEFINED
|
||||
cache:
|
||||
- $APPVEYOR_BUILD_FOLDER/vim -> .appveyor.yml, tests/fetch-vim.sh
|
||||
|
||||
# Plus, don't run Ubuntu if the commit message includes [ci-win]
|
||||
skip_commits:
|
||||
message: /\[ci-win\]/
|
||||
|
||||
install:
|
||||
# Ubuntu-specific setup. These carry forward to the build_script.
|
||||
- sh: export VIM_EXE="$APPVEYOR_BUILD_FOLDER/vim/bin/vim"
|
||||
- sh: export PATH="$PATH":$APPVEYOR_BUILD_FOLDER/vim/bin
|
||||
- sh: echo "$VIM_EXE , $PATH"
|
||||
|
||||
# Cross-platform - test the core
|
||||
- cmake --version
|
||||
- git submodule update --init --recursive
|
||||
- cmd: tests\fetch-vim
|
||||
- sh: tests/fetch-vim.sh
|
||||
|
||||
build_script:
|
||||
# Build the core tests
|
||||
- cd tests
|
||||
- cd core
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake ..
|
||||
|
||||
# Note on multicore testing:
|
||||
# Two cores are available per https://help.appveyor.com/discussions/questions/11179-how-many-cores-and-threads-can-be-used-in-free-appveyor-build .
|
||||
# However, using -j2 seems to make each job take much longer.
|
||||
|
||||
test_script:
|
||||
# Run the core tests
|
||||
- ctest . --output-on-failure -C Debug
|
||||
|
||||
# CTestCustom specifies skipping UTF-8 tests on Windows.
|
||||
- cmd: echo "Reminder - did not try UTF-8"
|
||||
- sh: echo "Reminder - tried UTF-8"
|
||||
|
||||
on_failure:
|
||||
- echo "failed"
|
||||
- cmd: type tests\core\build\Testing\Temporary\LastTest.log
|
||||
- sh: cat tests/core/build/Testing/Temporary/LastTest.log
|
||||
|
27
pack/acp/start/editorconfig-vim/.editorconfig
Normal file
27
pack/acp/start/editorconfig-vim/.editorconfig
Normal file
|
@ -0,0 +1,27 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
max_line_length = 80
|
||||
|
||||
[*.{vim,sh}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
max_line_length = 80
|
||||
|
||||
[*.rb]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
max_line_length = 120
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{bat,vbs,ps1}]
|
||||
end_of_line = CRLF
|
8
pack/acp/start/editorconfig-vim/.gitignore
vendored
Normal file
8
pack/acp/start/editorconfig-vim/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
tags
|
||||
tests/**/build
|
||||
tests/**/.bundle
|
||||
|
||||
# Editor backup files
|
||||
*.swp
|
||||
*~
|
||||
~*
|
6
pack/acp/start/editorconfig-vim/.gitmodules
vendored
Normal file
6
pack/acp/start/editorconfig-vim/.gitmodules
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
[submodule "plugin_tests"]
|
||||
path = tests/plugin/spec/plugin_tests
|
||||
url = https://github.com/editorconfig/editorconfig-plugin-tests.git
|
||||
[submodule "core_tests"]
|
||||
path = tests/core/tests
|
||||
url = https://github.com/editorconfig/editorconfig-core-test.git
|
30
pack/acp/start/editorconfig-vim/.travis.yml
Normal file
30
pack/acp/start/editorconfig-vim/.travis.yml
Normal file
|
@ -0,0 +1,30 @@
|
|||
# Make sure xvfb works - https://docs.travis-ci.com/user/gui-and-headless-browsers/#using-xvfb-directly
|
||||
dist: trusty
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- name: "plugin"
|
||||
env: TEST_WHICH=plugin
|
||||
language: ruby
|
||||
rvm:
|
||||
- 2.2.4
|
||||
gemfile: tests/plugin/Gemfile
|
||||
- name: "core"
|
||||
env: TEST_WHICH=core
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- vim-gtk
|
||||
|
||||
before_script:
|
||||
- "export DISPLAY=:99.0"
|
||||
- "sh -e /etc/init.d/xvfb start"
|
||||
|
||||
script:
|
||||
./tests/travis-test.sh
|
||||
|
||||
notifications:
|
||||
email:
|
||||
on_success: change
|
||||
on_failure: always
|
6
pack/acp/start/editorconfig-vim/CONTRIBUTORS
Normal file
6
pack/acp/start/editorconfig-vim/CONTRIBUTORS
Normal file
|
@ -0,0 +1,6 @@
|
|||
Contributors to the EditorConfig Vim Plugin:
|
||||
|
||||
Hong Xu
|
||||
Trey Hunner
|
||||
Kent Frazier
|
||||
Chris White
|
26
pack/acp/start/editorconfig-vim/LICENSE
Normal file
26
pack/acp/start/editorconfig-vim/LICENSE
Normal file
|
@ -0,0 +1,26 @@
|
|||
Unless otherwise stated, all files are distributed under the Simplified BSD
|
||||
license included below.
|
||||
|
||||
Copyright (c) 2011-2019 EditorConfig Team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
53
pack/acp/start/editorconfig-vim/LICENSE.PSF
Executable file
53
pack/acp/start/editorconfig-vim/LICENSE.PSF
Executable file
|
@ -0,0 +1,53 @@
|
|||
Some code in editorconfig-vim is derived from code licensed under the
|
||||
PSF license. The following is the text of that license, retrieved 2019-05-05
|
||||
from https://docs.python.org/2.6/license.html#terms-and-conditions-for-accessing-or-otherwise-using-python
|
||||
|
||||
PSF LICENSE AGREEMENT FOR PYTHON 2.6.9
|
||||
|
||||
1. This LICENSE AGREEMENT is between the Python Software Foundation
|
||||
(``PSF''), and the Individual or Organization (``Licensee'') accessing and
|
||||
otherwise using Python 2.6.9 software in source or binary form and its
|
||||
associated documentation.
|
||||
|
||||
2. Subject to the terms and conditions of this License Agreement, PSF
|
||||
hereby grants Licensee a nonexclusive, royalty-free, world-wide
|
||||
license to reproduce, analyze, test, perform and/or display publicly,
|
||||
prepare derivative works, distribute, and otherwise use Python 2.6.9
|
||||
alone or in any derivative version, provided, however, that PSF's
|
||||
License Agreement and PSF's notice of copyright, i.e., ``Copyright (c)
|
||||
2001-2010 Python Software Foundation; All Rights Reserved'' are
|
||||
retained in Python 2.6.9 alone or in any derivative version prepared
|
||||
by Licensee.
|
||||
|
||||
3. In the event Licensee prepares a derivative work that is based on
|
||||
or incorporates Python 2.6.9 or any part thereof, and wants to make
|
||||
the derivative work available to others as provided herein, then
|
||||
Licensee hereby agrees to include in any such work a brief summary of
|
||||
the changes made to Python 2.6.9.
|
||||
|
||||
4. PSF is making Python 2.6.9 available to Licensee on an ``AS IS''
|
||||
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.
|
||||
BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY
|
||||
REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY
|
||||
PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.6.9 WILL NOT INFRINGE
|
||||
ANY THIRD PARTY RIGHTS.
|
||||
|
||||
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
||||
2.6.9 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
||||
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.6.9,
|
||||
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
6. This License Agreement will automatically terminate upon a material
|
||||
breach of its terms and conditions.
|
||||
|
||||
7. Nothing in this License Agreement shall be deemed to create any
|
||||
relationship of agency, partnership, or joint venture between PSF and
|
||||
Licensee. This License Agreement does not grant permission to use PSF
|
||||
trademarks or trade name in a trademark sense to endorse or promote
|
||||
products or services of Licensee, or any third party.
|
||||
|
||||
8. By copying, installing or otherwise using Python 2.6.9, Licensee
|
||||
agrees to be bound by the terms and conditions of this License
|
||||
Agreement.
|
||||
|
||||
# vi: set ft=:
|
148
pack/acp/start/editorconfig-vim/README.md
Normal file
148
pack/acp/start/editorconfig-vim/README.md
Normal file
|
@ -0,0 +1,148 @@
|
|||
# EditorConfig Vim Plugin
|
||||
|
||||
[![Travis Build Status](https://img.shields.io/travis/cxw42/editorconfig-vim.svg?logo=travis)](https://travis-ci.org/editorconfig/editorconfig-vim)
|
||||
[![Appveyor Build Status](https://img.shields.io/appveyor/ci/cxw42/editorconfig-vim.svg?logo=appveyor)](https://ci.appveyor.com/project/cxw42/editorconfig-vim)
|
||||
|
||||
This is an [EditorConfig][] plugin for Vim. This plugin can be found on both
|
||||
[GitHub][] and [Vim online][].
|
||||
|
||||
## Installation
|
||||
|
||||
To install this plugin, you can use one of the following ways:
|
||||
|
||||
### Install with the archive
|
||||
|
||||
Download the [archive][] and extract it into your Vim runtime directory
|
||||
(`~/.vim` on UNIX/Linux and `$VIM_INSTALLATION_FOLDER\vimfiles` on windows).
|
||||
You should have 3 sub-directories in this runtime directory now: "autoload",
|
||||
"doc" and "plugin".
|
||||
|
||||
### Install as Vim8 plugin
|
||||
|
||||
Install as a Vim 8 plugin. Note `local` can be any name, but some path
|
||||
element must be present. On Windows, instead of `~/.vim` use
|
||||
`$VIM_INSTALLATION_FOLDER\vimfiles`.
|
||||
```shell
|
||||
mkdir -p ~/.vim/pack/local/start
|
||||
cd ~/.vim/pack/local/start
|
||||
git clone https://github.com/editorconfig/editorconfig-vim.git
|
||||
```
|
||||
|
||||
### Install with [pathogen][]
|
||||
|
||||
Use pathogen (the git repository of this plugin is
|
||||
https://github.com/editorconfig/editorconfig-vim.git)
|
||||
|
||||
### Install with [Vundle][]
|
||||
|
||||
Use Vundle by adding to your `.vimrc` Vundle plugins section:
|
||||
|
||||
```viml
|
||||
Plugin 'editorconfig/editorconfig-vim'
|
||||
```
|
||||
|
||||
Then call `:PluginInstall`.
|
||||
|
||||
### Install with [vim-plug][]
|
||||
|
||||
Use vim-plug by adding to your `.vimrc` in your plugin section:
|
||||
|
||||
```viml
|
||||
Plug 'editorconfig/editorconfig-vim'
|
||||
```
|
||||
|
||||
Source your `.vimrc` by calling `:source $MYVIMRC`.
|
||||
|
||||
Then call `:PlugInstall`.
|
||||
|
||||
### No external editorconfig core library is required
|
||||
|
||||
Previous versions of this plugin also required a Python "core".
|
||||
The core included the code to parse `.editorconfig` files.
|
||||
This plugin **includes** the core, so you don't need to download the
|
||||
core separately.
|
||||
|
||||
## Supported properties
|
||||
|
||||
The EditorConfig Vim plugin supports the following EditorConfig [properties][]:
|
||||
|
||||
* `indent_style`
|
||||
* `indent_size`
|
||||
* `tab_width`
|
||||
* `end_of_line`
|
||||
* `charset`
|
||||
* `insert_final_newline` (Feature `+fixendofline`, available on Vim 7.4.785+,
|
||||
or [PreserveNoEOL][] is required for this property)
|
||||
* `trim_trailing_whitespace`
|
||||
* `max_line_length`
|
||||
* `root` (only used by EditorConfig core)
|
||||
|
||||
## Selected Options
|
||||
|
||||
The supported options are documented in [editorconfig.txt][]
|
||||
and can be viewed by executing the following: `:help editorconfig`. You may
|
||||
need to execute `:helptags ALL` so that Vim is aware of editorconfig.txt.
|
||||
|
||||
### Excluded patterns
|
||||
|
||||
To ensure that this plugin works well with [Tim Pope's fugitive][], use the
|
||||
following patterns array:
|
||||
|
||||
```viml
|
||||
let g:EditorConfig_exclude_patterns = ['fugitive://.*']
|
||||
```
|
||||
|
||||
If you wanted to avoid loading EditorConfig for any remote files over ssh:
|
||||
|
||||
```viml
|
||||
let g:EditorConfig_exclude_patterns = ['scp://.*']
|
||||
```
|
||||
|
||||
Of course these two items could be combined into the following:
|
||||
|
||||
```viml
|
||||
let g:EditorConfig_exclude_patterns = ['fugitive://.*', 'scp://.*']
|
||||
```
|
||||
|
||||
### Disable for a specific filetype
|
||||
|
||||
You can disable this plugin for a specific buffer by setting
|
||||
`b:EditorConfig_disable`. Therefore, you can disable the
|
||||
plugin for all buffers of a specific filetype. For example, to disable
|
||||
EditorConfig for all git commit messages (filetype `gitcommit`):
|
||||
|
||||
```viml
|
||||
au FileType gitcommit let b:EditorConfig_disable = 1
|
||||
```
|
||||
|
||||
### Disable rules
|
||||
|
||||
In very rare cases,
|
||||
you might need to override some project-specific EditorConfig rules in global
|
||||
or local vimrc in some cases, e.g., to resolve conflicts of trailing whitespace
|
||||
trimming and buffer autosaving. This is not recommended, but you can:
|
||||
|
||||
```viml
|
||||
let g:EditorConfig_disable_rules = ['trim_trailing_whitespace']
|
||||
```
|
||||
|
||||
You are able to disable any supported EditorConfig properties.
|
||||
|
||||
## Bugs and Feature Requests
|
||||
|
||||
Feel free to submit bugs, feature requests, and other issues to the
|
||||
[issue tracker][]. Be sure you have read the [contribution guidelines][]!
|
||||
|
||||
[EditorConfig]: http://editorconfig.org
|
||||
[GitHub]: https://github.com/editorconfig/editorconfig-vim
|
||||
[PreserveNoEOL]: http://www.vim.org/scripts/script.php?script_id=4550
|
||||
[Tim Pope's fugitive]: https://github.com/tpope/vim-fugitive
|
||||
[Vim online]: http://www.vim.org/scripts/script.php?script_id=3934
|
||||
[Vundle]: https://github.com/gmarik/Vundle.vim
|
||||
[archive]: https://github.com/editorconfig/editorconfig-vim/archive/master.zip
|
||||
[contribution guidelines]: https://github.com/editorconfig/editorconfig/blob/master/CONTRIBUTING.md#submitting-an-issue
|
||||
[issue tracker]: https://github.com/editorconfig/editorconfig-vim/issues
|
||||
[pathogen]: https://github.com/tpope/vim-pathogen
|
||||
[properties]: http://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties
|
||||
[editorconfig.txt]: https://github.com/editorconfig/editorconfig-vim/blob/master/doc/editorconfig.txt
|
||||
[vim-plug]: https://github.com/junegunn/vim-plug
|
60
pack/acp/start/editorconfig-vim/autoload/editorconfig.vim
Normal file
60
pack/acp/start/editorconfig-vim/autoload/editorconfig.vim
Normal file
|
@ -0,0 +1,60 @@
|
|||
" autoload/editorconfig.vim: EditorConfig native Vimscript plugin
|
||||
" Copyright (c) 2011-2019 EditorConfig Team
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE.
|
||||
"
|
||||
|
||||
if v:version < 700
|
||||
finish
|
||||
endif
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" {{{1 variables
|
||||
let s:hook_list = []
|
||||
|
||||
function! editorconfig#AddNewHook(func) " {{{1
|
||||
" Add a new hook
|
||||
|
||||
call add(s:hook_list, a:func)
|
||||
endfunction
|
||||
|
||||
function! editorconfig#ApplyHooks(config) abort " {{{1
|
||||
" apply hooks
|
||||
|
||||
for Hook in s:hook_list
|
||||
let l:hook_ret = Hook(a:config)
|
||||
|
||||
if type(l:hook_ret) != type(0) && l:hook_ret != 0
|
||||
" TODO print some debug info here
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vim: fdm=marker fdc=3
|
147
pack/acp/start/editorconfig-vim/autoload/editorconfig_core.vim
Normal file
147
pack/acp/start/editorconfig-vim/autoload/editorconfig_core.vim
Normal file
|
@ -0,0 +1,147 @@
|
|||
" autoload/editorconfig_core.vim: top-level functions for
|
||||
" editorconfig-core-vimscript and editorconfig-vim.
|
||||
|
||||
" Copyright (c) 2018-2020 EditorConfig Team, including Chris White {{{1
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE. }}}1
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" Variables {{{1
|
||||
|
||||
" Note: we create this variable in every script that accesses it. Normally, I
|
||||
" would put this in plugin/editorconfig.vim. However, in some of my tests,
|
||||
" the command-line testing environment did not load plugin/* in the normal
|
||||
" way. Therefore, I do the check everywhere so I don't have to special-case
|
||||
" the command line.
|
||||
|
||||
if !exists('g:editorconfig_core_vimscript_debug')
|
||||
let g:editorconfig_core_vimscript_debug = 0
|
||||
endif
|
||||
" }}}1
|
||||
|
||||
" The latest version of the specification that we support.
|
||||
" See discussion at https://github.com/editorconfig/editorconfig/issues/395
|
||||
function! editorconfig_core#version()
|
||||
return [0,13,0]
|
||||
endfunction
|
||||
|
||||
" === CLI =============================================================== {{{1
|
||||
|
||||
" For use from the command line. Output settings for in_name to
|
||||
" the buffer named out_name. If an optional argument is provided, it is the
|
||||
" name of the config file to use (default '.editorconfig').
|
||||
" TODO support multiple files
|
||||
"
|
||||
" filename (if any)
|
||||
" @param names {Dictionary} The names of the files to use for this run
|
||||
" - output [required] Where the editorconfig settings should be written
|
||||
" - target [required] A string or list of strings to process. Each
|
||||
" must be a full path.
|
||||
" - dump [optional] If present, write debug info to this file
|
||||
" @param job {Dictionary} What to do - same format as the input of
|
||||
" editorconfig_core#handler#get_configurations(),
|
||||
" except without the target member.
|
||||
|
||||
function! editorconfig_core#currbuf_cli(names, job) " out_name, in_name, ...
|
||||
let l:output = []
|
||||
|
||||
" Preprocess the job
|
||||
let l:job = deepcopy(a:job)
|
||||
|
||||
if has_key(l:job, 'version') " string to list
|
||||
let l:ver = split(editorconfig_core#util#strip(l:job.version), '\v\.')
|
||||
for l:idx in range(len(l:ver))
|
||||
let l:ver[l:idx] = str2nr(l:ver[l:idx])
|
||||
endfor
|
||||
|
||||
let l:job.version = l:ver
|
||||
endif
|
||||
|
||||
" TODO provide version output from here instead of the shell script
|
||||
" if string(a:names) ==? 'version'
|
||||
" return
|
||||
" endif
|
||||
"
|
||||
if type(a:names) != type({}) || type(a:job) != type({})
|
||||
throw 'Need two Dictionary arguments'
|
||||
endif
|
||||
|
||||
if has_key(a:names, 'dump')
|
||||
execute 'redir! > ' . fnameescape(a:names.dump)
|
||||
echom 'Names: ' . string(a:names)
|
||||
echom 'Job: ' . string(l:job)
|
||||
let g:editorconfig_core_vimscript_debug = 1
|
||||
endif
|
||||
|
||||
if type(a:names['target']) == type([])
|
||||
let l:targets = a:names.target
|
||||
else
|
||||
let l:targets = [a:names.target]
|
||||
endif
|
||||
|
||||
for l:target in l:targets
|
||||
|
||||
" Pre-process quoting weirdness so we are more flexible in the face
|
||||
" of CMake+CTest+BAT+Powershell quoting.
|
||||
|
||||
" Permit wrapping in double-quotes
|
||||
let l:target = substitute(l:target, '\v^"(.*)"$', '\1', '')
|
||||
|
||||
" Permit empty ('') entries in l:targets
|
||||
if strlen(l:target)<1
|
||||
continue
|
||||
endif
|
||||
|
||||
if has_key(a:names, 'dump')
|
||||
echom 'Trying: ' . string(l:target)
|
||||
endif
|
||||
|
||||
let l:job.target = l:target
|
||||
let l:options = editorconfig_core#handler#get_configurations(l:job)
|
||||
|
||||
if has_key(a:names, 'dump')
|
||||
echom 'editorconfig_core#currbuf_cli result: ' . string(l:options)
|
||||
endif
|
||||
|
||||
if len(l:targets) > 1
|
||||
let l:output += [ '[' . l:target . ']' ]
|
||||
endif
|
||||
|
||||
for [ l:key, l:value ] in items(l:options)
|
||||
let l:output += [ l:key . '=' . l:value ]
|
||||
endfor
|
||||
|
||||
endfor "foreach target
|
||||
|
||||
" Write the output file
|
||||
call writefile(l:output, a:names.output)
|
||||
endfunction "editorconfig_core#currbuf_cli
|
||||
|
||||
" }}}1
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vi: set fdm=marker fo-=ro:
|
|
@ -0,0 +1,465 @@
|
|||
" autoload/editorconfig_core/fnmatch.vim: Globbing for
|
||||
" editorconfig-vim. Ported from the Python core's fnmatch.py.
|
||||
|
||||
" Copyright (c) 2012-2019 EditorConfig Team {{{1
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE. }}}1
|
||||
|
||||
"Filename matching with shell patterns.
|
||||
"
|
||||
"fnmatch(FILENAME, PATH, PATTERN) matches according to the local convention.
|
||||
"fnmatchcase(FILENAME, PATH, PATTERN) always takes case in account.
|
||||
"
|
||||
"The functions operate by translating the pattern into a regular
|
||||
"expression. They cache the compiled regular expressions for speed.
|
||||
"
|
||||
"The function translate(PATTERN) returns a regular expression
|
||||
"corresponding to PATTERN. (It does not compile it.)
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" variables {{{1
|
||||
if !exists('g:editorconfig_core_vimscript_debug')
|
||||
let g:editorconfig_core_vimscript_debug = 0
|
||||
endif
|
||||
" }}}1
|
||||
" === Regexes =========================================================== {{{1
|
||||
let s:LEFT_BRACE = '\v%(^|[^\\])\{'
|
||||
"LEFT_BRACE = re.compile(
|
||||
" r"""
|
||||
"
|
||||
" (?: ^ | [^\\] ) # Beginning of string or a character besides "\"
|
||||
"
|
||||
" \{ # "{"
|
||||
"
|
||||
" """, re.VERBOSE
|
||||
")
|
||||
|
||||
let s:RIGHT_BRACE = '\v%(^|[^\\])\}'
|
||||
"RIGHT_BRACE = re.compile(
|
||||
" r"""
|
||||
"
|
||||
" (?: ^ | [^\\] ) # Beginning of string or a character besides "\"
|
||||
"
|
||||
" \} # "}"
|
||||
"
|
||||
" """, re.VERBOSE
|
||||
")
|
||||
|
||||
let s:NUMERIC_RANGE = '\v([+-]?\d+)' . '\.\.' . '([+-]?\d+)'
|
||||
"NUMERIC_RANGE = re.compile(
|
||||
" r"""
|
||||
" ( # Capture a number
|
||||
" [+-] ? # Zero or one "+" or "-" characters
|
||||
" \d + # One or more digits
|
||||
" )
|
||||
"
|
||||
" \.\. # ".."
|
||||
"
|
||||
" ( # Capture a number
|
||||
" [+-] ? # Zero or one "+" or "-" characters
|
||||
" \d + # One or more digits
|
||||
" )
|
||||
" """, re.VERBOSE
|
||||
")
|
||||
|
||||
" }}}1
|
||||
" === Internal functions ================================================ {{{1
|
||||
|
||||
" Dump the bytes of a:text. For debugging use.
|
||||
function! s:dump_bytes(text)
|
||||
let l:idx=0
|
||||
while l:idx < strlen(a:text)
|
||||
let l:byte_val = char2nr(a:text[l:idx])
|
||||
echom printf('%10s%-5d%02x %s', '', l:idx, l:byte_val,
|
||||
\ a:text[l:idx])
|
||||
let l:idx+=1
|
||||
endwhile
|
||||
endfunction "s:dump_bytes
|
||||
|
||||
" Dump the characters of a:text and their codepoints. For debugging use.
|
||||
function! s:dump_chars(text)
|
||||
let l:chars = split(a:text, '\zs')
|
||||
let l:idx = 0
|
||||
let l:out1 = ''
|
||||
let l:out2 = ''
|
||||
while l:idx < len(l:chars)
|
||||
let l:char = l:chars[l:idx]
|
||||
let l:out1 .= printf('%5s', l:char)
|
||||
let l:out2 .= printf('%5x', char2nr(l:char))
|
||||
let l:idx+=1
|
||||
endwhile
|
||||
|
||||
echom l:out1
|
||||
echom l:out2
|
||||
endfunction "s:dump_chars
|
||||
|
||||
" }}}1
|
||||
" === Translating globs to patterns ===================================== {{{1
|
||||
|
||||
" Used by s:re_escape: backslash-escape any character below U+0080;
|
||||
" replace all others with a %U escape.
|
||||
" See https://vi.stackexchange.com/a/19617/1430 by yours truly
|
||||
" (https://vi.stackexchange.com/users/1430/cxw).
|
||||
unlockvar s:replacement_expr
|
||||
let s:replacement_expr =
|
||||
\ '\=' .
|
||||
\ '((char2nr(submatch(1)) >= 128) ? ' .
|
||||
\ 'printf("%%U%08x", char2nr(submatch(1))) : ' .
|
||||
\ '("\\" . submatch(1))' .
|
||||
\ ')'
|
||||
lockvar s:replacement_expr
|
||||
|
||||
" Escaper for very-magic regexes
|
||||
function! s:re_escape(text)
|
||||
return substitute(a:text, '\v([^0-9a-zA-Z_])', s:replacement_expr, 'g')
|
||||
endfunction
|
||||
|
||||
"def translate(pat, nested=0):
|
||||
" Translate a shell PATTERN to a regular expression.
|
||||
" There is no way to quote meta-characters.
|
||||
function! editorconfig_core#fnmatch#translate(pat, ...)
|
||||
let l:nested = 0
|
||||
if a:0
|
||||
let l:nested = a:1
|
||||
endif
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom '- fnmatch#translate: pattern ' . a:pat
|
||||
echom printf(
|
||||
\ '- %d chars', strlen(substitute(a:pat, ".", "x", "g")))
|
||||
call s:dump_chars(a:pat)
|
||||
endif
|
||||
|
||||
let l:pat = a:pat " TODO remove if we wind up not needing this
|
||||
|
||||
" Note: the Python sets MULTILINE and DOTALL, but Vim has \_.
|
||||
" instead of DOTALL, and \_^ / \_$ instead of MULTILINE.
|
||||
|
||||
let l:is_escaped = 0
|
||||
|
||||
" Find out whether the pattern has balanced braces.
|
||||
let l:left_braces=[]
|
||||
let l:right_braces=[]
|
||||
call substitute(l:pat, s:LEFT_BRACE, '\=add(l:left_braces, 1)', 'g')
|
||||
call substitute(l:pat, s:RIGHT_BRACE, '\=add(l:right_braces, 1)', 'g')
|
||||
" Thanks to http://jeromebelleman.gitlab.io/posts/productivity/vimsub/
|
||||
let l:matching_braces = (len(l:left_braces) == len(l:right_braces))
|
||||
|
||||
" Unicode support (#2). Indexing l:pat[l:index] returns bytes, per
|
||||
" https://github.com/neovim/neovim/issues/68#issue-28114985 .
|
||||
" Instead, use split() per vimdoc to break the input string into an
|
||||
" array of *characters*, and process that.
|
||||
let l:characters = split(l:pat, '\zs')
|
||||
|
||||
let l:index = 0 " character index
|
||||
let l:length = len(l:characters)
|
||||
let l:brace_level = 0
|
||||
let l:in_brackets = 0
|
||||
|
||||
let l:result = ''
|
||||
let l:numeric_groups = []
|
||||
while l:index < l:length
|
||||
let l:current_char = l:characters[l:index]
|
||||
let l:index += 1
|
||||
|
||||
" if g:editorconfig_core_vimscript_debug
|
||||
" echom ' - fnmatch#translate: ' . l:current_char . '@' .
|
||||
" \ (l:index-1) . '; result ' . l:result
|
||||
" endif
|
||||
|
||||
if l:current_char ==# '*'
|
||||
let l:pos = l:index
|
||||
if l:pos < l:length && l:characters[l:pos] ==# '*'
|
||||
let l:result .= '\_.*'
|
||||
let l:index += 1 " skip the second star
|
||||
else
|
||||
let l:result .= '[^/]*'
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# '?'
|
||||
let l:result .= '\_[^/]'
|
||||
|
||||
elseif l:current_char ==# '['
|
||||
if l:in_brackets
|
||||
let l:result .= '\['
|
||||
else
|
||||
let l:pos = l:index
|
||||
let l:has_slash = 0
|
||||
while l:pos < l:length && l:characters[l:pos] != ']'
|
||||
if l:characters[l:pos] ==# '/' && l:characters[l:pos-1] !=# '\'
|
||||
let has_slash = 1
|
||||
break
|
||||
endif
|
||||
let l:pos += 1
|
||||
endwhile
|
||||
if l:has_slash
|
||||
" POSIX IEEE 1003.1-2017 sec. 2.13.3: '/' cannot occur
|
||||
" in a bracket expression, so [/] matches a literal
|
||||
" three-character string '[' . '/' . ']'.
|
||||
let l:result .= '\['
|
||||
\ . s:re_escape(join(l:characters[l:index : l:pos-1], ''))
|
||||
\ . '\/'
|
||||
" escape the slash
|
||||
let l:index = l:pos + 1
|
||||
" resume after the slash
|
||||
else
|
||||
if l:index < l:length && l:characters[l:index] =~# '\v%(\^|\!)'
|
||||
let l:index += 1
|
||||
let l:result .= '[^'
|
||||
else
|
||||
let l:result .= '['
|
||||
endif
|
||||
let l:in_brackets = 1
|
||||
endif
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# '-'
|
||||
if l:in_brackets
|
||||
let l:result .= l:current_char
|
||||
else
|
||||
let l:result .= '\' . l:current_char
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# ']'
|
||||
if l:in_brackets && !l:is_escaped
|
||||
let l:result .= ']'
|
||||
let l:in_brackets = 0
|
||||
elseif l:is_escaped
|
||||
let l:result .= '\]'
|
||||
let l:is_escaped = 0
|
||||
else
|
||||
let l:result .= '\]'
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# '{'
|
||||
let l:pos = l:index
|
||||
let l:has_comma = 0
|
||||
while l:pos < l:length && (l:characters[l:pos] !=# '}' || l:is_escaped)
|
||||
if l:characters[l:pos] ==# ',' && ! l:is_escaped
|
||||
let l:has_comma = 1
|
||||
break
|
||||
endif
|
||||
let l:is_escaped = l:characters[l:pos] ==# '\' && ! l:is_escaped
|
||||
let l:pos += 1
|
||||
endwhile
|
||||
if ! l:has_comma && l:pos < l:length
|
||||
let l:num_range =
|
||||
\ matchlist(join(l:characters[l:index : l:pos-1], ''),
|
||||
\ s:NUMERIC_RANGE)
|
||||
if len(l:num_range) > 0 " Remember the ranges
|
||||
call add(l:numeric_groups, [ 0+l:num_range[1], 0+l:num_range[2] ])
|
||||
let l:result .= '([+-]?\d+)'
|
||||
else
|
||||
let l:inner_xlat = editorconfig_core#fnmatch#translate(
|
||||
\ join(l:characters[l:index : l:pos-1], ''), 1)
|
||||
let l:inner_result = l:inner_xlat[0]
|
||||
let l:inner_groups = l:inner_xlat[1]
|
||||
let l:result .= '\{' . l:inner_result . '\}'
|
||||
let l:numeric_groups += l:inner_groups
|
||||
endif
|
||||
let l:index = l:pos + 1
|
||||
elseif l:matching_braces
|
||||
let l:result .= '%('
|
||||
let l:brace_level += 1
|
||||
else
|
||||
let l:result .= '\{'
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# ','
|
||||
if l:brace_level > 0 && ! l:is_escaped
|
||||
let l:result .= '|'
|
||||
else
|
||||
let l:result .= '\,'
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# '}'
|
||||
if l:brace_level > 0 && ! l:is_escaped
|
||||
let l:result .= ')'
|
||||
let l:brace_level -= 1
|
||||
else
|
||||
let l:result .= '\}'
|
||||
endif
|
||||
|
||||
elseif l:current_char ==# '/'
|
||||
if join(l:characters[l:index : (l:index + 2)], '') ==# '**/'
|
||||
let l:result .= '%(/|/\_.*/)'
|
||||
let l:index += 3
|
||||
else
|
||||
let l:result .= '\/'
|
||||
endif
|
||||
|
||||
elseif l:current_char != '\'
|
||||
let l:result .= s:re_escape(l:current_char)
|
||||
endif
|
||||
|
||||
if l:current_char ==# '\'
|
||||
if l:is_escaped
|
||||
let l:result .= s:re_escape(l:current_char)
|
||||
endif
|
||||
let l:is_escaped = ! l:is_escaped
|
||||
else
|
||||
let l:is_escaped = 0
|
||||
endif
|
||||
|
||||
endwhile
|
||||
|
||||
if ! l:nested
|
||||
let l:result .= '\_$'
|
||||
endif
|
||||
|
||||
return [l:result, l:numeric_groups]
|
||||
endfunction " #editorconfig_core#fnmatch#translate
|
||||
|
||||
let s:_cache = {}
|
||||
function! s:cached_translate(pat)
|
||||
if ! has_key(s:_cache, a:pat)
|
||||
"regex = re.compile(res)
|
||||
let s:_cache[a:pat] =
|
||||
\ editorconfig_core#fnmatch#translate(a:pat)
|
||||
" we don't compile the regex
|
||||
endif
|
||||
return s:_cache[a:pat]
|
||||
endfunction " cached_translate
|
||||
|
||||
" }}}1
|
||||
" === Matching functions ================================================ {{{1
|
||||
|
||||
function! editorconfig_core#fnmatch#fnmatch(name, path, pattern)
|
||||
"def fnmatch(name, pat):
|
||||
" """Test whether FILENAME matches PATH/PATTERN.
|
||||
"
|
||||
" Patterns are Unix shell style:
|
||||
"
|
||||
" - ``*`` matches everything except path separator
|
||||
" - ``**`` matches everything
|
||||
" - ``?`` matches any single character
|
||||
" - ``[seq]`` matches any character in seq
|
||||
" - ``[!seq]`` matches any char not in seq
|
||||
" - ``{s1,s2,s3}`` matches any of the strings given (separated by commas)
|
||||
"
|
||||
" An initial period in FILENAME is not special.
|
||||
" Both FILENAME and PATTERN are first case-normalized
|
||||
" if the operating system requires it.
|
||||
" If you don't want this, use fnmatchcase(FILENAME, PATTERN).
|
||||
" """
|
||||
"
|
||||
" Note: This throws away the backslash in '\.txt' on Cygwin, but that
|
||||
" makes sense since it's Windows under the hood.
|
||||
" We don't care about shellslash since we're going to change backslashes
|
||||
" to slashes in just a moment anyway.
|
||||
let l:localname = fnamemodify(a:name, ':p')
|
||||
|
||||
if editorconfig_core#util#is_win() " normalize
|
||||
let l:localname = substitute(tolower(l:localname), '\v\\', '/', 'g')
|
||||
let l:path = substitute(tolower(a:path), '\v\\', '/', 'g')
|
||||
let l:pattern = tolower(a:pattern)
|
||||
else
|
||||
let l:localname = l:localname
|
||||
let l:path = a:path
|
||||
let l:pattern = a:pattern
|
||||
endif
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom '- fnmatch#fnmatch testing <' . l:localname . '> against <' .
|
||||
\ l:pattern . '> wrt <' . l:path . '>'
|
||||
endif
|
||||
|
||||
return editorconfig_core#fnmatch#fnmatchcase(l:localname, l:path, l:pattern)
|
||||
endfunction " fnmatch
|
||||
|
||||
function! editorconfig_core#fnmatch#fnmatchcase(name, path, pattern)
|
||||
"def fnmatchcase(name, pat):
|
||||
" """Test whether FILENAME matches PATH/PATTERN, including case.
|
||||
"
|
||||
" This is a version of fnmatch() which doesn't case-normalize
|
||||
" its arguments.
|
||||
" """
|
||||
"
|
||||
let [regex, num_groups] = s:cached_translate(a:pattern)
|
||||
|
||||
let l:escaped_path = s:re_escape(a:path)
|
||||
let l:regex = '\v' . l:escaped_path . l:regex
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom '- fnmatch#fnmatchcase: regex ' . l:regex
|
||||
call s:dump_chars(l:regex)
|
||||
echom '- fnmatch#fnmatchcase: checking ' . a:name
|
||||
call s:dump_chars(a:name)
|
||||
endif
|
||||
|
||||
let l:match_groups = matchlist(a:name, l:regex)[1:] " [0] = full match
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom printf(' Got %d matches', len(l:match_groups))
|
||||
endif
|
||||
|
||||
if len(l:match_groups) == 0
|
||||
return 0
|
||||
endif
|
||||
|
||||
" Check numeric ranges
|
||||
let pattern_matched = 1
|
||||
for l:idx in range(0,len(l:match_groups))
|
||||
let l:num = l:match_groups[l:idx]
|
||||
if l:num ==# ''
|
||||
break
|
||||
endif
|
||||
|
||||
let [min_num, max_num] = num_groups[l:idx]
|
||||
if (min_num > (0+l:num)) || ((0+l:num) > max_num)
|
||||
let pattern_matched = 0
|
||||
break
|
||||
endif
|
||||
|
||||
" Reject leading zeros without sign. This is very odd ---
|
||||
" see editorconfig/editorconfig#371.
|
||||
if match(l:num, '\v^0') != -1
|
||||
let pattern_matched = 0
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom '- fnmatch#fnmatchcase: ' . (pattern_matched ? 'matched' : 'did not match')
|
||||
endif
|
||||
|
||||
return pattern_matched
|
||||
endfunction " fnmatchcase
|
||||
|
||||
" }}}1
|
||||
" === Copyright notices ================================================= {{{1
|
||||
" Based on code from fnmatch.py file distributed with Python 2.6.
|
||||
" Portions Copyright (c) 2001-2010 Python Software Foundation;
|
||||
" All Rights Reserved. Licensed under PSF License (see LICENSE.PSF file).
|
||||
"
|
||||
" Changes to original fnmatch:
|
||||
"
|
||||
" - translate function supports ``*`` and ``**`` similarly to fnmatch C library
|
||||
" }}}1
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vi: set fdm=marker:
|
|
@ -0,0 +1,183 @@
|
|||
" autoload/editorconfig_core/handler.vim: Main worker for
|
||||
" editorconfig-core-vimscript and editorconfig-vim.
|
||||
" Modified from the Python core's handler.py.
|
||||
|
||||
" Copyright (c) 2012-2019 EditorConfig Team {{{1
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE. }}}1
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" Return full filepath for filename in each directory in and above path. {{{1
|
||||
" Input path must be an absolute path.
|
||||
" TODO shellslash/shellescape?
|
||||
function! s:get_filenames(path, config_filename)
|
||||
let l:path = a:path
|
||||
let l:path_list = []
|
||||
while 1
|
||||
call add(l:path_list, editorconfig_core#util#path_join(l:path, a:config_filename))
|
||||
let l:newpath = fnamemodify(l:path, ':h')
|
||||
if l:path ==? l:newpath || !strlen(l:path)
|
||||
break
|
||||
endif
|
||||
let l:path = l:newpath
|
||||
endwhile
|
||||
return l:path_list
|
||||
endfunction " get_filenames
|
||||
|
||||
" }}}1
|
||||
" === Main ============================================================== {{{1
|
||||
|
||||
" Find EditorConfig files and return all options matching target_filename.
|
||||
" Throws on failure.
|
||||
" @param job {Dictionary} required 'target'; optional 'config' and 'version'
|
||||
function! editorconfig_core#handler#get_configurations(job)
|
||||
" TODO? support VERSION checks?
|
||||
|
||||
" Special exceptions that may be raised by this function include:
|
||||
" - ``VersionError``: self.version is invalid EditorConfig version
|
||||
" - ``PathError``: self.filepath is not a valid absolute filepath
|
||||
" - ``ParsingError``: improperly formatted EditorConfig file found
|
||||
|
||||
let l:job = deepcopy(a:job)
|
||||
if has_key(l:job, 'config')
|
||||
let l:config_filename = l:job.config
|
||||
else
|
||||
let l:config_filename = '.editorconfig'
|
||||
let l:job.config = l:config_filename
|
||||
endif
|
||||
|
||||
if has_key(l:job, 'version')
|
||||
let l:version = l:job.version
|
||||
else
|
||||
let l:version = editorconfig_core#version()
|
||||
let l:job.version = l:version
|
||||
endif
|
||||
|
||||
let l:target_filename = l:job.target
|
||||
|
||||
"echom 'Beginning job ' . string(l:job)
|
||||
if !s:check_assertions(l:job)
|
||||
throw "Assertions failed"
|
||||
endif
|
||||
|
||||
let l:fullpath = fnamemodify(l:target_filename,':p')
|
||||
let l:path = fnamemodify(l:fullpath, ':h')
|
||||
let l:conf_files = s:get_filenames(l:path, l:config_filename)
|
||||
|
||||
" echom 'fullpath ' . l:fullpath
|
||||
" echom 'path ' . l:path
|
||||
|
||||
let l:retval = {}
|
||||
|
||||
" Attempt to find and parse every EditorConfig file in filetree
|
||||
for l:conf_fn in l:conf_files
|
||||
"echom 'Trying ' . l:conf_fn
|
||||
let l:parsed = editorconfig_core#ini#read_ini_file(l:conf_fn, l:target_filename)
|
||||
if !has_key(l:parsed, 'options')
|
||||
continue
|
||||
endif
|
||||
" echom ' Has options'
|
||||
|
||||
" Merge new EditorConfig file's options into current options
|
||||
let l:old_options = l:retval
|
||||
let l:retval = l:parsed.options
|
||||
" echom 'Old options ' . string(l:old_options)
|
||||
" echom 'New options ' . string(l:retval)
|
||||
call extend(l:retval, l:old_options, 'force')
|
||||
|
||||
" Stop parsing if parsed file has a ``root = true`` option
|
||||
if l:parsed.root
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
|
||||
call s:preprocess_values(l:job, l:retval)
|
||||
return l:retval
|
||||
endfunction " get_configurations
|
||||
|
||||
function! s:check_assertions(job)
|
||||
" TODO
|
||||
" """Raise error if filepath or version have invalid values"""
|
||||
|
||||
" # Raise ``PathError`` if filepath isn't an absolute path
|
||||
" if not os.path.isabs(self.filepath):
|
||||
" raise PathError("Input file must be a full path name.")
|
||||
|
||||
" Throw if version specified is greater than current
|
||||
let l:v = a:job.version
|
||||
let l:us = editorconfig_core#version()
|
||||
" echom 'Comparing requested version ' . string(l:v) .
|
||||
" \ ' to our version ' . string(l:us)
|
||||
if l:v[0] > l:us[0] || l:v[1] > l:us[1] || l:v[2] > l:us[2]
|
||||
throw 'Required version ' . string(l:v) .
|
||||
\ ' is greater than the current version ' . string(l:us)
|
||||
endif
|
||||
|
||||
return 1 " All OK if we got here
|
||||
endfunction " check_assertions
|
||||
|
||||
" }}}1
|
||||
|
||||
" Preprocess option values for consumption by plugins. {{{1
|
||||
" Modifies its argument in place.
|
||||
function! s:preprocess_values(job, opts)
|
||||
|
||||
" Lowercase option value for certain options
|
||||
for l:name in ['end_of_line', 'indent_style', 'indent_size',
|
||||
\ 'insert_final_newline', 'trim_trailing_whitespace',
|
||||
\ 'charset']
|
||||
if has_key(a:opts, l:name)
|
||||
let a:opts[l:name] = tolower(a:opts[l:name])
|
||||
endif
|
||||
endfor
|
||||
|
||||
" Set indent_size to "tab" if indent_size is unspecified and
|
||||
" indent_style is set to "tab", provided we are at least v0.10.0.
|
||||
if get(a:opts, 'indent_style', '') ==? "tab" &&
|
||||
\ !has_key(a:opts, 'indent_size') &&
|
||||
\ ( a:job.version[0]>0 || a:job.version[1] >=10 )
|
||||
let a:opts['indent_size'] = 'tab'
|
||||
endif
|
||||
|
||||
" Set tab_width to indent_size if indent_size is specified and
|
||||
" tab_width is unspecified
|
||||
if has_key(a:opts, 'indent_size') && !has_key(a:opts, 'tab_width') &&
|
||||
\ get(a:opts, 'indent_size', '') !=? "tab"
|
||||
let a:opts['tab_width'] = a:opts['indent_size']
|
||||
endif
|
||||
|
||||
" Set indent_size to tab_width if indent_size is "tab"
|
||||
if has_key(a:opts, 'indent_size') && has_key(a:opts, 'tab_width') &&
|
||||
\ get(a:opts, 'indent_size', '') ==? "tab"
|
||||
let a:opts['indent_size'] = a:opts['tab_width']
|
||||
endif
|
||||
endfunction " preprocess_values
|
||||
|
||||
" }}}1
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vi: set fdm=marker fdl=1:
|
|
@ -0,0 +1,273 @@
|
|||
" autoload/editorconfig_core/ini.vim: Config-file parser for
|
||||
" editorconfig-core-vimscript and editorconfig-vim.
|
||||
" Modifed from the Python core's ini.py.
|
||||
|
||||
" Copyright (c) 2012-2019 EditorConfig Team {{{2
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE. }}}2
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" variables {{{2
|
||||
if !exists('g:editorconfig_core_vimscript_debug')
|
||||
let g:editorconfig_core_vimscript_debug = 0
|
||||
endif
|
||||
" }}}2
|
||||
" === Constants, including regexes ====================================== {{{2
|
||||
" Regular expressions for parsing section headers and options.
|
||||
" Allow ``]`` and escaped ``;`` and ``#`` characters in section headers.
|
||||
" In fact, allow \ to escape any single character - it needs to cover at
|
||||
" least \ * ? [ ! ] { }.
|
||||
unlockvar s:SECTCRE s:OPTCRE s:MAX_SECTION_NAME s:MAX_PROPERTY_NAME s:MAX_PROPERTY_VALUE
|
||||
let s:SECTCRE = '\v^\s*\[(%([^\\#;]|\\.)+)\]'
|
||||
|
||||
" Regular expression for parsing option name/values.
|
||||
" Allow any amount of whitespaces, followed by separator
|
||||
" (either ``:`` or ``=``), followed by any amount of whitespace and then
|
||||
" any characters to eol
|
||||
let s:OPTCRE = '\v\s*([^:=[:space:]][^:=]*)\s*([:=])\s*(.*)$'
|
||||
|
||||
let s:MAX_SECTION_NAME = 4096
|
||||
let s:MAX_PROPERTY_NAME = 50
|
||||
let s:MAX_PROPERTY_VALUE = 255
|
||||
|
||||
lockvar s:SECTCRE s:OPTCRE s:MAX_SECTION_NAME s:MAX_PROPERTY_NAME s:MAX_PROPERTY_VALUE
|
||||
|
||||
" }}}2
|
||||
" === Main ============================================================== {{{1
|
||||
|
||||
" Read \p config_filename and return the options applicable to
|
||||
" \p target_filename. This is the main entry point in this file.
|
||||
function! editorconfig_core#ini#read_ini_file(config_filename, target_filename)
|
||||
let l:oldenc = &encoding
|
||||
|
||||
if !filereadable(a:config_filename)
|
||||
return {}
|
||||
endif
|
||||
|
||||
try " so &encoding will always be reset
|
||||
let &encoding = 'utf-8' " so readfile() will strip BOM
|
||||
let l:lines = readfile(a:config_filename)
|
||||
let result = s:parse(a:config_filename, a:target_filename, l:lines)
|
||||
catch
|
||||
let &encoding = l:oldenc
|
||||
" rethrow, but with a prefix since throw 'Vim...' fails.
|
||||
throw 'Could not read editorconfig file at ' . v:throwpoint . ': ' . string(v:exception)
|
||||
endtry
|
||||
|
||||
let &encoding = l:oldenc
|
||||
return result
|
||||
endfunction
|
||||
|
||||
function! s:parse(config_filename, target_filename, lines)
|
||||
" Parse a sectioned setup file.
|
||||
" The sections in setup file contains a title line at the top,
|
||||
" indicated by a name in square brackets (`[]'), plus key/value
|
||||
" options lines, indicated by `name: value' format lines.
|
||||
" Continuations are represented by an embedded newline then
|
||||
" leading whitespace. Blank lines, lines beginning with a '#',
|
||||
" and just about everything else are ignored.
|
||||
|
||||
let l:in_section = 0
|
||||
let l:matching_section = 0
|
||||
let l:optname = ''
|
||||
let l:lineno = 0
|
||||
let l:e = [] " Errors, if any
|
||||
|
||||
let l:options = {} " Options applicable to this file
|
||||
let l:is_root = 0 " Whether a:config_filename declares root=true
|
||||
|
||||
while 1
|
||||
if l:lineno == len(a:lines)
|
||||
break
|
||||
endif
|
||||
|
||||
let l:line = a:lines[l:lineno]
|
||||
let l:lineno = l:lineno + 1
|
||||
|
||||
" comment or blank line?
|
||||
if editorconfig_core#util#strip(l:line) ==# ''
|
||||
continue
|
||||
endif
|
||||
if l:line =~# '\v^[#;]'
|
||||
continue
|
||||
endif
|
||||
|
||||
" is it a section header?
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom "Header? <" . l:line . ">"
|
||||
endif
|
||||
|
||||
let l:mo = matchlist(l:line, s:SECTCRE)
|
||||
if len(l:mo)
|
||||
let l:sectname = l:mo[1]
|
||||
let l:in_section = 1
|
||||
if strlen(l:sectname) > s:MAX_SECTION_NAME
|
||||
" Section name too long => ignore the section
|
||||
let l:matching_section = 0
|
||||
else
|
||||
let l:matching_section = s:matches_filename(
|
||||
\ a:config_filename, a:target_filename, l:sectname)
|
||||
endif
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom 'In section ' . l:sectname . ', which ' .
|
||||
\ (l:matching_section ? 'matches' : 'does not match')
|
||||
\ ' file ' . a:target_filename . ' (config ' .
|
||||
\ a:config_filename . ')'
|
||||
endif
|
||||
|
||||
" So sections can't start with a continuation line
|
||||
let l:optname = ''
|
||||
|
||||
" Is it an option line?
|
||||
else
|
||||
let l:mo = matchlist(l:line, s:OPTCRE)
|
||||
if len(l:mo)
|
||||
let l:optname = mo[1]
|
||||
let l:optval = mo[3]
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom printf('Saw raw opt <%s>=<%s>', l:optname, l:optval)
|
||||
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)
|
||||
" allow empty values
|
||||
if l:optval ==? '""'
|
||||
let l:optval = ''
|
||||
endif
|
||||
let l:optname = s:optionxform(l:optname)
|
||||
if !l:in_section && optname ==? 'root'
|
||||
let l:is_root = (optval ==? 'true')
|
||||
endif
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom printf('Saw opt <%s>=<%s>', l:optname, l:optval)
|
||||
endif
|
||||
|
||||
if l:matching_section &&
|
||||
\ strlen(l:optname) <= s:MAX_PROPERTY_NAME &&
|
||||
\ strlen(l:optval) <= s:MAX_PROPERTY_VALUE
|
||||
let l:options[l:optname] = l:optval
|
||||
endif
|
||||
else
|
||||
" a non-fatal parsing error occurred. set up the
|
||||
" exception but keep going. the exception will be
|
||||
" raised at the end of the file and will contain a
|
||||
" list of all bogus lines
|
||||
call add(e, "Parse error in '" . a:config_filename . "' at line " .
|
||||
\ l:lineno . ": '" . l:line . "'")
|
||||
endif
|
||||
endif
|
||||
endwhile
|
||||
|
||||
" if any parsing errors occurred, raise an exception
|
||||
if len(l:e)
|
||||
throw string(l:e)
|
||||
endif
|
||||
|
||||
return {'root': l:is_root, 'options': l:options}
|
||||
endfunction!
|
||||
|
||||
" }}}1
|
||||
" === Helpers =========================================================== {{{1
|
||||
|
||||
" Preprocess option names
|
||||
function! s:optionxform(optionstr)
|
||||
let l:result = substitute(a:optionstr, '\v\s+$', '', 'g') " rstrip
|
||||
return tolower(l:result)
|
||||
endfunction
|
||||
|
||||
" Return true if \p glob matches \p target_filename
|
||||
function! s:matches_filename(config_filename, target_filename, glob)
|
||||
" config_dirname = normpath(dirname(config_filename)).replace(sep, '/')
|
||||
let l:config_dirname = fnamemodify(a:config_filename, ':p:h') . '/'
|
||||
|
||||
if editorconfig_core#util#is_win()
|
||||
" Regardless of whether shellslash is set, make everything slashes
|
||||
let l:config_dirname =
|
||||
\ tolower(substitute(l:config_dirname, '\v\\', '/', 'g'))
|
||||
endif
|
||||
|
||||
let l:glob = substitute(a:glob, '\v\\([#;])', '\1', 'g')
|
||||
|
||||
" Take account of the path to the editorconfig file.
|
||||
" editorconfig-core-c/src/lib/editorconfig.c says:
|
||||
" "Pattern would be: /dir/of/editorconfig/file[double_star]/[section] if
|
||||
" section does not contain '/', or /dir/of/editorconfig/file[section]
|
||||
" if section starts with a '/', or /dir/of/editorconfig/file/[section] if
|
||||
" section contains '/' but does not start with '/'."
|
||||
|
||||
if stridx(l:glob, '/') != -1 " contains a slash
|
||||
if l:glob[0] ==# '/'
|
||||
let l:glob = l:glob[1:] " trim leading slash
|
||||
endif
|
||||
" This will be done by fnmatch
|
||||
" let l:glob = l:config_dirname . l:glob
|
||||
else " does not contain a slash
|
||||
let l:config_dirname = l:config_dirname[:-2]
|
||||
" Trim trailing slash
|
||||
let l:glob = '**/' . l:glob
|
||||
endif
|
||||
|
||||
if g:editorconfig_core_vimscript_debug
|
||||
echom '- ini#matches_filename: checking <' . a:target_filename .
|
||||
\ '> against <' . l:glob . '> with respect to config file <' .
|
||||
\ a:config_filename . '>'
|
||||
echom '- ini#matches_filename: config_dirname is ' . l:config_dirname
|
||||
endif
|
||||
|
||||
return editorconfig_core#fnmatch#fnmatch(a:target_filename,
|
||||
\ l:config_dirname, l:glob)
|
||||
endfunction " matches_filename
|
||||
|
||||
" }}}1
|
||||
" === Copyright notices ================================================= {{{2
|
||||
" Based on code from ConfigParser.py file distributed with Python 2.6.
|
||||
" Portions Copyright (c) 2001-2010 Python Software Foundation;
|
||||
" All Rights Reserved. Licensed under PSF License (see LICENSE.PSF file).
|
||||
"
|
||||
" Changes to original ConfigParser:
|
||||
"
|
||||
" - Special characters can be used in section names
|
||||
" - Octothorpe can be used for comments (not just at beginning of line)
|
||||
" - Only track INI options in sections that match target filename
|
||||
" - Stop parsing files with when ``root = true`` is found
|
||||
" }}}2
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vi: set fdm=marker fdl=1:
|
|
@ -0,0 +1,84 @@
|
|||
" util.vim: part of editorconfig-core-vimscript and editorconfig-vim.
|
||||
" Copyright (c) 2018-2019 EditorConfig Team, including Chris White {{{1
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE. }}}1
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" A verbatim copy of ingo#fs#path#Separator() {{{1
|
||||
" from https://github.com/vim-scripts/ingo-library/blob/558132e2221db3af26dc2f2c6756d092d48a459f/autoload/ingo/fs/path.vim
|
||||
" distributed under the Vim license.
|
||||
function! editorconfig_core#util#Separator()
|
||||
return (exists('+shellslash') && ! &shellslash ? '\' : '/')
|
||||
endfunction " }}}1
|
||||
|
||||
" path_join(): ('a','b')->'a/b'; ('a/','b')->'a/b'. {{{1
|
||||
function! editorconfig_core#util#path_join(a, b)
|
||||
" TODO shellescape/shellslash?
|
||||
"echom 'Joining <' . a:a . '> and <' . a:b . '>'
|
||||
"echom 'Length is ' . strlen(a:a)
|
||||
"echom 'Last char is ' . char2nr(a:a[-1])
|
||||
if a:a !~# '\v%(\/|\\)$'
|
||||
return a:a . editorconfig_core#util#Separator() . a:b
|
||||
else
|
||||
return a:a . a:b
|
||||
endif
|
||||
endfunction " }}}1
|
||||
|
||||
" is_win() by xolox {{{1
|
||||
" The following function is modified from
|
||||
" https://github.com/xolox/vim-misc/blob/master/autoload/xolox/misc/os.vim
|
||||
" Copyright (c) 2015 Peter Odding <peter@peterodding.com>
|
||||
"
|
||||
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
" of this software and associated documentation files (the "Software"), to deal
|
||||
" in the Software without restriction, including without limitation the rights
|
||||
" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
" copies of the Software, and to permit persons to whom the Software is
|
||||
" furnished to do so, subject to the following conditions:
|
||||
"
|
||||
" The above copyright notice and this permission notice shall be included in all
|
||||
" copies or substantial portions of the Software.
|
||||
"
|
||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
" SOFTWARE.
|
||||
function! editorconfig_core#util#is_win()
|
||||
" Returns 1 (true) when on Microsoft Windows, 0 (false) otherwise.
|
||||
return has('win16') || has('win32') || has('win64')
|
||||
endfunction " }}}1
|
||||
|
||||
" strip() {{{1
|
||||
function! editorconfig_core#util#strip(s)
|
||||
return substitute(a:s, '\v^\s+|\s+$','','g')
|
||||
endfunction " }}}1
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vi: set fdm=marker:
|
203
pack/acp/start/editorconfig-vim/doc/editorconfig.txt
Normal file
203
pack/acp/start/editorconfig-vim/doc/editorconfig.txt
Normal file
|
@ -0,0 +1,203 @@
|
|||
*editorconfig.txt*
|
||||
|
||||
File: editorconfig.txt
|
||||
Version: 1.1.1
|
||||
Maintainer: EditorConfig Team <http://editorconfig.org>
|
||||
Description: EditorConfig vim plugin
|
||||
|
||||
License:
|
||||
Copyright (c) 2011-2019 EditorConfig Team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
CONTENTS~
|
||||
*editorconfig-contents*
|
||||
----------------------------------------------------------------------------
|
||||
1. Overview |editorconfig-overview|
|
||||
2. Installation |editorconfig-installation|
|
||||
3. Commands |editorconfig-commands|
|
||||
4. Settings |editorconfig-settings|
|
||||
5. Advanced |editorconfig-advanced|
|
||||
|
||||
|
||||
OVERVIEW~
|
||||
*editorconfig-overview*
|
||||
----------------------------------------------------------------------------
|
||||
This is the EditorConfig plugin for vim.
|
||||
|
||||
|
||||
INSTALLATION~
|
||||
*editorconfig-installation*
|
||||
----------------------------------------------------------------------------
|
||||
Follow the instructions in the README.md file to install this plugin.
|
||||
|
||||
COMMANDS~
|
||||
*editorconfig-commands*
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
*:EditorConfigReload*
|
||||
Command:
|
||||
:EditorConfigReload
|
||||
|
||||
Reload the EditorConfig conf files. When `.editorconfig` files are modified,
|
||||
this command could prevent you to reload the current edited file to load the
|
||||
new configuration.
|
||||
|
||||
SETTINGS~
|
||||
*editorconfig-settings*
|
||||
----------------------------------------------------------------------------
|
||||
*g:EditorConfig_core_mode*
|
||||
Specify the mode of EditorConfig core. Generally it is OK to leave this option
|
||||
empty. Currently, the supported modes are "vim_core" (default) and
|
||||
"external_command".
|
||||
|
||||
vim_core: Use the included VimScript EditorConfig Core.
|
||||
external_command: Run external EditorConfig Core.
|
||||
|
||||
If "g:EditorConfig_core_mode" is not specified, this plugin will automatically
|
||||
choose "vim_core".
|
||||
|
||||
If you choose "external_command" mode, you must also set
|
||||
|g:EditorConfig_exec_path|.
|
||||
|
||||
Changes to "g:EditorConfig_core_mode" will not take effect until Vim
|
||||
is restarted.
|
||||
|
||||
*b:EditorConfig_disable*
|
||||
This is a buffer-local variable that disables the EditorConfig plugin for a
|
||||
single buffer.
|
||||
|
||||
Example: Disable EditorConfig for the current buffer:
|
||||
>
|
||||
let b:EditorConfig_disable = 1
|
||||
<
|
||||
Example: Disable EditorConfig for all git commit messages:
|
||||
>
|
||||
au FileType gitcommit let b:EditorConfig_disable = 1
|
||||
<
|
||||
|
||||
*g:EditorConfig_exclude_patterns*
|
||||
This is a list contains file path patterns which will be ignored by
|
||||
EditorConfig plugin. When the path of the opened buffer (i.e.
|
||||
"expand('%:p')") matches any of the patterns in the list, EditorConfig will
|
||||
not load for this file. The default is an empty list.
|
||||
|
||||
Example: Avoid loading EditorConfig for any remote files over ssh
|
||||
>
|
||||
let g:EditorConfig_exclude_patterns = ['scp://.*']
|
||||
<
|
||||
|
||||
*g:EditorConfig_exec_path*
|
||||
The file path to the EditorConfig core executable. You can set this value in
|
||||
your |vimrc| like this:
|
||||
>
|
||||
let g:EditorConfig_exec_path = 'Path to your EditorConfig Core executable'
|
||||
<
|
||||
The default value is empty.
|
||||
|
||||
If "g:EditorConfig_exec_path" is not set, the plugin will use the "vim_core"
|
||||
mode regardless of the setting of |g:EditorConfig_core_mode|.
|
||||
|
||||
Changes to "g:EditorConfig_exec_path" will not take effect until Vim
|
||||
is restarted.
|
||||
|
||||
*g:EditorConfig_max_line_indicator*
|
||||
The way to show the line where the maximal length is reached. Accepted values
|
||||
are "line", "fill", otherwise there will be no max line indicator.
|
||||
|
||||
"line": the right column of the max line length column will be
|
||||
highlighted, made possible by setting 'colorcolumn' to
|
||||
"max_line_length + 1".
|
||||
|
||||
"fill": all the columns to the right of the max line length column
|
||||
will be highlighted, made possible by setting 'colorcolumn'
|
||||
to a list of numbers starting from "max_line_length + 1" to
|
||||
the number of columns on the screen.
|
||||
|
||||
"exceeding": the right column of the max line length column will be
|
||||
highlighted on lines that exceed the max line length, made
|
||||
possible by adding a match for the ColorColumn group.
|
||||
|
||||
"none": no max line length indicator will be shown. This is the
|
||||
recommended value when you do not want any indicator to be
|
||||
shown, but values other than "line" or "fill" would also work
|
||||
as "none".
|
||||
|
||||
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 = "fill"
|
||||
let g:EditorConfig_max_line_indicator = "exceeding"
|
||||
let g:EditorConfig_max_line_indicator = "none"
|
||||
<
|
||||
The default value is "line".
|
||||
|
||||
*g:EditorConfig_preserve_formatoptions*
|
||||
Set this to 1 if you don't want your formatoptions modified when
|
||||
max_line_length is set:
|
||||
>
|
||||
let g:EditorConfig_preserve_formatoptions = 1
|
||||
<
|
||||
This option defaults to 0.
|
||||
|
||||
*g:EditorConfig_verbose*
|
||||
Set this to 1 if you want debug info printed:
|
||||
>
|
||||
let g:EditorConfig_verbose = 1
|
||||
<
|
||||
|
||||
ADVANCED~
|
||||
*editorconfig-advanced*
|
||||
----------------------------------------------------------------------------
|
||||
*editorconfig-hook*
|
||||
*EditorConfig#AddNewHook()*
|
||||
While this plugin offers several builtin supported properties (as mentioned
|
||||
here: https://github.com/editorconfig/editorconfig-vim#supported-properties),
|
||||
we are also able to add our own hooks to support additional EditorConfig
|
||||
properties, including those not in the EditorConfig standard. For example, we
|
||||
are working on an Objective-C project, and all our "*.m" files should be
|
||||
Objective-C source files. However, vim sometimes detect "*.m" files as MATLAB
|
||||
source files, which causes incorrect syntax highlighting, code indentation,
|
||||
etc. To solve the case, we could write the following code into the |vimrc|
|
||||
file:
|
||||
>
|
||||
function! FiletypeHook(config)
|
||||
if has_key(a:config, 'vim_filetype')
|
||||
let &filetype = a:config['vim_filetype']
|
||||
endif
|
||||
|
||||
return 0 " Return 0 to show no error happened
|
||||
endfunction
|
||||
|
||||
call editorconfig#AddNewHook(function('FiletypeHook'))
|
||||
<
|
||||
And add the following code to your .editorconfig file:
|
||||
>
|
||||
[*.m]
|
||||
vim_filetype = objc
|
||||
<
|
||||
Then try to open an Objective-C file, you will find the |filetype| is set to
|
||||
"objc".
|
||||
|
||||
vim:ft=help:tw=78
|
3
pack/acp/start/editorconfig-vim/mkzip.sh
Executable file
3
pack/acp/start/editorconfig-vim/mkzip.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
|
||||
zip -r editorconfig-vim-$*.zip plugin/* autoload/* doc/*
|
525
pack/acp/start/editorconfig-vim/plugin/editorconfig.vim
Normal file
525
pack/acp/start/editorconfig-vim/plugin/editorconfig.vim
Normal file
|
@ -0,0 +1,525 @@
|
|||
" plugin/editorconfig.vim: EditorConfig native Vimscript plugin file
|
||||
" Copyright (c) 2011-2019 EditorConfig Team
|
||||
" All rights reserved.
|
||||
"
|
||||
" Redistribution and use in source and binary forms, with or without
|
||||
" modification, are permitted provided that the following conditions are met:
|
||||
"
|
||||
" 1. Redistributions of source code must retain the above copyright notice,
|
||||
" this list of conditions and the following disclaimer.
|
||||
" 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
" this list of conditions and the following disclaimer in the documentation
|
||||
" and/or other materials provided with the distribution.
|
||||
"
|
||||
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
" POSSIBILITY OF SUCH DAMAGE.
|
||||
"
|
||||
|
||||
if v:version < 700
|
||||
finish
|
||||
endif
|
||||
|
||||
" check whether this script is already loaded
|
||||
if exists("g:loaded_EditorConfig")
|
||||
finish
|
||||
endif
|
||||
let g:loaded_EditorConfig = 1
|
||||
|
||||
let s:saved_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" variables {{{1
|
||||
|
||||
" Make sure the globals all exist
|
||||
if !exists('g:EditorConfig_exec_path')
|
||||
let g:EditorConfig_exec_path = ''
|
||||
endif
|
||||
|
||||
if !exists('g:EditorConfig_verbose')
|
||||
let g:EditorConfig_verbose = 0
|
||||
endif
|
||||
|
||||
if !exists('g:EditorConfig_preserve_formatoptions')
|
||||
let g:EditorConfig_preserve_formatoptions = 0
|
||||
endif
|
||||
|
||||
if !exists('g:EditorConfig_max_line_indicator')
|
||||
let g:EditorConfig_max_line_indicator = 'line'
|
||||
endif
|
||||
|
||||
if !exists('g:EditorConfig_exclude_patterns')
|
||||
let g:EditorConfig_exclude_patterns = []
|
||||
endif
|
||||
|
||||
if !exists('g:EditorConfig_disable_rules')
|
||||
let g:EditorConfig_disable_rules = []
|
||||
endif
|
||||
|
||||
" Copy some of the globals into script variables --- changes to these
|
||||
" globals won't affect the plugin until the plugin is reloaded.
|
||||
if exists('g:EditorConfig_core_mode') && !empty(g:EditorConfig_core_mode)
|
||||
let s:editorconfig_core_mode = g:EditorConfig_core_mode
|
||||
else
|
||||
let s:editorconfig_core_mode = ''
|
||||
endif
|
||||
|
||||
if exists('g:EditorConfig_exec_path') && !empty(g:EditorConfig_exec_path)
|
||||
let s:editorconfig_exec_path = g:EditorConfig_exec_path
|
||||
else
|
||||
let s:editorconfig_exec_path = ''
|
||||
endif
|
||||
|
||||
let s:initialized = 0
|
||||
|
||||
" }}}1
|
||||
|
||||
" shellslash handling {{{1
|
||||
function! s:DisableShellSlash() " {{{2
|
||||
" disable shellslash for proper escaping of Windows paths
|
||||
|
||||
" In Windows, 'shellslash' also changes the behavior of 'shellescape'.
|
||||
" It makes 'shellescape' behave like in UNIX environment. So ':setl
|
||||
" noshellslash' before evaluating 'shellescape' and restore the
|
||||
" settings afterwards when 'shell' does not contain 'sh' somewhere.
|
||||
if has('win32') && empty(matchstr(&shell, 'sh'))
|
||||
let s:old_shellslash = &l:shellslash
|
||||
setlocal noshellslash
|
||||
endif
|
||||
endfunction " }}}2
|
||||
|
||||
function! s:ResetShellSlash() " {{{2
|
||||
" reset shellslash to the user-set value, if any
|
||||
if exists('s:old_shellslash')
|
||||
let &l:shellslash = s:old_shellslash
|
||||
unlet! s:old_shellslash
|
||||
endif
|
||||
endfunction " }}}2
|
||||
" }}}1
|
||||
|
||||
" Mode initialization functions {{{1
|
||||
|
||||
function! s:InitializeVimCore()
|
||||
" Initialize vim core. Returns 1 on failure; 0 on success
|
||||
" At the moment, all we need to do is to check that it is installed.
|
||||
try
|
||||
let l:vim_core_ver = editorconfig_core#version()
|
||||
catch
|
||||
return 1
|
||||
endtry
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
function! s:InitializeExternalCommand()
|
||||
" Initialize external_command mode
|
||||
|
||||
if empty(s:editorconfig_exec_path)
|
||||
echo 'Please specify a g:EditorConfig_exec_path'
|
||||
return 1
|
||||
endif
|
||||
|
||||
if g:EditorConfig_verbose
|
||||
echo 'Checking for external command ' . s:editorconfig_exec_path . ' ...'
|
||||
endif
|
||||
|
||||
if !executable(s:editorconfig_exec_path)
|
||||
echo 'File ' . s:editorconfig_exec_path . ' is not executable.'
|
||||
return 1
|
||||
endif
|
||||
|
||||
return 0
|
||||
endfunction
|
||||
" }}}1
|
||||
|
||||
function! s:Initialize() " Initialize the plugin. {{{1
|
||||
" Returns truthy on error, falsy on success.
|
||||
|
||||
if empty(s:editorconfig_core_mode)
|
||||
let s:editorconfig_core_mode = 'vim_core' " Default core choice
|
||||
endif
|
||||
|
||||
if s:editorconfig_core_mode ==? 'external_command'
|
||||
if s:InitializeExternalCommand()
|
||||
echohl WarningMsg
|
||||
echo 'EditorConfig: Failed to initialize external_command mode. ' .
|
||||
\ 'Falling back to vim_core mode.'
|
||||
echohl None
|
||||
let s:editorconfig_core_mode = 'vim_core'
|
||||
endif
|
||||
endif
|
||||
|
||||
if s:editorconfig_core_mode ==? 'vim_core'
|
||||
if s:InitializeVimCore()
|
||||
echohl ErrorMsg
|
||||
echo 'EditorConfig: Failed to initialize vim_core mode. ' .
|
||||
\ 'The plugin will not function.'
|
||||
echohl None
|
||||
return 1
|
||||
endif
|
||||
|
||||
elseif s:editorconfig_core_mode ==? 'external_command'
|
||||
" Nothing to do here, but this elseif is required to avoid
|
||||
" external_command falling into the else clause.
|
||||
|
||||
else " neither external_command nor vim_core
|
||||
echohl ErrorMsg
|
||||
echo "EditorConfig: I don't know how to use mode " . s:editorconfig_core_mode
|
||||
echohl None
|
||||
return 1
|
||||
endif
|
||||
|
||||
let s:initialized = 1
|
||||
return 0
|
||||
endfunction " }}}1
|
||||
|
||||
function! s:GetFilenames(path, filename) " {{{1
|
||||
" Yield full filepath for filename in each directory in and above path
|
||||
|
||||
let l:path_list = []
|
||||
let l:path = a:path
|
||||
while 1
|
||||
let l:path_list += [l:path . '/' . a:filename]
|
||||
let l:newpath = fnamemodify(l:path, ':h')
|
||||
if l:path == l:newpath
|
||||
break
|
||||
endif
|
||||
let l:path = l:newpath
|
||||
endwhile
|
||||
return l:path_list
|
||||
endfunction " }}}1
|
||||
|
||||
function! s:UseConfigFiles() abort " Apply config to the current buffer {{{1
|
||||
let b:editorconfig_tried = 1
|
||||
let l:buffer_name = expand('%:p')
|
||||
" ignore buffers without a name
|
||||
if empty(l:buffer_name)
|
||||
return
|
||||
endif
|
||||
|
||||
if exists("b:EditorConfig_disable") && b:EditorConfig_disable
|
||||
if g:EditorConfig_verbose
|
||||
echo 'Skipping EditorConfig for buffer "' . l:buffer_name . '"'
|
||||
endif
|
||||
return
|
||||
endif
|
||||
|
||||
" Check if any .editorconfig does exist
|
||||
let l:conf_files = s:GetFilenames(expand('%:p:h'), '.editorconfig')
|
||||
let l:conf_found = 0
|
||||
for conf_file in conf_files
|
||||
if filereadable(conf_file)
|
||||
let l:conf_found = 1
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
if !l:conf_found
|
||||
return
|
||||
endif
|
||||
|
||||
if !s:initialized
|
||||
if s:Initialize()
|
||||
return
|
||||
endif
|
||||
endif
|
||||
|
||||
if g:EditorConfig_verbose
|
||||
echo 'Applying EditorConfig ' . s:editorconfig_core_mode .
|
||||
\ ' on file "' . l:buffer_name . '"'
|
||||
endif
|
||||
|
||||
" Ignore specific patterns
|
||||
for pattern in g:EditorConfig_exclude_patterns
|
||||
if l:buffer_name =~ pattern
|
||||
return
|
||||
endif
|
||||
endfor
|
||||
|
||||
if s:editorconfig_core_mode ==? 'vim_core'
|
||||
if s:UseConfigFiles_VimCore() == 0
|
||||
let b:editorconfig_applied = 1
|
||||
endif
|
||||
elseif s:editorconfig_core_mode ==? 'external_command'
|
||||
call s:UseConfigFiles_ExternalCommand()
|
||||
let b:editorconfig_applied = 1
|
||||
else
|
||||
echohl Error |
|
||||
\ echo "Unknown EditorConfig Core: " .
|
||||
\ s:editorconfig_core_mode |
|
||||
\ echohl None
|
||||
endif
|
||||
endfunction " }}}1
|
||||
|
||||
" Custom commands, and autoloading {{{1
|
||||
|
||||
" Autocommands, and function to enable/disable the plugin {{{2
|
||||
function! s:EditorConfigEnable(should_enable)
|
||||
augroup editorconfig
|
||||
autocmd!
|
||||
if a:should_enable
|
||||
autocmd BufNewFile,BufReadPost,BufFilePost * call s:UseConfigFiles()
|
||||
endif
|
||||
augroup END
|
||||
endfunction
|
||||
|
||||
" }}}2
|
||||
|
||||
" Commands {{{2
|
||||
command! EditorConfigEnable call s:EditorConfigEnable(1)
|
||||
command! EditorConfigDisable call s:EditorConfigEnable(0)
|
||||
|
||||
command! EditorConfigReload call s:UseConfigFiles() " Reload EditorConfig files
|
||||
" }}}2
|
||||
|
||||
" On startup, enable the autocommands
|
||||
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
|
||||
|
||||
" UseConfigFiles function for different modes {{{1
|
||||
|
||||
function! s:UseConfigFiles_VimCore()
|
||||
" Use the vimscript EditorConfig core
|
||||
try
|
||||
let l:config = editorconfig_core#handler#get_configurations(
|
||||
\ { 'target': expand('%:p') } )
|
||||
call s:ApplyConfig(l:config)
|
||||
return 0 " success
|
||||
catch
|
||||
return 1 " failure
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! s:UseConfigFiles_ExternalCommand()
|
||||
" Use external EditorConfig core (e.g., the C core)
|
||||
|
||||
call s:DisableShellSlash()
|
||||
let l:exec_path = shellescape(s:editorconfig_exec_path)
|
||||
call s:ResetShellSlash()
|
||||
|
||||
call s:SpawnExternalParser(l:exec_path)
|
||||
endfunction
|
||||
|
||||
function! s:SpawnExternalParser(cmd) " {{{2
|
||||
" Spawn external EditorConfig. Used by s:UseConfigFiles_ExternalCommand()
|
||||
|
||||
let l:cmd = a:cmd
|
||||
|
||||
if empty(l:cmd)
|
||||
throw 'No cmd provided'
|
||||
endif
|
||||
|
||||
let l:config = {}
|
||||
|
||||
call s:DisableShellSlash()
|
||||
let l:cmd = l:cmd . ' ' . shellescape(expand('%:p'))
|
||||
call s:ResetShellSlash()
|
||||
|
||||
let l:parsing_result = split(system(l:cmd), '\v[\r\n]+')
|
||||
|
||||
" if editorconfig core's exit code is not zero, give out an error
|
||||
" message
|
||||
if v:shell_error != 0
|
||||
echohl ErrorMsg
|
||||
echo 'Failed to execute "' . l:cmd . '". Exit code: ' .
|
||||
\ v:shell_error
|
||||
echo ''
|
||||
echo 'Message:'
|
||||
echo l:parsing_result
|
||||
echohl None
|
||||
return
|
||||
endif
|
||||
|
||||
if g:EditorConfig_verbose
|
||||
echo 'Output from EditorConfig core executable:'
|
||||
echo l:parsing_result
|
||||
endif
|
||||
|
||||
for one_line in l:parsing_result
|
||||
let l:eq_pos = stridx(one_line, '=')
|
||||
|
||||
if l:eq_pos == -1 " = is not found. Skip this line
|
||||
continue
|
||||
endif
|
||||
|
||||
let l:eq_left = strpart(one_line, 0, l:eq_pos)
|
||||
if l:eq_pos + 1 < strlen(one_line)
|
||||
let l:eq_right = strpart(one_line, l:eq_pos + 1)
|
||||
else
|
||||
let l:eq_right = ''
|
||||
endif
|
||||
|
||||
let l:config[l:eq_left] = l:eq_right
|
||||
endfor
|
||||
|
||||
call s:ApplyConfig(l:config)
|
||||
endfunction " }}}2
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:ApplyConfig(config) abort " Set the buffer options {{{1
|
||||
" Only process normal buffers (do not treat help files as '.txt' files)
|
||||
if !empty(&buftype)
|
||||
return
|
||||
endif
|
||||
|
||||
if g:EditorConfig_verbose
|
||||
echo 'Options: ' . string(a:config)
|
||||
endif
|
||||
|
||||
if s:IsRuleActive('indent_style', a:config)
|
||||
if a:config["indent_style"] == "tab"
|
||||
setl noexpandtab
|
||||
elseif a:config["indent_style"] == "space"
|
||||
setl expandtab
|
||||
endif
|
||||
endif
|
||||
|
||||
if s:IsRuleActive('tab_width', a:config)
|
||||
let &l:tabstop = str2nr(a:config["tab_width"])
|
||||
endif
|
||||
|
||||
if s:IsRuleActive('indent_size', a:config)
|
||||
" if indent_size is 'tab', set shiftwidth to tabstop;
|
||||
" if indent_size is a positive integer, set shiftwidth to the integer
|
||||
" value
|
||||
if a:config["indent_size"] == "tab"
|
||||
let &l:shiftwidth = &l:tabstop
|
||||
let &l:softtabstop = &l:shiftwidth
|
||||
else
|
||||
let l:indent_size = str2nr(a:config["indent_size"])
|
||||
if l:indent_size > 0
|
||||
let &l:shiftwidth = l:indent_size
|
||||
let &l:softtabstop = &l:shiftwidth
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
if s:IsRuleActive('end_of_line', a:config) &&
|
||||
\ &l:modifiable
|
||||
if a:config["end_of_line"] == "lf"
|
||||
setl fileformat=unix
|
||||
elseif a:config["end_of_line"] == "crlf"
|
||||
setl fileformat=dos
|
||||
elseif a:config["end_of_line"] == "cr"
|
||||
setl fileformat=mac
|
||||
endif
|
||||
endif
|
||||
|
||||
if s:IsRuleActive('charset', a:config) &&
|
||||
\ &l:modifiable
|
||||
if a:config["charset"] == "utf-8"
|
||||
setl fileencoding=utf-8
|
||||
setl nobomb
|
||||
elseif a:config["charset"] == "utf-8-bom"
|
||||
setl fileencoding=utf-8
|
||||
setl bomb
|
||||
elseif a:config["charset"] == "latin1"
|
||||
setl fileencoding=latin1
|
||||
setl nobomb
|
||||
elseif a:config["charset"] == "utf-16be"
|
||||
setl fileencoding=utf-16be
|
||||
setl bomb
|
||||
elseif a:config["charset"] == "utf-16le"
|
||||
setl fileencoding=utf-16le
|
||||
setl bomb
|
||||
endif
|
||||
endif
|
||||
|
||||
augroup editorconfig_trim_trailing_whitespace
|
||||
autocmd! BufWritePre <buffer>
|
||||
if s:IsRuleActive('trim_trailing_whitespace', a:config) &&
|
||||
\ get(a:config, 'trim_trailing_whitespace', 'false') ==# 'true'
|
||||
autocmd BufWritePre <buffer> call s:TrimTrailingWhitespace()
|
||||
endif
|
||||
augroup END
|
||||
|
||||
if s:IsRuleActive('insert_final_newline', a:config)
|
||||
if exists('+fixendofline')
|
||||
if a:config["insert_final_newline"] == "false"
|
||||
setl nofixendofline
|
||||
else
|
||||
setl fixendofline
|
||||
endif
|
||||
elseif exists(':SetNoEOL') == 2
|
||||
if a:config["insert_final_newline"] == "false"
|
||||
silent! SetNoEOL " Use the PreserveNoEOL plugin to accomplish it
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
" highlight the columns following max_line_length
|
||||
if s:IsRuleActive('max_line_length', a:config) &&
|
||||
\ a:config['max_line_length'] != 'off'
|
||||
let l:max_line_length = str2nr(a:config['max_line_length'])
|
||||
|
||||
if l:max_line_length >= 0
|
||||
let &l:textwidth = l:max_line_length
|
||||
if g:EditorConfig_preserve_formatoptions == 0
|
||||
setlocal formatoptions+=tc
|
||||
endif
|
||||
endif
|
||||
|
||||
if exists('+colorcolumn')
|
||||
if l:max_line_length > 0
|
||||
if g:EditorConfig_max_line_indicator == 'line'
|
||||
let &l:colorcolumn = l:max_line_length + 1
|
||||
elseif g:EditorConfig_max_line_indicator == 'fill' &&
|
||||
\ l:max_line_length < &l:columns
|
||||
" Fill only if the columns of screen is large enough
|
||||
let &l:colorcolumn = join(
|
||||
\ range(l:max_line_length+1,&l:columns),',')
|
||||
elseif g:EditorConfig_max_line_indicator == 'exceeding'
|
||||
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.', 100)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
call editorconfig#ApplyHooks(a:config)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:TrimTrailingWhitespace() " {{{1
|
||||
if &l:modifiable
|
||||
" don't lose user position when trimming trailing whitespace
|
||||
let s:view = winsaveview()
|
||||
try
|
||||
silent! keeppatterns %s/\s\+$//e
|
||||
finally
|
||||
call winrestview(s:view)
|
||||
endtry
|
||||
endif
|
||||
endfunction " }}}1
|
||||
|
||||
function! s:IsRuleActive(name, config) " {{{1
|
||||
return index(g:EditorConfig_disable_rules, a:name) < 0 &&
|
||||
\ has_key(a:config, a:name)
|
||||
endfunction "}}}1
|
||||
|
||||
let &cpo = s:saved_cpo
|
||||
unlet! s:saved_cpo
|
||||
|
||||
" vim: fdm=marker fdc=3
|
53
pack/acp/start/editorconfig-vim/tests/core/CMakeLists.txt
Normal file
53
pack/acp/start/editorconfig-vim/tests/core/CMakeLists.txt
Normal file
|
@ -0,0 +1,53 @@
|
|||
# CMakeLists.txt for core testing in
|
||||
# editorconfig-core-vimscript and editorconfig-vim.
|
||||
|
||||
# Copyright (c) 2011-2019 EditorConfig Team
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# To perform the test, from the root of the project tree, run
|
||||
# mkdir build
|
||||
# cd build
|
||||
# cmake ..
|
||||
# ctest .
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
#set(CMAKE_LEGACY_CYGWIN_WIN32 0)
|
||||
|
||||
# Do not check any compiler
|
||||
project(editorconfig-core-vimscript NONE)
|
||||
|
||||
enable_testing()
|
||||
|
||||
# The test executable to use
|
||||
if(NOT WIN32)
|
||||
set(EDITORCONFIG_CMD "${CMAKE_SOURCE_DIR}/editorconfig")
|
||||
else()
|
||||
set(EDITORCONFIG_CMD "${CMAKE_SOURCE_DIR}/editorconfig.bat")
|
||||
endif()
|
||||
set(EDITORCONFIG_CMD_IS_TARGET FALSE)
|
||||
|
||||
add_subdirectory(tests)
|
||||
|
||||
# CTestCustom.cmake contains platform-specific test configuration.
|
||||
configure_file(CTestCustom.cmake ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
|
34
pack/acp/start/editorconfig-vim/tests/core/CTestCustom.cmake
Normal file
34
pack/acp/start/editorconfig-vim/tests/core/CTestCustom.cmake
Normal file
|
@ -0,0 +1,34 @@
|
|||
# CTestCustom.cmake: Skip UTF-8 tests
|
||||
# Part of editorconfig-vim
|
||||
|
||||
# Copyright (c) 2011-2019 EditorConfig Team
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Skip UTF8 tests on Windows for now per
|
||||
# https://github.com/editorconfig/editorconfig-core-c/pull/31#issue-154810185
|
||||
if(WIN32 AND (NOT "$ENV{RUN_UTF8}"))
|
||||
message(WARNING "Skipping UTF-8 tests on this platform")
|
||||
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)
|
||||
endif()
|
171
pack/acp/start/editorconfig-vim/tests/core/ecvbslib.vbs
Executable file
171
pack/acp/start/editorconfig-vim/tests/core/ecvbslib.vbs
Executable file
|
@ -0,0 +1,171 @@
|
|||
' ecvbslib.vbs: VBScript routines for use in
|
||||
' editorconfig-core-vimscript and editorconfig-vim.
|
||||
' Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
' Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
||||
|
||||
' Remove CR and LF in a string
|
||||
function nocrlf(strin)
|
||||
nocrlf = Replace(Replace(strin, vbCr, ""), vbLf, "")
|
||||
end function
|
||||
|
||||
' === Base64 ================================================================
|
||||
' from https://stackoverflow.com/a/40118072/2877364 by
|
||||
' https://stackoverflow.com/users/45375/mklement0
|
||||
|
||||
' Base64-encodes the specified string.
|
||||
' Parameter fAsUtf16LE determines how the input text is encoded at the
|
||||
' byte level before Base64 encoding is applied.
|
||||
' * Pass False to use UTF-8 encoding.
|
||||
' * Pass True to use UTF-16 LE encoding.
|
||||
Function Base64Encode(ByVal sText, ByVal fAsUtf16LE)
|
||||
|
||||
' Use an aux. XML document with a Base64-encoded element.
|
||||
' Assigning the byte stream (array) returned by StrToBytes() to .NodeTypedValue
|
||||
' automatically performs Base64-encoding, whose result can then be accessed
|
||||
' as the element's text.
|
||||
With CreateObject("Msxml2.DOMDocument").CreateElement("aux")
|
||||
.DataType = "bin.base64"
|
||||
if fAsUtf16LE then
|
||||
.NodeTypedValue = StrToBytes(sText, "utf-16le", 2)
|
||||
else
|
||||
.NodeTypedValue = StrToBytes(sText, "utf-8", 3)
|
||||
end if
|
||||
Base64Encode = nocrlf(.Text) ' No line breaks; MSXML adds them.
|
||||
End With
|
||||
|
||||
End Function
|
||||
|
||||
' Decodes the specified Base64-encoded string.
|
||||
' If the decoded string's original encoding was:
|
||||
' * UTF-8, pass False for fIsUtf16LE.
|
||||
' * UTF-16 LE, pass True for fIsUtf16LE.
|
||||
Function Base64Decode(ByVal sBase64EncodedText, ByVal fIsUtf16LE)
|
||||
|
||||
Dim sTextEncoding
|
||||
if fIsUtf16LE Then sTextEncoding = "utf-16le" Else sTextEncoding = "utf-8"
|
||||
|
||||
' Use an aux. XML document with a Base64-encoded element.
|
||||
' Assigning the encoded text to .Text makes the decoded byte array
|
||||
' available via .nodeTypedValue, which we can pass to BytesToStr()
|
||||
With CreateObject("Msxml2.DOMDocument").CreateElement("aux")
|
||||
.DataType = "bin.base64"
|
||||
.Text = sBase64EncodedText
|
||||
Base64Decode = BytesToStr(.NodeTypedValue, sTextEncoding)
|
||||
End With
|
||||
|
||||
End Function
|
||||
|
||||
' Returns a binary representation (byte array) of the specified string in
|
||||
' the specified text encoding, such as "utf-8" or "utf-16le".
|
||||
' Pass the number of bytes that the encoding's BOM uses as iBomByteCount;
|
||||
' pass 0 to include the BOM in the output.
|
||||
function StrToBytes(ByVal sText, ByVal sTextEncoding, ByVal iBomByteCount)
|
||||
|
||||
' Create a text string with the specified encoding and then
|
||||
' get its binary (byte array) representation.
|
||||
With CreateObject("ADODB.Stream")
|
||||
' Create a stream with the specified text encoding...
|
||||
.Type = 2 ' adTypeText
|
||||
.Charset = sTextEncoding
|
||||
.Open
|
||||
.WriteText sText
|
||||
' ... and convert it to a binary stream to get a byte-array
|
||||
' representation.
|
||||
.Position = 0
|
||||
.Type = 1 ' adTypeBinary
|
||||
.Position = iBomByteCount ' skip the BOM
|
||||
StrToBytes = .Read
|
||||
.Close
|
||||
End With
|
||||
|
||||
end function
|
||||
|
||||
' Returns a string that corresponds to the specified byte array, interpreted
|
||||
' with the specified text encoding, such as "utf-8" or "utf-16le".
|
||||
function BytesToStr(ByVal byteArray, ByVal sTextEncoding)
|
||||
|
||||
If LCase(sTextEncoding) = "utf-16le" then
|
||||
' UTF-16 LE happens to be VBScript's internal encoding, so we can
|
||||
' take a shortcut and use CStr() to directly convert the byte array
|
||||
' to a string.
|
||||
BytesToStr = CStr(byteArray)
|
||||
Else ' Convert the specified text encoding to a VBScript string.
|
||||
' Create a binary stream and copy the input byte array to it.
|
||||
With CreateObject("ADODB.Stream")
|
||||
.Type = 1 ' adTypeBinary
|
||||
.Open
|
||||
.Write byteArray
|
||||
' Now change the type to text, set the encoding, and output the
|
||||
' result as text.
|
||||
.Position = 0
|
||||
.Type = 2 ' adTypeText
|
||||
.CharSet = sTextEncoding
|
||||
BytesToStr = .ReadText
|
||||
.Close
|
||||
End With
|
||||
End If
|
||||
|
||||
end function
|
||||
|
||||
' === Runner ================================================================
|
||||
|
||||
' Run a command, copy its stdout/stderr to ours, and return its exit
|
||||
' status.
|
||||
' Modified from https://stackoverflow.com/a/32493083/2877364 by
|
||||
' https://stackoverflow.com/users/3191599/nate-barbettini .
|
||||
' See also https://www.vbsedit.com/html/4c5b06ac-dc45-4ec2-aca1-f168bab75483.asp
|
||||
function RunCommandAndEcho(strCommand)
|
||||
Const WshRunning = 0
|
||||
Const WshFinished = 1
|
||||
Const WshFailed = 2
|
||||
|
||||
Set WshShell = CreateObject("WScript.Shell")
|
||||
'WScript.Echo "Running >>" & strCommand & "<<..."
|
||||
Set WshShellExec = WshShell.Exec(strCommand)
|
||||
|
||||
Do While WshShellExec.Status = WshRunning
|
||||
'WScript.Echo "Waiting..."
|
||||
WScript.Sleep 100
|
||||
Loop
|
||||
|
||||
if not WshShellExec.StdOut.AtEndOfStream then
|
||||
WScript.StdOut.Write(WshShellExec.StdOut.ReadAll())
|
||||
end if
|
||||
|
||||
if not WshShellExec.StdErr.AtEndOfStream then
|
||||
WScript.StdErr.Write(WshShellExec.StdErr.ReadAll())
|
||||
end if
|
||||
|
||||
RunCommandAndEcho = WshShellExec.ExitCode
|
||||
end function
|
||||
|
||||
' === Argument processing ===================================================
|
||||
|
||||
function MakeY64Args(args)
|
||||
|
||||
dim b64args(100) ' 100 = arbitrary max
|
||||
|
||||
' Make Y64-flavored base64 versions of each arg so we don't have to
|
||||
' worry about quoting issues while executing PowerShell.
|
||||
|
||||
idx=0
|
||||
For Each arg In args
|
||||
b64args(idx) = Base64Encode(nocrlf(arg), False)
|
||||
' Y64 flavor of Base64
|
||||
b64args(idx) = replace( _
|
||||
replace( _
|
||||
replace(b64args(idx), "+", "."), _
|
||||
"/", "_" ), _
|
||||
"=", "-")
|
||||
'Wscript.Echo cstr(idx) & ": >" & arg & "< = >" & b64args(idx) & "<"
|
||||
'Wscript.Echo b64args(idx)
|
||||
idx = idx+1
|
||||
Next
|
||||
|
||||
MakeY64Args = b64args
|
||||
end function
|
||||
|
||||
Function QuoteForShell(strIn)
|
||||
QuoteForShell = """" & _
|
||||
replace(strIn, """", """""") & """"
|
||||
End Function
|
140
pack/acp/start/editorconfig-vim/tests/core/ecvimlib.ps1
Executable file
140
pack/acp/start/editorconfig-vim/tests/core/ecvimlib.ps1
Executable file
|
@ -0,0 +1,140 @@
|
|||
# ecvimlib.ps1: Editorconfig Vimscript core CLI, PowerShell version,
|
||||
# library routines.
|
||||
# Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
# Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
||||
#
|
||||
# N.B.: debug output uses Warning only because those are displayed by default.
|
||||
|
||||
#Requires -Version 3
|
||||
|
||||
# Get the directory of this script. From
|
||||
# https://stackoverflow.com/a/5466355/2877364 by
|
||||
# https://stackoverflow.com/users/23283/jaredpar
|
||||
|
||||
$global:DIR = $PSScriptRoot
|
||||
|
||||
### Set up debugging output ============================================
|
||||
|
||||
$global:debug=$env:EDITORCONFIG_DEBUG # Debug filename
|
||||
|
||||
if($global:debug -and ($global:debug -notmatch '^/')) {
|
||||
# Relative to this script unless it starts with a slash. This is because
|
||||
# cwd is usually not $DIR when testing.
|
||||
$global:debug="${DIR}/${global:debug}"
|
||||
}
|
||||
|
||||
### Process args =======================================================
|
||||
|
||||
function de64_args($argv) {
|
||||
$argv | % {
|
||||
$b64 = $_ -replace '-','=' -replace '_','/' -replace '\.','+'
|
||||
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($b64))
|
||||
}
|
||||
}
|
||||
|
||||
### Helpers ============================================================
|
||||
|
||||
# Append a string to $debug in UTF-8 rather than the default UTF-16
|
||||
filter global:D($file = $debug) {
|
||||
if($debug) {
|
||||
echo $_ | Out-File -FilePath $file -Encoding utf8 -Append
|
||||
}
|
||||
}
|
||||
|
||||
# Escape a string for Vim
|
||||
function global:vesc($str) {
|
||||
return "'" + ($str -replace "'","''") + "'"
|
||||
}
|
||||
|
||||
# Escape a string for a command-line argument.
|
||||
# See https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.arguments?view=netframework-4.7.2
|
||||
function global:argesc($arg) {
|
||||
return '"' + ($arg -replace '"','"""') + '"'
|
||||
}
|
||||
|
||||
### Find the Vim EXE ===================================================
|
||||
|
||||
function global:Find-Vim
|
||||
{
|
||||
if($env:VIM_EXE) {
|
||||
if($debug) { echo "Using env Vim $($env:VIM_EXE)" | D }
|
||||
return $env:VIM_EXE
|
||||
}
|
||||
|
||||
$vims = @(get-childitem 'c:\program files*\vim\**\vim.exe' | `
|
||||
sort LastWriteTime -Descending) # @() => always array
|
||||
|
||||
# write-host ($vims | format-table | out-string) # DEBUG
|
||||
# write-host ($vims | get-member | out-string)
|
||||
if($vims.count -gt 0) {
|
||||
if($debug) { echo "Using found Vim $($vims[0].FullName)" | D }
|
||||
return $vims[0].FullName
|
||||
}
|
||||
|
||||
throw "Could not find vim.exe. Please set VIM_EXE to the path to your Vim."
|
||||
} #Find-Vim
|
||||
|
||||
### Runner =============================================================
|
||||
|
||||
# Run a process with the given arguments.
|
||||
function global:run_process
|
||||
{
|
||||
param(
|
||||
[Parameter(Mandatory=$true, Position=0)][string]$run,
|
||||
[string]$extrapath,
|
||||
[string]$stdout, # Redirect stdout to this file
|
||||
[string]$stderr, # Redirect stderr to this file
|
||||
[string[]]$argv # Arguments to $run
|
||||
)
|
||||
$si = new-object Diagnostics.ProcessStartInfo
|
||||
if($extrapath) {
|
||||
$si.EnvironmentVariables['path']+=";${extrapath}"
|
||||
}
|
||||
$si.FileName=$run
|
||||
|
||||
# Stringify the arguments (blech)
|
||||
$argstr = $argv | % { (argesc $_) + ' ' }
|
||||
$si.Arguments = $argstr;
|
||||
|
||||
if($debug) { echo "Running process $run with arguments >>$argstr<<" | D }
|
||||
|
||||
$si.UseShellExecute=$false
|
||||
# DEBUG $si.RedirectStandardInput=$true
|
||||
if($stdout) {
|
||||
if($debug) { echo "Saving stdout to ${stdout}" | D }
|
||||
$si.RedirectStandardOutput=$true;
|
||||
}
|
||||
if($stderr) {
|
||||
if($debug) { echo "Saving stderr to ${stderr}" | D }
|
||||
$si.RedirectStandardError=$true;
|
||||
}
|
||||
|
||||
$p = [Diagnostics.Process]::Start($si)
|
||||
# DEBUG $p.StandardInput.Close() # < /dev/null
|
||||
|
||||
$p.WaitForExit()
|
||||
$retval = $p.ExitCode
|
||||
|
||||
if($stdout) {
|
||||
echo "Standard output:" | D $stdout
|
||||
$p.StandardOutput.ReadToEnd() | `
|
||||
Out-File -FilePath $stdout -Encoding utf8 -Append
|
||||
}
|
||||
|
||||
if($stderr) {
|
||||
echo "Standard error:" | D $stderr
|
||||
$p.StandardError.ReadToEnd() | `
|
||||
Out-File -FilePath $stderr -Encoding utf8 -Append
|
||||
}
|
||||
|
||||
$p.Close()
|
||||
|
||||
return $retval
|
||||
}
|
||||
|
||||
if($debug) {
|
||||
echo "======================================================" | D
|
||||
Get-Date -format F | D
|
||||
}
|
||||
|
||||
$global:VIM = Find-Vim
|
219
pack/acp/start/editorconfig-vim/tests/core/editorconfig
Executable file
219
pack/acp/start/editorconfig-vim/tests/core/editorconfig
Executable file
|
@ -0,0 +1,219 @@
|
|||
#!/bin/bash
|
||||
# editorconfig: Editorconfig Vimscript core CLI
|
||||
# Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
# Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
||||
|
||||
# Documentation {{{1
|
||||
helpstr=$(cat<<'EOF'
|
||||
editorconfig: command-line invoker for the Vimscript editorconfig core
|
||||
|
||||
Normal usage:
|
||||
editorconfig [-f <config-file name>] [-b <version>]
|
||||
[-x <extra information>] <filenames...>
|
||||
|
||||
The default <config-file name> is ".editorconfig".
|
||||
If -b is given, behave as <version>.
|
||||
If -x is given, the <extra information> is included in the debug-output file.
|
||||
|
||||
Other options:
|
||||
editorconfig -h, --help Show this help
|
||||
editorconfig -v, --version Show version information
|
||||
|
||||
Environment variables:
|
||||
VIM_EXE File/path of vim (default "vim")
|
||||
EDITORCONFIG_DEBUG File/path to which to append debug output
|
||||
|
||||
EOF
|
||||
)
|
||||
|
||||
# }}}1
|
||||
|
||||
# Get the directory of this script into $this_script_dir. {{{1
|
||||
# From https://stackoverflow.com/a/246128/2877364 by
|
||||
# https://stackoverflow.com/users/407731 et al.
|
||||
|
||||
this_script_dir=
|
||||
function get_dir()
|
||||
{
|
||||
local script_source_path="${BASH_SOURCE[0]}"
|
||||
while [ -h "$script_source_path" ]; do
|
||||
# resolve $script_source_path until the file is no longer a symlink
|
||||
this_script_dir="$( cd -P "$( dirname "$script_source_path" )" >/dev/null && pwd )"
|
||||
script_source_path="$(readlink "$script_source_path")"
|
||||
[[ $script_source_path != /* ]] && script_source_path="$this_script_dir/$script_source_path"
|
||||
# if $script_source_path was a relative symlink, we need to resolve
|
||||
# it relative to the path where the symlink file was located
|
||||
done
|
||||
this_script_dir="$( cd -P "$( dirname "$script_source_path" )" >/dev/null && pwd )"
|
||||
} #get_dir()
|
||||
|
||||
get_dir
|
||||
|
||||
# }}}1
|
||||
|
||||
# Setup debug output, if $EDITORCONFIG_DEBUG is given {{{1
|
||||
debug="${EDITORCONFIG_DEBUG}" # Debug filename
|
||||
if [[ $debug && $debug != /* ]]; then # Relative to this script unless it
|
||||
debug="${this_script_dir}/${debug}" # starts with a slash. This is because
|
||||
fi # cwd is usually not $this_script_dir when testing.
|
||||
if [[ $debug ]] && ! touch "$debug"; then
|
||||
echo "Could not write file '$debug' - aborting" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[[ $debug ]] && echo "$(date) ==================================" >> "$debug"
|
||||
|
||||
# }}}1
|
||||
|
||||
# Option processing {{{1
|
||||
|
||||
# Use a manually-specified Vim, if any
|
||||
if [[ $VIM_EXE ]]; then
|
||||
vim_pgm="$VIM_EXE"
|
||||
else
|
||||
vim_pgm="vim"
|
||||
fi
|
||||
|
||||
# Command-line options
|
||||
confname=
|
||||
ver=
|
||||
print_ver=
|
||||
extra_info=
|
||||
|
||||
while getopts 'hvf:b:-:x:' opt ; do
|
||||
case "$opt" in
|
||||
(v) print_ver=1
|
||||
;;
|
||||
|
||||
(f) confname="$OPTARG"
|
||||
;;
|
||||
|
||||
(b) ver="$OPTARG"
|
||||
;;
|
||||
|
||||
(-) case "$OPTARG" in # hacky long-option processing
|
||||
version) print_ver=1
|
||||
;;
|
||||
dummy) # A dummy option so that I can test
|
||||
# list-valued EDITORCONFIG_CMD
|
||||
;;
|
||||
help) echo "$helpstr"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
(h) echo "$helpstr"
|
||||
exit 0
|
||||
;;
|
||||
|
||||
# A way to put the test name into the log
|
||||
(x) extra_info="$OPTARG"
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
shift $(( $OPTIND - 1 ))
|
||||
|
||||
if [[ $print_ver ]]; then
|
||||
echo "EditorConfig VimScript Core Version 0.12.2"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if (( "$#" < 1 )); then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $1 = '-' ]]; then
|
||||
echo "Reading filenames from stdin not yet supported" 1>&2 # TODO
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# }}}1
|
||||
|
||||
# Build the Vim command line {{{1
|
||||
|
||||
fn="$(mktemp)" # Vim will write the settings into here. ~stdout.
|
||||
script_output_fn="${debug:+$(mktemp)}" # Vim's :messages. ~stderr.
|
||||
|
||||
cmd="call editorconfig_core#currbuf_cli({"
|
||||
|
||||
# Names
|
||||
cmd+="'output':'${fn//\'/\'\'}', "
|
||||
# filename to put the settings in
|
||||
[[ $debug ]] && cmd+=" 'dump':'${script_output_fn//\'/\'\'}', "
|
||||
# where to put debug info
|
||||
|
||||
# Filenames to get the settings for
|
||||
cmd+="'target':["
|
||||
for f in "$@" ; do
|
||||
cmd+="'${f//\'/\'\'}', "
|
||||
done
|
||||
cmd+="],"
|
||||
# filename to get the settings for
|
||||
|
||||
# Job
|
||||
cmd+="}, {"
|
||||
[[ $confname ]] && cmd+="'config':'${confname//\'/\'\'}', "
|
||||
# config name (e.g., .editorconfig)
|
||||
[[ $ver ]] && cmd+="'version':'${ver//\'/\'\'}', "
|
||||
# version number we should behave as
|
||||
cmd+="})"
|
||||
|
||||
vim_args=(
|
||||
-c "set runtimepath+=$this_script_dir/../.."
|
||||
-c "$cmd"
|
||||
)
|
||||
|
||||
# }}}1
|
||||
|
||||
# Run the editorconfig core through Vim {{{1
|
||||
# Thanks for options to
|
||||
# http://vim.wikia.com/wiki/Vim_as_a_system_interpreter_for_vimscript .
|
||||
# Add -V1 to the below for debugging output.
|
||||
# Do not output anything to stdout or stderr,
|
||||
# since it messes up ctest's interpretation
|
||||
# of the results.
|
||||
|
||||
"$vim_pgm" -nNes -i NONE -u NONE -U NONE \
|
||||
"${vim_args[@]}" \
|
||||
</dev/null &>> "${debug:-/dev/null}"
|
||||
vimstatus="$?"
|
||||
if [[ $vimstatus -eq 0 ]]; then
|
||||
cat "$fn"
|
||||
fi
|
||||
|
||||
# }}}1
|
||||
|
||||
# Produce debug output {{{1
|
||||
# Debug output cannot be included on stdout or stderr, because
|
||||
# ctest's regex check looks both of those places. Therefore, dump to a
|
||||
# separate debugging file.
|
||||
if [[ $debug ]]
|
||||
then
|
||||
[[ $extra_info ]] && echo "--- $extra_info ---" >> "$debug"
|
||||
echo "Vim in $vim_pgm" >> "$debug"
|
||||
echo "Current directory: $(pwd)" >> "$debug"
|
||||
echo "Script directory: $this_script_dir" >> "$debug"
|
||||
echo Vim args: "${vim_args[@]}" >> "$debug"
|
||||
#od -c <<<"${vim_args[@]}" >> "$debug"
|
||||
echo "Vim returned $vimstatus" >> "$debug"
|
||||
echo "Vim messages were: " >> "$debug"
|
||||
cat "$script_output_fn" >> "$debug"
|
||||
echo "Output was:" >> "$debug"
|
||||
od -c "$fn" >> "$debug"
|
||||
|
||||
rm -f "$script_output_fn"
|
||||
fi
|
||||
|
||||
# }}}1
|
||||
|
||||
# Cleanup {{{1
|
||||
|
||||
rm -f "$fn"
|
||||
|
||||
# }}}1
|
||||
|
||||
exit "$vimstatus" # forward the Vim exit status to the caller
|
||||
# vi: set ft=sh fdm=marker:
|
11
pack/acp/start/editorconfig-vim/tests/core/editorconfig.bat
Executable file
11
pack/acp/start/editorconfig-vim/tests/core/editorconfig.bat
Executable file
|
@ -0,0 +1,11 @@
|
|||
@echo off
|
||||
:: editorconfig.bat: First-level invoker for editorconfig-core-vimscript
|
||||
:: and editorconfig-vim.
|
||||
:: Just passes the full command line to editorconfig1.vbs, since VBScript
|
||||
:: applies very simple quoting rules when it parses a command line.
|
||||
:: Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
:: Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
||||
set here=%~dp0
|
||||
|
||||
cscript //Nologo "%here%editorconfig1.vbs" %*
|
||||
:: %* has the whole command line
|
39
pack/acp/start/editorconfig-vim/tests/core/editorconfig1.vbs
Executable file
39
pack/acp/start/editorconfig-vim/tests/core/editorconfig1.vbs
Executable file
|
@ -0,0 +1,39 @@
|
|||
' editorconfig1.vbs: run by editorconfig.bat
|
||||
' runs editorconfig2.ps1
|
||||
' Part of editorconfig-core-vimscript and editorconfig-vim.
|
||||
'
|
||||
' Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
' Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
||||
'
|
||||
' Modified from
|
||||
' https://stackoverflow.com/a/2470557/2877364 by
|
||||
' https://stackoverflow.com/users/2441/aphoria
|
||||
|
||||
' Thanks to https://www.geekshangout.com/vbs-script-to-get-the-location-of-the-current-script/
|
||||
currentScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
|
||||
|
||||
' Load our common library. Thanks to https://stackoverflow.com/a/316169/2877364
|
||||
With CreateObject("Scripting.FileSystemObject")
|
||||
executeGlobal .openTextFile(currentScriptPath & "ecvbslib.vbs").readAll()
|
||||
End With
|
||||
|
||||
' === MAIN ==================================================================
|
||||
|
||||
' Encode all the arguments as modified base64 so there will be no quoting
|
||||
' issues when we invoke powershell.
|
||||
b64args = MakeY64Args(Wscript.Arguments)
|
||||
|
||||
' Quote script name just in case
|
||||
ps1name = QuoteForShell(currentScriptPath & "editorconfig2.ps1")
|
||||
'Wscript.Echo "Script is in " & ps1name
|
||||
|
||||
if True then
|
||||
retval = RunCommandAndEcho( "powershell.exe" & _
|
||||
" -executionpolicy bypass -file " & ps1name & " " & join(b64args) _
|
||||
)
|
||||
' add -noexit to leave window open so you can see error messages
|
||||
|
||||
WScript.Quit retval
|
||||
end if
|
||||
|
||||
' vi: set ts=4 sts=4 sw=4 et ai:
|
218
pack/acp/start/editorconfig-vim/tests/core/editorconfig2.ps1
Executable file
218
pack/acp/start/editorconfig-vim/tests/core/editorconfig2.ps1
Executable file
|
@ -0,0 +1,218 @@
|
|||
# editorconfig2.ps1: Editorconfig Vimscript core CLI, PowerShell version
|
||||
# Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
# Licensed CC-BY-SA, version 3.0 or any later version, at your option.
|
||||
# Thanks to https://cecs.wright.edu/~pmateti/Courses/233/Labs/Scripting/bashVsPowerShellTable.html
|
||||
# by Gallagher and Mateti.
|
||||
|
||||
#Requires -Version 3
|
||||
|
||||
. "$PSScriptRoot\ecvimlib.ps1"
|
||||
|
||||
# Argument parsing =================================================== {{{1
|
||||
|
||||
$argv = @(de64_args($args))
|
||||
|
||||
# Defaults
|
||||
$report_version = $false
|
||||
$set_version = ''
|
||||
$config_name = '.editorconfig'
|
||||
$extra_info = ''
|
||||
$files=@()
|
||||
|
||||
# Hand-parse - pretend we're sort of like getopt.
|
||||
$idx = 0
|
||||
while($idx -lt $argv.count) {
|
||||
$a = $argv[$idx]
|
||||
|
||||
switch -CaseSensitive -Regex ($a) {
|
||||
'^(-v|--version)$' { $report_version = $true }
|
||||
|
||||
'^--dummy$' {
|
||||
# A dummy option so that I can test list-valued EDITORCONFIG_CMD
|
||||
}
|
||||
|
||||
'^-f$' {
|
||||
if($idx -eq ($argv.count-1)) {
|
||||
throw '-f <filename>: no filename provided'
|
||||
} else {
|
||||
++$idx
|
||||
$config_name = $argv[$idx]
|
||||
}
|
||||
} #-f
|
||||
|
||||
'^-b$' {
|
||||
if($idx -eq ($argv.count-1)) {
|
||||
throw '-b <version>: no version provided'
|
||||
} else {
|
||||
++$idx
|
||||
$set_version = $argv[$idx]
|
||||
}
|
||||
} #-b
|
||||
|
||||
'^-x$' {
|
||||
if($idx -eq ($argv.count-1)) {
|
||||
throw '-x <extra info>: no info provided'
|
||||
} else {
|
||||
++$idx
|
||||
$extra_info = $argv[$idx]
|
||||
}
|
||||
} #-x
|
||||
|
||||
'^--$' { # End of options, so capture the rest as filenames
|
||||
++$idx;
|
||||
while($idx -lt $argv.count) {
|
||||
$files += $argv[$idx]
|
||||
}
|
||||
}
|
||||
|
||||
default { $files += $a }
|
||||
}
|
||||
|
||||
++$idx
|
||||
} # end foreach argument
|
||||
|
||||
# }}}1
|
||||
# Argument processing ================================================ {{{1
|
||||
|
||||
if($debug) {
|
||||
if($extra_info -ne '') {
|
||||
echo "--- $extra_info --- " | D
|
||||
}
|
||||
|
||||
echo "Running in $DIR" | D
|
||||
echo "Vim executable: $VIM" | D
|
||||
echo "report version? $report_version" | D
|
||||
echo "set version to: $set_version" | D
|
||||
echo "config filename: $config_name" | D
|
||||
echo "Filenames: $files" | D
|
||||
echo "Args: $args" | D
|
||||
echo "Decoded args: $argv" | D
|
||||
}
|
||||
|
||||
if($report_version) {
|
||||
echo "EditorConfig VimScript Core Version 0.12.2"
|
||||
exit
|
||||
}
|
||||
|
||||
if($files.count -lt 1) {
|
||||
exit
|
||||
}
|
||||
|
||||
if($files[0] -eq '-') {
|
||||
echo "Reading filenames from stdin not yet supported" # TODO
|
||||
exit 1
|
||||
}
|
||||
|
||||
$fn=[System.IO.Path]::GetTempFileName();
|
||||
# Vim will write the settings into here. Sort of like stdout.
|
||||
$script_output_fn = ''
|
||||
if($debug) {
|
||||
$script_output_fn = [System.IO.Path]::GetTempFileName()
|
||||
}
|
||||
|
||||
# Permit throwing in setup commands
|
||||
$cmd = ''
|
||||
if($env:EDITORCONFIG_EXTRA) {
|
||||
$cmd += $env:EDITORCONFIG_EXTRA + ' | '
|
||||
}
|
||||
|
||||
# }}}1
|
||||
# Build Vim command line ============================================= {{{1
|
||||
$cmd += 'call editorconfig_core#currbuf_cli({'
|
||||
|
||||
# Names
|
||||
$cmd += "'output':" + (vesc($fn)) + ", "
|
||||
# filename to put the settings in
|
||||
if($debug) {
|
||||
$cmd += " 'dump':" + (vesc($script_output_fn)) + ", "
|
||||
# where to put debug info
|
||||
}
|
||||
|
||||
# Filenames to get the settings for
|
||||
$cmd += "'target':["
|
||||
ForEach ($item in $files) {
|
||||
$cmd += (vesc($item)) + ", "
|
||||
}
|
||||
$cmd += "],"
|
||||
|
||||
# Job
|
||||
$cmd += "}, {"
|
||||
if($config_name) { $cmd += "'config':" + (vesc($config_name)) + ", " }
|
||||
# config name (e.g., .editorconfig)
|
||||
if($set_version) { $cmd += "'version':" + (vesc($set_version)) + ", " }
|
||||
# version number we should behave as
|
||||
$cmd += "})"
|
||||
|
||||
#$cmd =':q!' # DEBUG
|
||||
if($debug) { echo "Using Vim command ${cmd}" | D }
|
||||
$vim_args = @(
|
||||
'-c', "set runtimepath+=${DIR}\..\..",
|
||||
'-c', $cmd,
|
||||
'-c', 'quit!' # TODO write a wrapper that will cquit on exception
|
||||
)
|
||||
|
||||
# Run editorconfig. Thanks for options to
|
||||
# http://vim.wikia.com/wiki/Vim_as_a_system_interpreter_for_vimscript .
|
||||
# Add -V1 to the below for debugging output.
|
||||
# Do not output anything to stdout or stderr,
|
||||
# since it messes up ctest's interpretation
|
||||
# of the results.
|
||||
|
||||
$basic_args = '-nNes','-i','NONE','-u','NONE','-U','NONE' #, '-V1'
|
||||
|
||||
# }}}1
|
||||
# Run Vim ============================================================ {{{1
|
||||
|
||||
if($debug) { echo "Running vim ${VIM}" | D }
|
||||
$vimstatus = run_process $VIM -stdout $debug -stderr $debug `
|
||||
-argv ($basic_args+$vim_args)
|
||||
if($debug) { echo "Done running vim" | D }
|
||||
|
||||
if($vimstatus -eq 0) {
|
||||
cat $fn
|
||||
}
|
||||
|
||||
# }}}1
|
||||
# Produce debug output =============================================== {{{1
|
||||
|
||||
# Debug output cannot be included on stdout or stderr, because
|
||||
# ctest's regex check looks both of those places. Therefore, dump to a
|
||||
# separate debugging file.
|
||||
|
||||
if($debug) {
|
||||
echo "Current directory:" | D
|
||||
(get-item -path '.').FullName | D
|
||||
echo "Script directory: $DIR" | D
|
||||
### echo Vim args: "${vim_args[@]}" >> "$debug"
|
||||
### #od -c <<<"${vim_args[@]}" >> "$debug"
|
||||
echo "Vim returned $vimstatus" | D
|
||||
echo "Vim messages were: " | D
|
||||
cat $script_output_fn | D
|
||||
echo "Output was:" | D
|
||||
|
||||
# Modified from https://www.itprotoday.com/powershell/get-hex-dumps-files-powershell
|
||||
Get-Content $script_output_fn -Encoding Byte -ReadCount 16 | `
|
||||
ForEach-Object {
|
||||
$output = ""
|
||||
$chars = ''
|
||||
foreach ( $byte in $_ ) {
|
||||
$output += "{0:X2} " -f $byte
|
||||
if( ($byte -ge 32) -and ($byte -le 127) ) {
|
||||
$chars += [char]$byte
|
||||
} else {
|
||||
$chars += '.'
|
||||
}
|
||||
}
|
||||
$output + ' ' + $chars
|
||||
} | D
|
||||
|
||||
del -Force $script_output_fn
|
||||
} #endif $debug
|
||||
|
||||
# }}}1
|
||||
|
||||
del -Force $fn
|
||||
|
||||
exit $vimstatus
|
||||
|
||||
# vi: set fdm=marker:
|
12
pack/acp/start/editorconfig-vim/tests/fetch-vim.bat
Executable file
12
pack/acp/start/editorconfig-vim/tests/fetch-vim.bat
Executable file
|
@ -0,0 +1,12 @@
|
|||
:: fetch-vim.bat: Fetch vim if necessary
|
||||
:: For use in the editorconfig-vim Appveyor build
|
||||
:: Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
:: Licensed Apache 2.0, or any later version, at your option.
|
||||
|
||||
:: If it's already been loaded from the cache, we're done
|
||||
if exist C:\vim\vim\vim80\vim.exe exit
|
||||
|
||||
:: Otherwise, download and unzip it.
|
||||
appveyor DownloadFile https://github.com/cxw42/editorconfig-core-vimscript/releases/download/v0.1.0/vim.7z
|
||||
|
||||
7z x vim.7z -oC:\vim
|
41
pack/acp/start/editorconfig-vim/tests/fetch-vim.sh
Executable file
41
pack/acp/start/editorconfig-vim/tests/fetch-vim.sh
Executable file
|
@ -0,0 +1,41 @@
|
|||
#!/bin/bash
|
||||
# fetch-vim.bat: Fetch vim if necessary
|
||||
# For use in the editorconfig-vim Appveyor build
|
||||
# Copyright (c) 2018--2019 Chris White. All rights reserved.
|
||||
# Licensed Apache 2.0, or any later version, at your option.
|
||||
|
||||
# Debugging
|
||||
set -x
|
||||
set -o nounset
|
||||
#set -o errexit
|
||||
|
||||
# Basic system info
|
||||
uname -a
|
||||
pwd
|
||||
ls -l
|
||||
|
||||
echo "VIM_EXE: $VIM_EXE"
|
||||
set
|
||||
|
||||
# If it's already been loaded from the cache, we're done
|
||||
if [[ -x "$VIM_EXE" ]]; then
|
||||
echo Vim found in cache at "$VIM_EXE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Otherwise, clone and build it
|
||||
WHITHER="$APPVEYOR_BUILD_FOLDER/vim"
|
||||
|
||||
git clone https://github.com/vim/vim-appimage.git
|
||||
cd vim-appimage
|
||||
git submodule update --init --recursive
|
||||
|
||||
cd vim/src
|
||||
./configure --with-features=huge --prefix="$WHITHER" --enable-fail-if-missing
|
||||
make -j2 # Free tier provides two cores
|
||||
make install
|
||||
./vim --version
|
||||
cd $APPVEYOR_BUILD_FOLDER
|
||||
find . -type f -name vim -exec ls -l {} +
|
||||
|
||||
echo Done fetching and installing vim
|
2
pack/acp/start/editorconfig-vim/tests/plugin/.gitignore
vendored
Normal file
2
pack/acp/start/editorconfig-vim/tests/plugin/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Where bundler installs local Gemfile dependencies
|
||||
/vendor/
|
5
pack/acp/start/editorconfig-vim/tests/plugin/Gemfile
Normal file
5
pack/acp/start/editorconfig-vim/tests/plugin/Gemfile
Normal file
|
@ -0,0 +1,5 @@
|
|||
source 'https://rubygems.org'
|
||||
|
||||
gem 'rake', '~> 12.3.3'
|
||||
gem 'rspec', '~> 3.4.0'
|
||||
gem 'vimrunner', '~> 0.3.1'
|
27
pack/acp/start/editorconfig-vim/tests/plugin/Gemfile.lock
Normal file
27
pack/acp/start/editorconfig-vim/tests/plugin/Gemfile.lock
Normal file
|
@ -0,0 +1,27 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
diff-lcs (1.2.5)
|
||||
rake (12.3.3)
|
||||
rspec (3.4.0)
|
||||
rspec-core (~> 3.4.0)
|
||||
rspec-expectations (~> 3.4.0)
|
||||
rspec-mocks (~> 3.4.0)
|
||||
rspec-core (3.4.1)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-expectations (3.4.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-mocks (3.4.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-support (3.4.1)
|
||||
vimrunner (0.3.1)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
rake (~> 12.3.3)
|
||||
rspec (~> 3.4.0)
|
||||
vimrunner (~> 0.3.1)
|
8
pack/acp/start/editorconfig-vim/tests/plugin/Rakefile
Normal file
8
pack/acp/start/editorconfig-vim/tests/plugin/Rakefile
Normal file
|
@ -0,0 +1,8 @@
|
|||
#
|
||||
# run `rake` to run tests
|
||||
|
||||
require 'rspec/core/rake_task'
|
||||
|
||||
RSpec::Core::RakeTask.new(:spec)
|
||||
|
||||
task :default => :spec
|
|
@ -0,0 +1,4 @@
|
|||
[*.rb]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
|
@ -0,0 +1,161 @@
|
|||
require 'vimrunner'
|
||||
|
||||
def create_vim(*initial_commands)
|
||||
vim = Vimrunner.start
|
||||
initial_commands.each do |cmd|
|
||||
vim.command cmd
|
||||
end
|
||||
vim.add_plugin(File.expand_path('../../../..', __FILE__), 'plugin/editorconfig.vim')
|
||||
return vim
|
||||
end
|
||||
|
||||
# The base path of the testing files
|
||||
BASE_PATH = File.expand_path('../plugin_tests/test_files/', __FILE__)
|
||||
|
||||
# file_name is the file name that should be open by Vim
|
||||
# expected_values is a Hash that contains all the Vim options we need to test
|
||||
def test_editorconfig(vim, file_name, expected_values)
|
||||
vim.edit(File.join(BASE_PATH, file_name))
|
||||
|
||||
expected_values.each do |key, val|
|
||||
expect(vim.echo("&l:#{key}")).to eq(val)
|
||||
end
|
||||
|
||||
vim.command 'bd!'
|
||||
end
|
||||
|
||||
def test_instance(vim)
|
||||
describe 'plugin/editorconfig.vim' do
|
||||
after(:all) do
|
||||
vim.kill
|
||||
end
|
||||
|
||||
describe '#all' do
|
||||
it '3_space.py' do
|
||||
test_editorconfig vim, '3_space.txt',
|
||||
expandtab: '1',
|
||||
shiftwidth: '3',
|
||||
tabstop: '3'
|
||||
end
|
||||
end
|
||||
|
||||
it '4_space.py' do
|
||||
test_editorconfig vim, '4_space.py',
|
||||
expandtab: '1',
|
||||
shiftwidth: '4',
|
||||
tabstop: '8'
|
||||
end
|
||||
|
||||
it 'space.txt' do
|
||||
test_editorconfig vim, 'space.txt',
|
||||
expandtab: '1',
|
||||
shiftwidth: vim.echo('&l:tabstop')
|
||||
end
|
||||
|
||||
it 'tab.txt' do
|
||||
test_editorconfig vim, 'tab.txt',
|
||||
expandtab: '0'
|
||||
end
|
||||
|
||||
it '4_tab.txt' do
|
||||
test_editorconfig vim, '4_tab.txt',
|
||||
expandtab: '0',
|
||||
shiftwidth: '4',
|
||||
tabstop: '4'
|
||||
end
|
||||
|
||||
it '4_tab_width_of_8' do
|
||||
test_editorconfig vim, '4_tab_width_of_8.txt',
|
||||
expandtab: '0',
|
||||
shiftwidth: '4',
|
||||
tabstop: '8'
|
||||
end
|
||||
|
||||
it 'lf.txt' do
|
||||
test_editorconfig vim, 'lf.txt',
|
||||
fileformat: 'unix'
|
||||
end
|
||||
|
||||
it 'crlf.txt' do
|
||||
test_editorconfig vim, 'crlf.txt',
|
||||
fileformat: 'dos'
|
||||
end
|
||||
|
||||
it 'cr.txt' do
|
||||
test_editorconfig vim, 'cr.txt',
|
||||
fileformat: 'mac'
|
||||
end
|
||||
|
||||
it 'utf-8.txt' do
|
||||
test_editorconfig vim, 'utf-8.txt',
|
||||
fileencoding: 'utf-8',
|
||||
bomb: '0'
|
||||
end
|
||||
|
||||
it 'utf-8-bom.txt' do
|
||||
test_editorconfig vim, 'utf-8-bom.txt',
|
||||
fileencoding: 'utf-8',
|
||||
bomb: '1'
|
||||
end
|
||||
|
||||
it 'utf-16be.txt' do
|
||||
test_editorconfig vim, 'utf-16be.txt',
|
||||
fileencoding: 'utf-16'
|
||||
end
|
||||
|
||||
it 'utf-16le.txt' do
|
||||
test_editorconfig vim, 'utf-16le.txt',
|
||||
fileencoding: 'utf-16le'
|
||||
end
|
||||
|
||||
it 'latin1.txt' do
|
||||
test_editorconfig vim, 'latin1.txt',
|
||||
fileencoding: 'latin1'
|
||||
end
|
||||
|
||||
# insert_final_newline by PreserveNoEOL tests are omitted, since they are not supported
|
||||
if vim.echo("exists('+fixendofline')") == '1'
|
||||
it 'with_newline.txt' do
|
||||
test_editorconfig vim, 'with_newline.txt',
|
||||
fixendofline: '1'
|
||||
end
|
||||
|
||||
it 'without_newline.txt' do
|
||||
test_editorconfig vim, 'without_newline.txt',
|
||||
fixendofline: '0'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Test the vim core
|
||||
(lambda do
|
||||
puts 'Testing default'
|
||||
vim = create_vim
|
||||
test_instance vim
|
||||
end).call
|
||||
|
||||
# Test the vim core with an express setting
|
||||
(lambda do
|
||||
puts 'Testing with express vim_core mode'
|
||||
vim = create_vim("let g:EditorConfig_core_mode='vim_core'")
|
||||
test_instance vim
|
||||
end).call
|
||||
|
||||
# Test with external-core mode, but no external core defined
|
||||
(lambda do
|
||||
puts 'Testing with fallback to vim_core mode'
|
||||
vim = create_vim("let g:EditorConfig_core_mode='external_command'")
|
||||
test_instance vim
|
||||
end).call
|
||||
|
||||
# Test with an external core, if desired
|
||||
extcore = ENV['EDITORCONFIG_VIM_EXTERNAL_CORE']
|
||||
if extcore
|
||||
puts "Testing with external_command #{extcore}"
|
||||
vim = create_vim(
|
||||
"let g:EditorConfig_core_mode='external_command'",
|
||||
"let g:EditorConfig_exec_path='#{extcore}'",
|
||||
)
|
||||
test_instance vim
|
||||
end
|
45
pack/acp/start/editorconfig-vim/tests/travis-test.sh
Executable file
45
pack/acp/start/editorconfig-vim/tests/travis-test.sh
Executable file
|
@ -0,0 +1,45 @@
|
|||
#!/bin/bash
|
||||
# travis-test.sh: Script for running editorconfig-vim tests under Travis CI.
|
||||
# Copyright (c) 2019 Chris White. All rights reserved.
|
||||
# Licensed Apache, version 2.0 or any later version, at your option.
|
||||
|
||||
# Error exit; debug output
|
||||
set -vxEeuo pipefail
|
||||
|
||||
# Permit `travis-test.sh plugin` if TEST_WHICH is unset
|
||||
if [[ ( ! "${TEST_WHICH:-}" ) && "${1:-}" ]]; then
|
||||
export TEST_WHICH="$1"
|
||||
fi
|
||||
|
||||
if [[ "$TEST_WHICH" = 'plugin' ]]; then # test plugin
|
||||
|
||||
# If not running from Travis, do what Travis would have
|
||||
# done for us.
|
||||
if [[ ! "${BUNDLE_GEMFILE:-}" ]]; then
|
||||
here="$(cd "$(dirname "$0")" &>/dev/null ; pwd)"
|
||||
export BUNDLE_GEMFILE="${here}/plugin/Gemfile"
|
||||
# Install into tests/plugin/vendor. Don't clear it first,
|
||||
# since you can clear it yourself if you're running from a
|
||||
# dev environment.
|
||||
bundle install --jobs=3 --retry=3 --deployment
|
||||
fi
|
||||
|
||||
# Use the standalone Vimscript EditorConfig core to test the plugin's
|
||||
# external_command mode
|
||||
export EDITORCONFIG_VIM_EXTERNAL_CORE=tests/core/editorconfig
|
||||
|
||||
bundle exec rspec tests/plugin/spec/editorconfig_spec.rb
|
||||
|
||||
elif [[ "$TEST_WHICH" = 'core' ]]; then # test core
|
||||
cd tests/core
|
||||
mkdir -p build # May already exist if running from a dev env
|
||||
cd build
|
||||
cmake ..
|
||||
ctest . --output-on-failure -VV -C Debug
|
||||
# -C Debug: for Visual Studio builds, you have to specify
|
||||
# a configuration.
|
||||
|
||||
else
|
||||
echo 'Invalid TEST_WHICH value' 1>&2
|
||||
exit 1
|
||||
fi
|
|
@ -9,6 +9,7 @@ Git submodules are slow, so handle this manually.
|
|||
|
||||
## pack/acp/start/
|
||||
|
||||
* [editorconfig-vim](https://github.com/editorconfig/editorconfig-vim)
|
||||
* [goyo.vim](https://github.com/junegunn/goyo.vim)
|
||||
* [gruvbox](https://github.com/morhetz/gruvbox)
|
||||
* [limelight.vim](https://github.com/junegunn/limelight.vim)
|
||||
|
|
Loading…
Reference in a new issue