Merge 9d72894faf
into 5ecf2c0bc8
This commit is contained in:
commit
9cefe55cb9
33 changed files with 2523 additions and 0 deletions
6
sources_non_forked/vim-scala/.gitignore
vendored
Normal file
6
sources_non_forked/vim-scala/.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# Ignore Vim tag files
|
||||||
|
tags
|
||||||
|
|
||||||
|
# Ignore Vim swap files
|
||||||
|
.*.swp
|
||||||
|
.*.swo
|
11
sources_non_forked/vim-scala/.travis.yml
Normal file
11
sources_non_forked/vim-scala/.travis.yml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
language: ruby
|
||||||
|
rvm:
|
||||||
|
- 1.9.3
|
||||||
|
before_install: sudo apt-get install vim-gtk
|
||||||
|
before_script:
|
||||||
|
- "export DISPLAY=:99.0"
|
||||||
|
- "sh -e /etc/init.d/xvfb start"
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
on_success: never
|
||||||
|
on_failure: change
|
5
sources_non_forked/vim-scala/Gemfile
Normal file
5
sources_non_forked/vim-scala/Gemfile
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
gem 'vimrunner', '0.3.0'
|
||||||
|
gem 'rake', '10.0.4'
|
||||||
|
gem 'rspec', '~> 2.13.0'
|
||||||
|
|
20
sources_non_forked/vim-scala/Gemfile.lock
Normal file
20
sources_non_forked/vim-scala/Gemfile.lock
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
diff-lcs (1.1.3)
|
||||||
|
rake (0.9.2.2)
|
||||||
|
rspec (2.9.0)
|
||||||
|
rspec-core (~> 2.9.0)
|
||||||
|
rspec-expectations (~> 2.9.0)
|
||||||
|
rspec-mocks (~> 2.9.0)
|
||||||
|
rspec-core (2.9.0)
|
||||||
|
rspec-expectations (2.9.1)
|
||||||
|
diff-lcs (~> 1.1.3)
|
||||||
|
rspec-mocks (2.9.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
rake
|
||||||
|
rspec
|
201
sources_non_forked/vim-scala/LICENSE.TXT
Normal file
201
sources_non_forked/vim-scala/LICENSE.TXT
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright {yyyy} {name of copyright owner}
|
||||||
|
|
||||||
|
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.
|
63
sources_non_forked/vim-scala/README.md
Normal file
63
sources_non_forked/vim-scala/README.md
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
vim-scala
|
||||||
|
=========
|
||||||
|
|
||||||
|
This is a "bundle" for Vim that builds off of the initial Scala plugin modules
|
||||||
|
by Stefan Matthias Aust and adds some more "stuff" that I find useful, including
|
||||||
|
all of my notes and customizations.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You really should be using Tim Pope's [Pathogen](https://github.com/tpope/vim-pathogen) module for Vim (http://tammersaleh.com/posts/the-modern-vim-config-with-pathogen) if you're going to clone this repository because, well... you should.
|
||||||
|
|
||||||
|
### Using the command-line
|
||||||
|
|
||||||
|
Using wget:
|
||||||
|
|
||||||
|
```mkdir -p ~/.vim/{ftdetect,indent,syntax} && for d in ftdetect indent syntax ; do wget -O ~/.vim/$d/scala.vim https://raw.githubusercontent.com/derekwyatt/vim-scala/master/$d/scala.vim; done```
|
||||||
|
|
||||||
|
Using cURL:
|
||||||
|
|
||||||
|
```mkdir -p ~/.vim/{ftdetect,indent,syntax} && for d in ftdetect indent syntax ; do curl -o ~/.vim/$d/scala.vim https://raw.githubusercontent.com/derekwyatt/vim-scala/master/$d/scala.vim; done```
|
||||||
|
|
||||||
|
### Vundle
|
||||||
|
Alternatively, you can use [Vundle](https://github.com/gmarik/vundle) to
|
||||||
|
manage your plugins.
|
||||||
|
|
||||||
|
If you have Vundle installed, simply add the following to your .vimrc:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
Plugin 'derekwyatt/vim-scala'
|
||||||
|
```
|
||||||
|
|
||||||
|
and then run
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:PluginInstall
|
||||||
|
```
|
||||||
|
|
||||||
|
to install it.
|
||||||
|
|
||||||
|
## Sorting of import statements
|
||||||
|
:SortScalaImports
|
||||||
|
|
||||||
|
There are different modes for import sorting available. For details, please
|
||||||
|
consult the vimdoc help with
|
||||||
|
|
||||||
|
:help :SortScalaImports
|
||||||
|
|
||||||
|
## Scaladoc comment indentation
|
||||||
|
|
||||||
|
By default, the plugin indents documentation comments according to the standard
|
||||||
|
Javadoc format
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a doc comment using Javadoc-style indentation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
To enable the indentation standard as recommended for Scaladoc comments (from
|
||||||
|
http://docs.scala-lang.org/style/scaladoc.html, since Scaladoc2), add the
|
||||||
|
command ``let g:scala_scaladoc_indent = 1`` to .vimrc file, e.g:
|
||||||
|
|
||||||
|
/** This is a Scaladoc comment using the recommended indentation.
|
||||||
|
* let g:scala_scaladoc_indent = 1
|
||||||
|
*/
|
6
sources_non_forked/vim-scala/Rakefile
Normal file
6
sources_non_forked/vim-scala/Rakefile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
require 'rspec/core/rake_task'
|
||||||
|
|
||||||
|
RSpec::Core::RakeTask.new
|
||||||
|
|
||||||
|
task :test => :spec
|
||||||
|
task :default => :spec
|
14
sources_non_forked/vim-scala/after/syntax/help.vim
Normal file
14
sources_non_forked/vim-scala/after/syntax/help.vim
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
" Extends standard help syntax with highlighting of Scala code.
|
||||||
|
"
|
||||||
|
" Place code between !sc! and !/sc! delimiters. These will be hidden if Vim is
|
||||||
|
" built with conceal support.
|
||||||
|
|
||||||
|
unlet! b:current_syntax
|
||||||
|
|
||||||
|
syntax include @ScalaCode syntax/scala.vim
|
||||||
|
|
||||||
|
if has('conceal')
|
||||||
|
syntax region rgnScala matchgroup=Ignore concealends start='!sc!' end='!/sc!' contains=@ScalaCode
|
||||||
|
else
|
||||||
|
syntax region rgnScala matchgroup=Ignore start='!sc!' end='!/sc!' contains=@ScalaCode
|
||||||
|
endif
|
30
sources_non_forked/vim-scala/compiler/sbt.vim
Normal file
30
sources_non_forked/vim-scala/compiler/sbt.vim
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
" Vim compiler file
|
||||||
|
" Language: Scala SBT (http://www.scala-sbt.org/)
|
||||||
|
" Maintainer: Derek Wyatt
|
||||||
|
" URL: https://github.com/derekwyatt/vim-scala
|
||||||
|
" License: Apache 2
|
||||||
|
" ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if exists('current_compiler')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = 'sbt'
|
||||||
|
|
||||||
|
if exists(':CompilerSet') != 2 " older Vim always used :setlocal
|
||||||
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo-=C
|
||||||
|
|
||||||
|
CompilerSet makeprg=sbt\ -Dsbt.log.noformat=true\ compile
|
||||||
|
|
||||||
|
CompilerSet errorformat=
|
||||||
|
\%E\ %#[error]\ %f:%l:\ %m,%C\ %#[error]\ %p^,%-C%.%#,%Z,
|
||||||
|
\%W\ %#[warn]\ %f:%l:\ %m,%C\ %#[warn]\ %p^,%-C%.%#,%Z,
|
||||||
|
\%-G%.%#
|
||||||
|
|
||||||
|
let &cpo = s:cpo_save
|
||||||
|
unlet s:cpo_save
|
||||||
|
|
||||||
|
" vim:set sw=2 sts=2 ts=8 et:
|
13
sources_non_forked/vim-scala/ctags/scala.ctags
Normal file
13
sources_non_forked/vim-scala/ctags/scala.ctags
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
--langdef=scala
|
||||||
|
--langmap=scala:.scala
|
||||||
|
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\4/c,classes/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*object[ \t]+([a-zA-Z0-9_]+)/\4/o,objects/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*((abstract|final|sealed|implicit|lazy)[ \t ]*)*case class[ \t ]+([a-zA-Z0-9_]+)/\6/C,case classes/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*case object[ \t]+([a-zA-Z0-9_]+)/\4/O,case objects/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*trait[ \t]+([a-zA-Z0-9_]+)/\4/t,traits/
|
||||||
|
--regex-scala=/^[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\1/T,types/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy|override|private[^ ]*(\[[a-z]*\])*|protected)[ \t]*)*def[ \t]+([a-zA-Z0-9_]+)/\4/m,methods/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy|override|private[^ ]*|protected)[ \t]*)*val[ \t]+([a-zA-Z0-9_]+)/\3/V,values/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy|override|private[^ ]*|protected)[ \t]*)*var[ \t]+([a-zA-Z0-9_]+)/\3/v,variables/
|
||||||
|
--regex-scala=/^[ \t]*package[ \t]+([a-zA-Z0-9_.]+)/\1/p,packages/
|
133
sources_non_forked/vim-scala/doc/scala.txt
Normal file
133
sources_non_forked/vim-scala/doc/scala.txt
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
*scala.txt* Syntax highlighting and helper functions for the Scala language.
|
||||||
|
|
||||||
|
This plugin is only available if 'compatible' is not set.
|
||||||
|
{Vi does not have any of this}
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
INTRODUCTION *scala*
|
||||||
|
|
||||||
|
Syntax highlighting and helper functions for the scala language. Extras
|
||||||
|
include:
|
||||||
|
|
||||||
|
- Sorting of import statements, configurable to your conventions.
|
||||||
|
- Tagbar support to navigate definitions within a file in the plugin's
|
||||||
|
sidebar window.
|
||||||
|
- ...and probably more that we've forgotten to update in this doc.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
OPTIONS *scala-options*
|
||||||
|
|
||||||
|
Use these options to control behavior of the plugin. Default values are
|
||||||
|
indicated in the examples.
|
||||||
|
|
||||||
|
*'g:scala_use_builtin_tagbar_defs'*
|
||||||
|
If you are using the Tagbar Vim plugin, vim-scala includes a Tagbar type
|
||||||
|
definition and ctags definition for Scala, so you can use Tagbar immediately.
|
||||||
|
If you have your own ctags definition in `~/.ctags` and prefer to use it, set
|
||||||
|
this option to 0 (we would appreciate contributions if you've improved the
|
||||||
|
ctags definition!).
|
||||||
|
|
||||||
|
Note that Tagbar's ctags definition for Scala is not used to generate a
|
||||||
|
|tags| file that Vim can use to navigate to definitions in other files, only
|
||||||
|
for the plugin sidebar. Feel free to copy `vim-scala/ctags/scala.ctags` into
|
||||||
|
your own `~/.ctags` if you wish to generate |tags| files.
|
||||||
|
>
|
||||||
|
let g:scala_use_builtin_tagbar_defs = 1
|
||||||
|
<
|
||||||
|
*'g:scala_use_default_keymappings'*
|
||||||
|
Set this option to disable definition of all mappings provided by vim-scala.
|
||||||
|
See |scala-mappings|.
|
||||||
|
>
|
||||||
|
let g:scala_use_default_keymappings = 1
|
||||||
|
<
|
||||||
|
|
||||||
|
*'g:scala_scaladoc_indent'*
|
||||||
|
By default, the plugin indents documentation comments according to the
|
||||||
|
standard Javadoc format.
|
||||||
|
/**
|
||||||
|
* This is a doc comment using Javadoc-style indentation.
|
||||||
|
*/
|
||||||
|
Set this option to enable the indentation standard as recommended for Scaladoc
|
||||||
|
comments.
|
||||||
|
/** This is a Scaladoc comment using
|
||||||
|
* the recommended indentation.
|
||||||
|
*/
|
||||||
|
>
|
||||||
|
let g:scala_scaladoc_indent = 1
|
||||||
|
<
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
COMMANDS *scala-commands*
|
||||||
|
|
||||||
|
*:SortScalaImports*
|
||||||
|
:SortScalaImports There are two modes in which this command can operate.
|
||||||
|
By default it walks all import groups at the top of
|
||||||
|
the Scala file and orders their lines alphabetically.
|
||||||
|
A group is a series of lines starting with the
|
||||||
|
import keyword separated by one or more blank lines.
|
||||||
|
|
||||||
|
The second, more advanced mode, can be activated by
|
||||||
|
setting
|
||||||
|
|
||||||
|
let g:scala_sort_across_groups=1
|
||||||
|
|
||||||
|
This makes this command include all imports in the
|
||||||
|
sorting regardless of blank lines in between them and
|
||||||
|
puts them in three predefined groups instead.
|
||||||
|
The three groups in which the imports can fall are:
|
||||||
|
|
||||||
|
1. Scala and Java core
|
||||||
|
2. Third party libraries
|
||||||
|
3. First party code (ie. your own)
|
||||||
|
|
||||||
|
Java and Scala core imports are identified by the
|
||||||
|
java(x) and scala namespaces.
|
||||||
|
Everything else that isn't a first party namespace
|
||||||
|
will be a third party import.
|
||||||
|
You can define a regex that matches first party
|
||||||
|
namespaces by setting
|
||||||
|
|
||||||
|
g:scala_first_party_namespaces
|
||||||
|
|
||||||
|
For example in a standard Play app this would be
|
||||||
|
set to
|
||||||
|
g:scala_first_party_namespaces=
|
||||||
|
\ '\(controllers\|views\|models\)'
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
MAPPINGS *scala-mappings*
|
||||||
|
|
||||||
|
Currently the only mappings defined are for FuzzyFinder users--these will
|
||||||
|
only be enabled if FuzzyFinder is detected.
|
||||||
|
|
||||||
|
*scala-leader-fs*
|
||||||
|
<Leader>fs "Find src". Primes |:FufFile| with `src/main/scala`,
|
||||||
|
and goes deeper still if only a single directory
|
||||||
|
exists below that. Helpful for package namespacing
|
||||||
|
like `src/main/scala/com/myorg`.
|
||||||
|
|
||||||
|
*scala-leader-ft*
|
||||||
|
<Leader>ft "Find test". Like |scala-leader-fs|, but with
|
||||||
|
`src/test/scala`.
|
||||||
|
|
||||||
|
*scala-leader-fr*
|
||||||
|
<Leader>fr "Find from root". For the rarer cases when you want to
|
||||||
|
start FuzzyFinder at project root (parent of `src/`).
|
||||||
|
|
||||||
|
Disabling Mappings~
|
||||||
|
|
||||||
|
If you wish to disable the default key mappings, write the following line in
|
||||||
|
your ~/.vimrc: >
|
||||||
|
|
||||||
|
let g:scala_use_default_keymappings = 0
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
CREDITS *scala-credits*
|
||||||
|
|
||||||
|
Developed by Derek Wyatt, building on initial work by Stefan Matthias Aust.
|
||||||
|
Distributed under the Apache 2 license.
|
||||||
|
|
||||||
|
Project's home and Git repository: https://github.com/derekwyatt/vim-scala
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
vim:tw=78:ts=8:ft=help:norl:
|
11
sources_non_forked/vim-scala/ftdetect/scala.vim
Normal file
11
sources_non_forked/vim-scala/ftdetect/scala.vim
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
fun! s:DetectScala()
|
||||||
|
if getline(1) =~# '^#!\(/usr\)\?/bin/env\s\+scalas\?'
|
||||||
|
set filetype=scala
|
||||||
|
endif
|
||||||
|
endfun
|
||||||
|
|
||||||
|
au BufRead,BufNewFile *.scala set filetype=scala
|
||||||
|
au BufRead,BufNewFile * call s:DetectScala()
|
||||||
|
|
||||||
|
" Install vim-sbt for additional syntax highlighting.
|
||||||
|
au BufRead,BufNewFile *.sbt setfiletype sbt.scala
|
176
sources_non_forked/vim-scala/ftplugin/scala.vim
Normal file
176
sources_non_forked/vim-scala/ftplugin/scala.vim
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
" Vim filetype plugin
|
||||||
|
" Language: Scala
|
||||||
|
" Maintainer: Derek Wyatt
|
||||||
|
" URL: https://github.com/derekwyatt/vim-scala
|
||||||
|
" License: Apache 2
|
||||||
|
" ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if exists('b:did_ftplugin') || &cp
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" j is fairly new in Vim, so don't complain if it's not there
|
||||||
|
setlocal formatoptions-=t formatoptions+=croqnl
|
||||||
|
silent! setlocal formatoptions+=j
|
||||||
|
|
||||||
|
" Just like c.vim, but additionally doesn't wrap text onto /** line when
|
||||||
|
" formatting. Doesn't bungle bulleted lists when formatting.
|
||||||
|
if get(g:, 'scala_scaladoc_indent', 0)
|
||||||
|
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s2:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
|
||||||
|
else
|
||||||
|
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
|
||||||
|
endif
|
||||||
|
setlocal commentstring=//\ %s
|
||||||
|
|
||||||
|
setlocal shiftwidth=2 softtabstop=2 expandtab
|
||||||
|
|
||||||
|
setlocal include='^\s*import'
|
||||||
|
setlocal includeexpr='substitute(v:fname,"\\.","/","g")'
|
||||||
|
|
||||||
|
setlocal path+=src/main/scala,src/test/scala
|
||||||
|
setlocal suffixesadd=.scala
|
||||||
|
|
||||||
|
compiler sbt
|
||||||
|
|
||||||
|
if globpath(&rtp, 'plugin/fuf.vim') != ''
|
||||||
|
"
|
||||||
|
" FuzzyFinder stuff
|
||||||
|
"
|
||||||
|
"
|
||||||
|
" SanitizeDirForFuzzyFinder()
|
||||||
|
"
|
||||||
|
" This is really just a convenience function to clean up any stray '/'
|
||||||
|
" characters in the path, should they be there.
|
||||||
|
"
|
||||||
|
function! scala#SanitizeDirForFuzzyFinder(dir)
|
||||||
|
let dir = expand(a:dir)
|
||||||
|
let dir = substitute(dir, '/\+$', '', '')
|
||||||
|
let dir = substitute(dir, '/\+', '/', '')
|
||||||
|
|
||||||
|
return dir
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
"
|
||||||
|
" GetDirForFuzzyFinder()
|
||||||
|
"
|
||||||
|
" Given a directory to start 'from', walk up the hierarchy, looking for a path
|
||||||
|
" that matches the 'addon' you want to see.
|
||||||
|
"
|
||||||
|
" If nothing can be found, then we just return the 'from' so we don't really get
|
||||||
|
" the advantage of a hint, but just let the user start from wherever he was
|
||||||
|
" starting from anyway.
|
||||||
|
"
|
||||||
|
function! scala#GetDirForFuzzyFinder(from, addon)
|
||||||
|
let from = scala#SanitizeDirForFuzzyFinder(a:from)
|
||||||
|
let addon = expand(a:addon)
|
||||||
|
let addon = substitute(addon, '^/\+', '', '')
|
||||||
|
let found = ''
|
||||||
|
" If the addon is right here, then we win
|
||||||
|
if isdirectory(from . '/' . addon)
|
||||||
|
let found = from . '/' . addon
|
||||||
|
else
|
||||||
|
let dirs = split(from, '/')
|
||||||
|
if !has('win32') && !has('win64')
|
||||||
|
let dirs[0] = '/' . dirs[0]
|
||||||
|
endif
|
||||||
|
" Walk up the tree and see if it's anywhere there
|
||||||
|
for n in range(len(dirs) - 1, 0, -1)
|
||||||
|
let path = join(dirs[0:n], '/')
|
||||||
|
if isdirectory(path . '/' . addon)
|
||||||
|
let found = path . '/' . addon
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
" If we found it, then let's see if we can go deeper
|
||||||
|
"
|
||||||
|
" For example, we may have found component_name/include
|
||||||
|
" but what if that directory only has a single directory
|
||||||
|
" in it, and that subdirectory only has a single directory
|
||||||
|
" in it, etc... ? This can happen when you're segmenting
|
||||||
|
" by namespace like this:
|
||||||
|
"
|
||||||
|
" component_name/include/org/vim/CoolClass.h
|
||||||
|
"
|
||||||
|
" You may find yourself always typing '' from the
|
||||||
|
" 'include' directory just to go into 'org/vim' so let's
|
||||||
|
" just eliminate the need to hit the ''.
|
||||||
|
if found != ''
|
||||||
|
let tempfrom = found
|
||||||
|
let globbed = globpath(tempfrom, '*')
|
||||||
|
while len(split(globbed, "\n")) == 1
|
||||||
|
let tempfrom = globbed
|
||||||
|
let globbed = globpath(tempfrom, '*')
|
||||||
|
endwhile
|
||||||
|
let found = scala#SanitizeDirForFuzzyFinder(tempfrom) . '/'
|
||||||
|
else
|
||||||
|
let found = from
|
||||||
|
endif
|
||||||
|
|
||||||
|
return found
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
"
|
||||||
|
" GetTestDirForFuzzyFinder()
|
||||||
|
"
|
||||||
|
" Now overload GetDirForFuzzyFinder() specifically for the test directory (I'm
|
||||||
|
" really only interested in going down into test/src 90% of the time, so let's
|
||||||
|
" hit that 90% and leave the other 10% to couple of extra keystrokes)
|
||||||
|
"
|
||||||
|
function! scala#GetTestDirForFuzzyFinder(from)
|
||||||
|
return scala#GetDirForFuzzyFinder(a:from, 'src/test/scala/')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
"
|
||||||
|
" GetMainDirForFuzzyFinder()
|
||||||
|
"
|
||||||
|
" Now overload GetDirForFuzzyFinder() specifically for the main directory.
|
||||||
|
"
|
||||||
|
function! scala#GetMainDirForFuzzyFinder(from)
|
||||||
|
return scala#GetDirForFuzzyFinder(a:from, 'src/main/scala/')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
"
|
||||||
|
" GetRootDirForFuzzyFinder()
|
||||||
|
"
|
||||||
|
" Now overload GetDirForFuzzyFinder() specifically for the root directory.
|
||||||
|
"
|
||||||
|
function! scala#GetRootDirForFuzzyFinder(from)
|
||||||
|
return scala#GetDirForFuzzyFinder(a:from, 'src/../')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" If you want to disable the default key mappings, write the following line in
|
||||||
|
" your ~/.vimrc
|
||||||
|
" let g:scala_use_default_keymappings = 0
|
||||||
|
if get(g:, 'scala_use_default_keymappings', 1)
|
||||||
|
nnoremap <buffer> <silent> <Leader>ft :FufFile <c-r>=scala#GetTestDirForFuzzyFinder('%:p:h')<cr><cr>
|
||||||
|
nnoremap <buffer> <silent> <Leader>fs :FufFile <c-r>=scala#GetMainDirForFuzzyFinder('%:p:h')<cr><cr>
|
||||||
|
nnoremap <buffer> <silent> <Leader>fr :FufFile <c-r>=scala#GetRootDirForFuzzyFinder('%:p:h')<cr><cr>
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:CreateOrExpression(keywords)
|
||||||
|
return '('.join(a:keywords, '|').')'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:NextSection(backwards)
|
||||||
|
if a:backwards
|
||||||
|
let dir = '?'
|
||||||
|
else
|
||||||
|
let dir = '/'
|
||||||
|
endif
|
||||||
|
let keywords = [ 'def', 'class', 'trait', 'object' ]
|
||||||
|
let keywordsOrExpression = s:CreateOrExpression(keywords)
|
||||||
|
|
||||||
|
let modifiers = [ 'public', 'private', 'private\[\w*\]', 'protected', 'abstract', 'case', 'override', 'implicit', 'final', 'sealed']
|
||||||
|
let modifierOrExpression = s:CreateOrExpression(modifiers)
|
||||||
|
|
||||||
|
let regex = '^ *('.modifierOrExpression.' )* *'.keywordsOrExpression."\r"
|
||||||
|
execute 'silent normal! ' . dir . '\v'.regex
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
noremap <script> <buffer> <silent> ]] :call <SID>NextSection(0)<cr>
|
||||||
|
noremap <script> <buffer> <silent> [[ :call <SID>NextSection(1)<cr>
|
||||||
|
|
||||||
|
" vim:set sw=2 sts=2 ts=8 et:
|
29
sources_non_forked/vim-scala/ftplugin/scala.xpt.vim
Normal file
29
sources_non_forked/vim-scala/ftplugin/scala.xpt.vim
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
XPTemplate priority=lang
|
||||||
|
|
||||||
|
XPTvar $BRif ' '
|
||||||
|
XPTvar $BRel \n
|
||||||
|
XPTvar $BRloop ' '
|
||||||
|
XPTvar $BRfun ' '
|
||||||
|
|
||||||
|
XPTinclude
|
||||||
|
\ _common/personal
|
||||||
|
\ java/java
|
||||||
|
|
||||||
|
XPT cake hint=Cake\ Pattern
|
||||||
|
XSET trait|def=Some
|
||||||
|
XSET derived|def=Real
|
||||||
|
trait `trait^Component {
|
||||||
|
trait `trait^ {
|
||||||
|
`body^
|
||||||
|
}
|
||||||
|
|
||||||
|
val `trait^SV('(.)', '\l\1', '')^^: `trait^
|
||||||
|
}
|
||||||
|
|
||||||
|
trait `derived^`trait^Component extends `trait^Component {
|
||||||
|
|
||||||
|
override lazy val `trait^SV('(.)', '\l\1', '')^^ = new `trait^ {
|
||||||
|
`body2^
|
||||||
|
}
|
||||||
|
}
|
31
sources_non_forked/vim-scala/ftplugin/scala/tagbar.vim
Normal file
31
sources_non_forked/vim-scala/ftplugin/scala/tagbar.vim
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
"
|
||||||
|
" Support for Tagbar -- https://github.com/majutsushi/tagbar
|
||||||
|
"
|
||||||
|
" Hat tip to Leonard Ehrenfried for the built-in ctags deffile:
|
||||||
|
" https://leonard.io/blog/2013/04/editing-scala-with-vim/
|
||||||
|
"
|
||||||
|
if !exists(':Tagbar')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let g:tagbar_type_scala = {
|
||||||
|
\ 'ctagstype' : 'scala',
|
||||||
|
\ 'sro' : '.',
|
||||||
|
\ 'kinds' : [
|
||||||
|
\ 'p:packages',
|
||||||
|
\ 'T:types:1',
|
||||||
|
\ 't:traits',
|
||||||
|
\ 'o:objects',
|
||||||
|
\ 'O:case objects',
|
||||||
|
\ 'c:classes',
|
||||||
|
\ 'C:case classes',
|
||||||
|
\ 'm:methods',
|
||||||
|
\ 'V:values:1',
|
||||||
|
\ 'v:variables:1'
|
||||||
|
\ ]
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" In case you've updated/customized your ~/.ctags and prefer to use it.
|
||||||
|
if get(g:, 'scala_use_builtin_tagbar_defs', 1)
|
||||||
|
let g:tagbar_type_scala.deffile = expand('<sfile>:p:h:h:h') . '/ctags/scala.ctags'
|
||||||
|
endif
|
78
sources_non_forked/vim-scala/indent/README
Normal file
78
sources_non_forked/vim-scala/indent/README
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
Scala Indent file for Vim
|
||||||
|
=========================
|
||||||
|
|
||||||
|
You can check 'testfile.scala' in this directory to see what I'm testing
|
||||||
|
against. I'm mostly just trying to fit the major conventions that people would
|
||||||
|
code in with Scala, and not all of the possibilities - life's too short for that
|
||||||
|
and I'd rather be writing Scala code than Vim indent code.
|
||||||
|
|
||||||
|
With that said, if there's something you're passionate about and you want it to
|
||||||
|
be properly indented, and you can't hack it in yourself, then feel free to drop
|
||||||
|
me a line and we'll fight about it.
|
||||||
|
|
||||||
|
You'll see the following comments in 'testfile.scala':
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following stuff doesn't work, but honestly, it's pretty
|
||||||
|
* pathological stuff... format your code differently.
|
||||||
|
*
|
||||||
|
* ---- 1. ----
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else
|
||||||
|
* if (c) 2
|
||||||
|
* else 3
|
||||||
|
*
|
||||||
|
* Do this instead:
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c) 2
|
||||||
|
* else 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ---- 2. ----
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else
|
||||||
|
* if (c)
|
||||||
|
* 2
|
||||||
|
* else 3
|
||||||
|
*
|
||||||
|
* Do this instead:
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c) 2
|
||||||
|
* else 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* or this...
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c)
|
||||||
|
* 2
|
||||||
|
* else
|
||||||
|
* 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* ---- 3. ----
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c)
|
||||||
|
* 2
|
||||||
|
* else 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Do the same as in number 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
In other words, for the forseeable future... do something different to fix the
|
||||||
|
cases that don't work. :)
|
||||||
|
|
||||||
|
If you've got any questions about what's defined now, you can reach me at
|
||||||
|
http://derekwyatt.org.
|
||||||
|
|
603
sources_non_forked/vim-scala/indent/scala.vim
Normal file
603
sources_non_forked/vim-scala/indent/scala.vim
Normal file
|
@ -0,0 +1,603 @@
|
||||||
|
" Vim indent file
|
||||||
|
" Language : Scala (http://scala-lang.org/)
|
||||||
|
" Original Author : Stefan Matthias Aust
|
||||||
|
" Modifications by : Derek Wyatt
|
||||||
|
" Last Change: 2011 Mar 19 (Derek Wyatt)
|
||||||
|
|
||||||
|
if exists("b:did_indent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
setlocal autoindent
|
||||||
|
setlocal indentexpr=GetScalaIndent()
|
||||||
|
setlocal indentkeys=0{,0},0),!^F,<>>,o,O,e,=case,<CR>
|
||||||
|
|
||||||
|
if exists("*GetScalaIndent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:defMatcher = '\%(\%(private\|protected\)\%(\[[^\]]*\]\)\?\s\+\|abstract\s\+\|override\s\+\)*\<def\>'
|
||||||
|
let s:funcNameMatcher = '\w\+'
|
||||||
|
let s:typeSpecMatcher = '\%(\s*\[\_[^\]]*\]\)'
|
||||||
|
let s:defArgMatcher = '\%((\_.\{-})\)'
|
||||||
|
let s:returnTypeMatcher = '\%(:\s*\w\+' . s:typeSpecMatcher . '\?\)'
|
||||||
|
let g:fullDefMatcher = '^\s*' . s:defMatcher . '\s\+' . s:funcNameMatcher . '\s*' . s:typeSpecMatcher . '\?\s*' . s:defArgMatcher . '\?\s*' . s:returnTypeMatcher . '\?\s*[={]'
|
||||||
|
|
||||||
|
function! scala#ConditionalConfirm(msg)
|
||||||
|
if 0
|
||||||
|
call confirm(a:msg)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLine(lnum)
|
||||||
|
let line = substitute(getline(a:lnum), '//.*$', '', '')
|
||||||
|
let line = substitute(line, '"\(.\|\\"\)\{-}"', '""', 'g')
|
||||||
|
return line
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#CountBrackets(line, openBracket, closedBracket)
|
||||||
|
let line = substitute(a:line, '"\(.\|\\"\)\{-}"', '', 'g')
|
||||||
|
let open = substitute(line, '[^' . a:openBracket . ']', '', 'g')
|
||||||
|
let close = substitute(line, '[^' . a:closedBracket . ']', '', 'g')
|
||||||
|
return strlen(open) - strlen(close)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#CountParens(line)
|
||||||
|
return scala#CountBrackets(a:line, '(', ')')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#CountCurlies(line)
|
||||||
|
return scala#CountBrackets(a:line, '{', '}')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineEndsInIncomplete(line)
|
||||||
|
if a:line =~ '[.,]\s*$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineIsAClosingXML(line)
|
||||||
|
if a:line =~ '^\s*</\w'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineCompletesXML(lnum, line)
|
||||||
|
let savedpos = getpos('.')
|
||||||
|
call setpos('.', [savedpos[0], a:lnum, 0, savedpos[3]])
|
||||||
|
let tag = substitute(a:line, '^.*</\([^>]*\)>.*$', '\1', '')
|
||||||
|
let [lineNum, colnum] = searchpairpos('<' . tag . '>', '', '</' . tag . '>', 'Wbn')
|
||||||
|
call setpos('.', savedpos)
|
||||||
|
let pline = scala#GetLine(prevnonblank(lineNum - 1))
|
||||||
|
if pline =~ '=\s*$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#IsParentCase()
|
||||||
|
let savedpos = getpos('.')
|
||||||
|
call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]])
|
||||||
|
let [l, c] = searchpos('^\s*\%(' . s:defMatcher . '\|\%(\<case\>\)\)', 'bnW')
|
||||||
|
let retvalue = -1
|
||||||
|
if l != 0 && search('\%' . l . 'l\s*\<case\>', 'bnW')
|
||||||
|
let retvalue = l
|
||||||
|
endif
|
||||||
|
call setpos('.', savedpos)
|
||||||
|
return retvalue
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#CurlyMatcher()
|
||||||
|
let matchline = scala#GetLineThatMatchesBracket('{', '}')
|
||||||
|
if scala#CountParens(scala#GetLine(matchline)) < 0
|
||||||
|
let savedpos = getpos('.')
|
||||||
|
call setpos('.', [savedpos[0], matchline, 9999, savedpos[3]])
|
||||||
|
call searchpos('{', 'Wbc')
|
||||||
|
call searchpos(')', 'Wb')
|
||||||
|
let [lnum, colnum] = searchpairpos('(', '', ')', 'Wbn')
|
||||||
|
call setpos('.', savedpos)
|
||||||
|
let line = scala#GetLine(lnum)
|
||||||
|
if line =~ '^\s*' . s:defMatcher
|
||||||
|
return lnum
|
||||||
|
else
|
||||||
|
return matchline
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return matchline
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLineAndColumnThatMatchesCurly()
|
||||||
|
return scala#GetLineAndColumnThatMatchesBracket('{', '}')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLineAndColumnThatMatchesParen()
|
||||||
|
return scala#GetLineAndColumnThatMatchesBracket('(', ')')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLineAndColumnThatMatchesBracket(openBracket, closedBracket)
|
||||||
|
let savedpos = getpos('.')
|
||||||
|
let curline = scala#GetLine(line('.'))
|
||||||
|
if curline =~ a:closedBracket . '.*' . a:openBracket . '.*' . a:closedBracket
|
||||||
|
call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]])
|
||||||
|
call searchpos(a:closedBracket . '\ze[^' . a:closedBracket . a:openBracket . ']*' . a:openBracket, 'W')
|
||||||
|
else
|
||||||
|
call setpos('.', [savedpos[0], savedpos[1], 9999, savedpos[3]])
|
||||||
|
call searchpos(a:closedBracket, 'Wbc')
|
||||||
|
endif
|
||||||
|
let [lnum, colnum] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn')
|
||||||
|
call setpos('.', savedpos)
|
||||||
|
return [lnum, colnum]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLineThatMatchesCurly()
|
||||||
|
return scala#GetLineThatMatchesBracket('{', '}')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLineThatMatchesParen()
|
||||||
|
return scala#GetLineThatMatchesBracket('(', ')')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetLineThatMatchesBracket(openBracket, closedBracket)
|
||||||
|
let [lnum, colnum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket)
|
||||||
|
return lnum
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#NumberOfBraceGroups(line)
|
||||||
|
let line = substitute(a:line, '[^()]', '', 'g')
|
||||||
|
if strlen(line) == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let line = substitute(line, '^)*', '', 'g')
|
||||||
|
if strlen(line) == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let line = substitute(line, '^(', '', 'g')
|
||||||
|
if strlen(line) == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let c = 1
|
||||||
|
let counter = 0
|
||||||
|
let groupCount = 0
|
||||||
|
while counter < strlen(line)
|
||||||
|
let char = strpart(line, counter, 1)
|
||||||
|
if char == '('
|
||||||
|
let c = c + 1
|
||||||
|
elseif char == ')'
|
||||||
|
let c = c - 1
|
||||||
|
endif
|
||||||
|
if c == 0
|
||||||
|
let groupCount = groupCount + 1
|
||||||
|
endif
|
||||||
|
let counter = counter + 1
|
||||||
|
endwhile
|
||||||
|
return groupCount
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#MatchesIncompleteDefValr(line)
|
||||||
|
if a:line =~ '^\s*\%(' . s:defMatcher . '\|\<va[lr]\>\).*[=({]\s*$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineIsCompleteIf(line)
|
||||||
|
if scala#CountBrackets(a:line, '{', '}') == 0 &&
|
||||||
|
\ scala#CountBrackets(a:line, '(', ')') == 0 &&
|
||||||
|
\ a:line =~ '^\s*\<if\>\s*([^)]*)\s*\S.*$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineCompletesIfElse(lnum, line)
|
||||||
|
if a:line =~ '^\s*\%(\<if\>\|\%(}\s*\)\?\<else\>\)'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let result = search('^\%(\s*\<if\>\s*(.*).*\n\|\s*\<if\>\s*(.*)\s*\n.*\n\)\%(\s*\<else\>\s*\<if\>\s*(.*)\s*\n.*\n\)*\%(\s*\<else\>\s*\n\|\s*\<else\>[^{]*\n\)\?\%' . a:lnum . 'l', 'Wbn')
|
||||||
|
if result != 0 && scala#GetLine(prevnonblank(a:lnum - 1)) !~ '{\s*$'
|
||||||
|
return result
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#GetPrevCodeLine(lnum)
|
||||||
|
" This needs to skip comment lines
|
||||||
|
return prevnonblank(a:lnum - 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#InvertBracketType(openBracket, closedBracket)
|
||||||
|
if a:openBracket == '('
|
||||||
|
return [ '{', '}' ]
|
||||||
|
else
|
||||||
|
return [ '(', ')' ]
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#Testhelper(lnum, line, openBracket, closedBracket, iteration)
|
||||||
|
let bracketCount = scala#CountBrackets(a:line, a:openBracket, a:closedBracket)
|
||||||
|
" There are more '}' braces than '{' on this line so it may be completing the function definition
|
||||||
|
if bracketCount < 0
|
||||||
|
let [matchedLNum, matchedColNum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket)
|
||||||
|
if matchedLNum == a:lnum
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
let matchedLine = scala#GetLine(matchedLNum)
|
||||||
|
if ! scala#MatchesIncompleteDefValr(matchedLine)
|
||||||
|
let bracketLine = substitute(substitute(matchedLine, '\%' . matchedColNum . 'c.*$', '', ''), '[^{}()]', '', 'g')
|
||||||
|
if bracketLine =~ '}$'
|
||||||
|
return scala#Testhelper(matchedLNum, matchedLine, '{', '}', a:iteration + 1)
|
||||||
|
elseif bracketLine =~ ')$'
|
||||||
|
return scala#Testhelper(matchedLNum, matchedLine, '(', ')', a:iteration + 1)
|
||||||
|
else
|
||||||
|
let prevCodeLNum = scala#GetPrevCodeLine(matchedLNum)
|
||||||
|
if scala#MatchesIncompleteDefValr(scala#GetLine(prevCodeLNum))
|
||||||
|
return prevCodeLNum
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
" return indent value instead
|
||||||
|
return matchedLNum
|
||||||
|
endif
|
||||||
|
" There's an equal number of '{' and '}' on this line so it may be a single line function definition
|
||||||
|
elseif bracketCount == 0
|
||||||
|
if a:iteration == 0
|
||||||
|
let otherBracketType = scala#InvertBracketType(a:openBracket, a:closedBracket)
|
||||||
|
return scala#Testhelper(a:lnum, a:line, otherBracketType[0], otherBracketType[1], a:iteration + 1)
|
||||||
|
else
|
||||||
|
let prevCodeLNum = scala#GetPrevCodeLine(a:lnum)
|
||||||
|
let prevCodeLine = scala#GetLine(prevCodeLNum)
|
||||||
|
if scala#MatchesIncompleteDefValr(prevCodeLine) && prevCodeLine !~ '{\s*$'
|
||||||
|
return prevCodeLNum
|
||||||
|
else
|
||||||
|
let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line)
|
||||||
|
if possibleIfElse != 0
|
||||||
|
let defValrLine = prevnonblank(possibleIfElse - 1)
|
||||||
|
let possibleDefValr = scala#GetLine(defValrLine)
|
||||||
|
if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$'
|
||||||
|
return possibleDefValr
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#Test(lnum, line, openBracket, closedBracket)
|
||||||
|
return scala#Testhelper(a:lnum, a:line, a:openBracket, a:closedBracket, 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineCompletesDefValr(lnum, line)
|
||||||
|
let bracketCount = scala#CountBrackets(a:line, '{', '}')
|
||||||
|
if bracketCount < 0
|
||||||
|
let matchedBracket = scala#GetLineThatMatchesBracket('{', '}')
|
||||||
|
if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket))
|
||||||
|
let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1))
|
||||||
|
if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr)
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
elseif bracketCount == 0
|
||||||
|
let bracketCount = scala#CountBrackets(a:line, '(', ')')
|
||||||
|
if bracketCount < 0
|
||||||
|
let matchedBracket = scala#GetLineThatMatchesBracket('(', ')')
|
||||||
|
if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket))
|
||||||
|
let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1))
|
||||||
|
if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr)
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
elseif bracketCount == 0
|
||||||
|
let possibleDefValr = scala#GetLine(prevnonblank(a:lnum - 1))
|
||||||
|
if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line)
|
||||||
|
if possibleIfElse != 0
|
||||||
|
let possibleDefValr = scala#GetLine(prevnonblank(possibleIfElse - 1))
|
||||||
|
if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$'
|
||||||
|
return 2
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#SpecificLineCompletesBrackets(lnum, openBracket, closedBracket)
|
||||||
|
let savedpos = getpos('.')
|
||||||
|
call setpos('.', [savedpos[0], a:lnum, 9999, savedpos[3]])
|
||||||
|
let retv = scala#LineCompletesBrackets(a:openBracket, a:closedBracket)
|
||||||
|
call setpos('.', savedpos)
|
||||||
|
|
||||||
|
return retv
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! scala#LineCompletesBrackets(openBracket, closedBracket)
|
||||||
|
let savedpos = getpos('.')
|
||||||
|
let offline = 0
|
||||||
|
while offline == 0
|
||||||
|
let [lnum, colnum] = searchpos(a:closedBracket, 'Wb')
|
||||||
|
let [lnumA, colnumA] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn')
|
||||||
|
if lnum != lnumA
|
||||||
|
let [lnumB, colnumB] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbnr')
|
||||||
|
let offline = 1
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
call setpos('.', savedpos)
|
||||||
|
if lnumA == lnumB && colnumA == colnumB
|
||||||
|
return lnumA
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! GetScalaIndent()
|
||||||
|
" Find a non-blank line above the current line.
|
||||||
|
let prevlnum = prevnonblank(v:lnum - 1)
|
||||||
|
|
||||||
|
" Hit the start of the file, use zero indent.
|
||||||
|
if prevlnum == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ind = indent(prevlnum)
|
||||||
|
let originalIndentValue = ind
|
||||||
|
let prevline = scala#GetLine(prevlnum)
|
||||||
|
let curlnum = v:lnum
|
||||||
|
let curline = scala#GetLine(curlnum)
|
||||||
|
if get(g:, 'scala_scaladoc_indent', 0)
|
||||||
|
let star_indent = 2
|
||||||
|
else
|
||||||
|
let star_indent = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if prevline =~ '^\s*/\*\*'
|
||||||
|
if prevline =~ '\*/\s*$'
|
||||||
|
return ind
|
||||||
|
else
|
||||||
|
return ind + star_indent
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if curline =~ '^\s*\*'
|
||||||
|
return cindent(curlnum)
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line starts with a { then make it indent the same as the previous line
|
||||||
|
if curline =~ '^\s*{'
|
||||||
|
call scala#ConditionalConfirm("1")
|
||||||
|
" Unless, of course, the previous one is a { as well
|
||||||
|
if prevline !~ '^\s*{'
|
||||||
|
call scala#ConditionalConfirm("2")
|
||||||
|
return indent(prevlnum)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" '.' continuations
|
||||||
|
if curline =~ '^\s*\.'
|
||||||
|
if prevline =~ '^\s*\.'
|
||||||
|
return ind
|
||||||
|
else
|
||||||
|
return ind + &shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Indent html literals
|
||||||
|
if prevline !~ '/>\s*$' && prevline =~ '^\s*<[a-zA-Z][^>]*>\s*$'
|
||||||
|
call scala#ConditionalConfirm("3")
|
||||||
|
return ind + &shiftwidth
|
||||||
|
endif
|
||||||
|
|
||||||
|
" assumes curly braces around try-block
|
||||||
|
if curline =~ '^\s*}\s*\<catch\>'
|
||||||
|
return ind - &shiftwidth
|
||||||
|
elseif curline =~ '^\s*\<catch\>'
|
||||||
|
return ind
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Add a 'shiftwidth' after lines that start a block
|
||||||
|
" If 'if', 'for' or 'while' end with ), this is a one-line block
|
||||||
|
" If 'val', 'var', 'def' end with =, this is a one-line block
|
||||||
|
if (prevline =~ '^\s*\<\%(\%(}\?\s*else\s\+\)\?if\|for\|while\)\>.*[)=]\s*$' && scala#NumberOfBraceGroups(prevline) <= 1)
|
||||||
|
\ || prevline =~ '^\s*' . s:defMatcher . '.*=\s*$'
|
||||||
|
\ || prevline =~ '^\s*\<va[lr]\>.*[=]\s*$'
|
||||||
|
\ || prevline =~ '^\s*\%(}\s*\)\?\<else\>\s*$'
|
||||||
|
\ || prevline =~ '=\s*$'
|
||||||
|
call scala#ConditionalConfirm("4")
|
||||||
|
let ind = ind + &shiftwidth
|
||||||
|
elseif prevline =~ '^\s*\<\%(}\?\s*else\s\+\)\?if\>' && curline =~ '^\s*}\?\s*\<else\>'
|
||||||
|
return ind
|
||||||
|
endif
|
||||||
|
|
||||||
|
let lineCompletedBrackets = 0
|
||||||
|
let bracketCount = scala#CountBrackets(prevline, '{', '}')
|
||||||
|
if bracketCount > 0 || prevline =~ '.*{\s*$'
|
||||||
|
call scala#ConditionalConfirm("5b")
|
||||||
|
let ind = ind + &shiftwidth
|
||||||
|
elseif bracketCount < 0
|
||||||
|
call scala#ConditionalConfirm("6b")
|
||||||
|
" if the closing brace actually completes the braces entirely, then we
|
||||||
|
" have to indent to line that started the whole thing
|
||||||
|
let completeLine = scala#LineCompletesBrackets('{', '}')
|
||||||
|
if completeLine != -1
|
||||||
|
call scala#ConditionalConfirm("8b")
|
||||||
|
let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1))
|
||||||
|
" However, what actually started this part looks like it was a function
|
||||||
|
" definition, so we need to indent to that line instead. This is
|
||||||
|
" actually pretty weak at the moment.
|
||||||
|
if prevCompleteLine =~ '=\s*$'
|
||||||
|
call scala#ConditionalConfirm("9b")
|
||||||
|
let ind = indent(prevnonblank(completeLine - 1))
|
||||||
|
else
|
||||||
|
call scala#ConditionalConfirm("10b")
|
||||||
|
let ind = indent(completeLine)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let lineCompletedBrackets = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ind == originalIndentValue
|
||||||
|
let bracketCount = scala#CountBrackets(prevline, '(', ')')
|
||||||
|
if bracketCount > 0 || prevline =~ '.*(\s*$'
|
||||||
|
call scala#ConditionalConfirm("5a")
|
||||||
|
let ind = ind + &shiftwidth
|
||||||
|
elseif bracketCount < 0
|
||||||
|
call scala#ConditionalConfirm("6a")
|
||||||
|
" if the closing brace actually completes the braces entirely, then we
|
||||||
|
" have to indent to line that started the whole thing
|
||||||
|
let completeLine = scala#LineCompletesBrackets('(', ')')
|
||||||
|
if completeLine != -1 && prevline !~ '^.*{\s*$'
|
||||||
|
call scala#ConditionalConfirm("8a")
|
||||||
|
let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1))
|
||||||
|
" However, what actually started this part looks like it was a function
|
||||||
|
" definition, so we need to indent to that line instead. This is
|
||||||
|
" actually pretty weak at the moment.
|
||||||
|
if prevCompleteLine =~ '=\s*$'
|
||||||
|
call scala#ConditionalConfirm("9a")
|
||||||
|
let ind = indent(prevnonblank(completeLine - 1))
|
||||||
|
else
|
||||||
|
call scala#ConditionalConfirm("10a")
|
||||||
|
let ind = indent(completeLine)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
" This is the only part that's different from from the '{', '}' one below
|
||||||
|
" Yup... some refactoring is necessary at some point.
|
||||||
|
let ind = ind + (bracketCount * &shiftwidth)
|
||||||
|
let lineCompletedBrackets = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if curline =~ '^\s*}\?\s*\<else\>\%(\s\+\<if\>\s*(.*)\)\?\s*{\?\s*$' &&
|
||||||
|
\ ! scala#LineIsCompleteIf(prevline) &&
|
||||||
|
\ prevline !~ '^.*}\s*$'
|
||||||
|
let ind = ind - &shiftwidth
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Subtract a 'shiftwidth' on '}' or html
|
||||||
|
let curCurlyCount = scala#CountCurlies(curline)
|
||||||
|
if curCurlyCount < 0
|
||||||
|
call scala#ConditionalConfirm("14a")
|
||||||
|
let matchline = scala#CurlyMatcher()
|
||||||
|
return indent(matchline)
|
||||||
|
elseif curline =~ '^\s*</[a-zA-Z][^>]*>'
|
||||||
|
call scala#ConditionalConfirm("14c")
|
||||||
|
return ind - &shiftwidth
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prevParenCount = scala#CountParens(prevline)
|
||||||
|
if prevline =~ '^\s*\<for\>.*$' && prevParenCount > 0
|
||||||
|
call scala#ConditionalConfirm("15")
|
||||||
|
let ind = indent(prevlnum) + 5
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prevCurlyCount = scala#CountCurlies(prevline)
|
||||||
|
if prevCurlyCount == 0 && prevline =~ '^.*\%(=>\|⇒\)\s*$' && prevline !~ '^\s*this\s*:.*\%(=>\|⇒\)\s*$' && curline !~ '^\s*\<case\>'
|
||||||
|
call scala#ConditionalConfirm("16")
|
||||||
|
let ind = ind + &shiftwidth
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ind == originalIndentValue && curline =~ '^\s*\<case\>'
|
||||||
|
call scala#ConditionalConfirm("17")
|
||||||
|
let parentCase = scala#IsParentCase()
|
||||||
|
if parentCase != -1
|
||||||
|
call scala#ConditionalConfirm("17a")
|
||||||
|
return indent(parentCase)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if prevline =~ '^\s*\*/'
|
||||||
|
\ || prevline =~ '*/\s*$'
|
||||||
|
call scala#ConditionalConfirm("18")
|
||||||
|
let ind = ind - star_indent
|
||||||
|
endif
|
||||||
|
|
||||||
|
if scala#LineEndsInIncomplete(prevline)
|
||||||
|
call scala#ConditionalConfirm("19")
|
||||||
|
return ind
|
||||||
|
endif
|
||||||
|
|
||||||
|
if scala#LineIsAClosingXML(prevline)
|
||||||
|
if scala#LineCompletesXML(prevlnum, prevline)
|
||||||
|
call scala#ConditionalConfirm("20a")
|
||||||
|
return ind - &shiftwidth
|
||||||
|
else
|
||||||
|
call scala#ConditionalConfirm("20b")
|
||||||
|
return ind
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ind == originalIndentValue
|
||||||
|
"let indentMultiplier = scala#LineCompletesDefValr(prevlnum, prevline)
|
||||||
|
"if indentMultiplier != 0
|
||||||
|
" call scala#ConditionalConfirm("19a")
|
||||||
|
" let ind = ind - (indentMultiplier * &shiftwidth)
|
||||||
|
let defValrLine = scala#Test(prevlnum, prevline, '{', '}')
|
||||||
|
if defValrLine != -1
|
||||||
|
call scala#ConditionalConfirm("21a")
|
||||||
|
let ind = indent(defValrLine)
|
||||||
|
elseif lineCompletedBrackets == 0
|
||||||
|
call scala#ConditionalConfirm("21b")
|
||||||
|
if scala#GetLine(prevnonblank(prevlnum - 1)) =~ '^.*\<else\>\s*\%(//.*\)\?$'
|
||||||
|
call scala#ConditionalConfirm("21c")
|
||||||
|
let ind = ind - &shiftwidth
|
||||||
|
elseif scala#LineCompletesIfElse(prevlnum, prevline)
|
||||||
|
call scala#ConditionalConfirm("21d")
|
||||||
|
let ind = ind - &shiftwidth
|
||||||
|
elseif scala#CountParens(curline) < 0 && curline =~ '^\s*)' && scala#GetLine(scala#GetLineThatMatchesBracket('(', ')')) =~ '.*(\s*$'
|
||||||
|
" Handles situations that look like this:
|
||||||
|
"
|
||||||
|
" val a = func(
|
||||||
|
" 10
|
||||||
|
" )
|
||||||
|
"
|
||||||
|
" or
|
||||||
|
"
|
||||||
|
" val a = func(
|
||||||
|
" 10
|
||||||
|
" ).somethingHere()
|
||||||
|
call scala#ConditionalConfirm("21e")
|
||||||
|
let ind = ind - &shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
call scala#ConditionalConfirm("returning " . ind)
|
||||||
|
|
||||||
|
return ind
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim:set sw=2 sts=2 ts=8 et:
|
||||||
|
" vim600:fdm=marker fdl=1 fdc=0:
|
387
sources_non_forked/vim-scala/indent/testfile.scala
Normal file
387
sources_non_forked/vim-scala/indent/testfile.scala
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
/**
|
||||||
|
* Comments are here
|
||||||
|
*/
|
||||||
|
class SomeClass {
|
||||||
|
val someval = SomeObject.makeWithSomething
|
||||||
|
var somevar = SomeObject.makeWithSomething
|
||||||
|
|
||||||
|
def someBracedDef = {
|
||||||
|
case ASingleLineCase => a.statement
|
||||||
|
|
||||||
|
case AMultiLineCase =>
|
||||||
|
if (this)
|
||||||
|
then
|
||||||
|
else
|
||||||
|
that
|
||||||
|
}
|
||||||
|
|
||||||
|
def aSingleLineDef = someval + 12
|
||||||
|
|
||||||
|
def main(args: Array[String]) = run(20000, 20000)
|
||||||
|
|
||||||
|
def multilineParams(
|
||||||
|
x: Int,
|
||||||
|
y: Int
|
||||||
|
) = {
|
||||||
|
???
|
||||||
|
}
|
||||||
|
|
||||||
|
// This
|
||||||
|
def aMultiLineSingleStatementDefWithBraces = {
|
||||||
|
SomeObject.makeWithSomething
|
||||||
|
}
|
||||||
|
|
||||||
|
// This
|
||||||
|
def aMultiLineSingleStatementDefWithNoBraces =
|
||||||
|
new X {
|
||||||
|
def something = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
def aMultiLineSingleStatementDefWithNoBraces =
|
||||||
|
SomeObject.makeWithSomething
|
||||||
|
|
||||||
|
def someFunc = {
|
||||||
|
if (b) 1
|
||||||
|
else {
|
||||||
|
if (b) 2
|
||||||
|
else
|
||||||
|
3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def someOtherFunc =
|
||||||
|
if (this)
|
||||||
|
that
|
||||||
|
else
|
||||||
|
theOther
|
||||||
|
|
||||||
|
def someOtherOtherFunc = {
|
||||||
|
if (b) 1
|
||||||
|
else {
|
||||||
|
if (b) 2
|
||||||
|
else
|
||||||
|
3
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following stuff doesn't work, but honestly, it's pretty
|
||||||
|
* pathological stuff... format your code differently.
|
||||||
|
*
|
||||||
|
* ---- 1. ----
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else
|
||||||
|
* if (c) 2
|
||||||
|
* else 3 // Should be the same as the above 'if'
|
||||||
|
*
|
||||||
|
* Do this instead:
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c) 2
|
||||||
|
* else 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ---- 2. ----
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else
|
||||||
|
* if (c)
|
||||||
|
* 2
|
||||||
|
* else 3
|
||||||
|
*
|
||||||
|
* Do this instead:
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c) 2
|
||||||
|
* else 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* or this...
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c)
|
||||||
|
* 2
|
||||||
|
* else
|
||||||
|
* 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* ---- 3. ----
|
||||||
|
*
|
||||||
|
* if (b) 1
|
||||||
|
* else {
|
||||||
|
* if (c)
|
||||||
|
* 2
|
||||||
|
* else 3
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Do the same as in number 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (b) {
|
||||||
|
statement
|
||||||
|
}
|
||||||
|
else
|
||||||
|
thing
|
||||||
|
|
||||||
|
if (b)
|
||||||
|
statement
|
||||||
|
|
||||||
|
bare_statement
|
||||||
|
|
||||||
|
if (b) {
|
||||||
|
statement
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
thing
|
||||||
|
that
|
||||||
|
}
|
||||||
|
|
||||||
|
if (statement(nested statement(another nested statement))) func(statement)
|
||||||
|
if (statement(nested statement(another nested statement))) statement
|
||||||
|
|
||||||
|
if (b) {
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
} else if (b) {
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
} else if (c) {
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
} else
|
||||||
|
dohicky
|
||||||
|
|
||||||
|
if (b) { // comment
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
} else if (b) { // comment
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
} else if (c) { // comment
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
} else // comment
|
||||||
|
dohicky
|
||||||
|
|
||||||
|
if (b)
|
||||||
|
statement
|
||||||
|
else {
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
}
|
||||||
|
|
||||||
|
val a = if (b) {
|
||||||
|
10
|
||||||
|
} else { statement }
|
||||||
|
|
||||||
|
val a = func(
|
||||||
|
10
|
||||||
|
).goThere()
|
||||||
|
|
||||||
|
val a = func(
|
||||||
|
10
|
||||||
|
)
|
||||||
|
|
||||||
|
if (b) (statement)
|
||||||
|
else 2
|
||||||
|
|
||||||
|
if (b) 1
|
||||||
|
else 2
|
||||||
|
|
||||||
|
if (b)
|
||||||
|
1
|
||||||
|
else if (b)
|
||||||
|
2
|
||||||
|
else if (b)
|
||||||
|
2
|
||||||
|
else
|
||||||
|
3
|
||||||
|
4
|
||||||
|
|
||||||
|
if (b)
|
||||||
|
1
|
||||||
|
else if (b)
|
||||||
|
2
|
||||||
|
else
|
||||||
|
3
|
||||||
|
4
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This
|
||||||
|
*/
|
||||||
|
def SomeOtherFunc = ...
|
||||||
|
|
||||||
|
/** This */
|
||||||
|
def blah = ...
|
||||||
|
|
||||||
|
def func = {
|
||||||
|
val reply = new Something()
|
||||||
|
some.block {
|
||||||
|
def foo("string", bar("string"))
|
||||||
|
new X {
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
() => goAndDo.something
|
||||||
|
}
|
||||||
|
|
||||||
|
def func(param: Int) = new this.Something.Or.Other(
|
||||||
|
new SillyObject {
|
||||||
|
override def booger() = {
|
||||||
|
statement
|
||||||
|
statement
|
||||||
|
}
|
||||||
|
},
|
||||||
|
otherParam) // comment
|
||||||
|
|
||||||
|
class AnotherSomeClass {
|
||||||
|
this: Actor =>
|
||||||
|
def func = {
|
||||||
|
booger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pulled this stuff from the fors.scala example file in the source distribution
|
||||||
|
*/
|
||||||
|
def findNums(n: Int): Iterable[(Int, Int)] =
|
||||||
|
for (i <- 1 until n;
|
||||||
|
j <- 1 until (i-1);
|
||||||
|
if isPrime(i+j)) yield (i, j)
|
||||||
|
|
||||||
|
val books = List(
|
||||||
|
Elem(prefix, "book", e, scope,
|
||||||
|
Elem(prefix, "title", e, scope,
|
||||||
|
Text("Structure and Interpretation of Computer Programs")),
|
||||||
|
Elem(prefix, "author", e, scope,
|
||||||
|
Text("Abelson, Harald")),
|
||||||
|
Elem(prefix, "author", e, scope,
|
||||||
|
Text("Sussman, Gerald J."))),
|
||||||
|
Elem(prefix, "book", e, scope,
|
||||||
|
Elem(prefix, "title", e, scope,
|
||||||
|
Text("Principles of Compiler Design")),
|
||||||
|
Elem(prefix, "author", e, scope,
|
||||||
|
Text("Aho, Alfred")),
|
||||||
|
Elem(prefix, "author", e, scope,
|
||||||
|
Text("Ullman, Jeffrey"))),
|
||||||
|
Elem(prefix, "book", e, scope,
|
||||||
|
Elem(prefix, "title", e, scope,
|
||||||
|
Text("Programming in Modula-2")),
|
||||||
|
Elem(prefix, "author", e, scope,
|
||||||
|
Text("Wirth, Niklaus")))
|
||||||
|
)
|
||||||
|
|
||||||
|
def mufync(statement): Int = {
|
||||||
|
val x = function(thing)
|
||||||
|
if (statement) func(statement)
|
||||||
|
else func(statement)
|
||||||
|
}
|
||||||
|
|
||||||
|
def SomeOtherFunc = statement
|
||||||
|
|
||||||
|
def receive = {
|
||||||
|
case Something =>
|
||||||
|
case OrOther =>
|
||||||
|
here
|
||||||
|
case There =>
|
||||||
|
}
|
||||||
|
|
||||||
|
def func[A <: B](one: One, two: Two) : ReturnType = ...
|
||||||
|
def func(one: One, two: Two) : ReturnType = ...
|
||||||
|
def func(one: (A, B) => B) : ReturnType = ...
|
||||||
|
def func(one: One, two: Two) = ...
|
||||||
|
def func(one: One, two: Two) = ...
|
||||||
|
def func[A <: B](one: One,
|
||||||
|
two: Two) : ReturnType = ...
|
||||||
|
def func(one: One, two: Two, three: Three, four: Four,
|
||||||
|
five: Five) : ReturnType = ...
|
||||||
|
def func(one: One, two: Two, three: Three, four: Four,
|
||||||
|
five: Five) = ...
|
||||||
|
|
||||||
|
def func = oneliner
|
||||||
|
private def func = oneliner
|
||||||
|
private[thing] def func = oneliner
|
||||||
|
protected def func = oneliner
|
||||||
|
protected[thing] def func = oneliner
|
||||||
|
override def func = oneliner
|
||||||
|
abstract override def func = oneliner
|
||||||
|
override abstract def func = oneliner
|
||||||
|
protected override def func = oneliner
|
||||||
|
protected abstract override def func = oneliner
|
||||||
|
protected override abstract def func = oneliner
|
||||||
|
protected[thing] override def func = oneliner
|
||||||
|
protected[thing] abstract override def func = oneliner
|
||||||
|
protected[thing] override abstract def func = oneliner
|
||||||
|
private override def func = oneliner
|
||||||
|
private abstract override def func = oneliner
|
||||||
|
private override abstract def func = oneliner
|
||||||
|
private[thing] override def func = oneliner
|
||||||
|
private[thing] abstract override def func = oneliner
|
||||||
|
private[thing] override abstract def func = oneliner
|
||||||
|
|
||||||
|
<outertag>
|
||||||
|
<innertag>
|
||||||
|
<in-innertag>
|
||||||
|
Something
|
||||||
|
</in-innertag>
|
||||||
|
</innertag>
|
||||||
|
</outertag>
|
||||||
|
|
||||||
|
val someXML =
|
||||||
|
<outertag>
|
||||||
|
<innertag>
|
||||||
|
<in-innertag>
|
||||||
|
Something
|
||||||
|
</in-innertag>
|
||||||
|
</innertag>
|
||||||
|
</outertag>
|
||||||
|
|
||||||
|
private[somepackage] abstract override def somethingWithDots = {
|
||||||
|
SomeObject.build
|
||||||
|
.withSomething
|
||||||
|
.withSomethingElse
|
||||||
|
.withSomethingElseAgain
|
||||||
|
}
|
||||||
|
|
||||||
|
private def oneLineFunc = actorOf(new Actor {
|
||||||
|
def receive = {
|
||||||
|
case _ => thing
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
private def oneLineFunc = factory(
|
||||||
|
arg1,
|
||||||
|
arg2,
|
||||||
|
arg3).build
|
||||||
|
|
||||||
|
def someFunction[T <: U](
|
||||||
|
x: Int): SomeType = {
|
||||||
|
val someValue: Option[Int] = {
|
||||||
|
someValue match {
|
||||||
|
some stuff here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def someFunction[T <: U](
|
||||||
|
x: Int,
|
||||||
|
y: Int,
|
||||||
|
z: Long): SomeType = {
|
||||||
|
val someValue: Option[Int] = {
|
||||||
|
someValue match {
|
||||||
|
some stuff here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private[this] def followingFunction = oneliner
|
||||||
|
|
||||||
|
val someFunction: List[(Option[T], Option[U])] = TODO
|
||||||
|
}
|
||||||
|
|
149
sources_non_forked/vim-scala/plugin/scala.vim
Normal file
149
sources_non_forked/vim-scala/plugin/scala.vim
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
" Vim plugin file
|
||||||
|
" Language: Scala
|
||||||
|
" Maintainer: Derek Wyatt
|
||||||
|
" URL: https://github.com/derekwyatt/vim-scala
|
||||||
|
" License: Apache 2
|
||||||
|
" ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if exists('g:loaded_scala') || &cp
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:loaded_scala = 1
|
||||||
|
|
||||||
|
"
|
||||||
|
" Sort imports
|
||||||
|
"
|
||||||
|
" author: Leonard Ehrenfried <leonard.ehrenfried@gmail.com>
|
||||||
|
"
|
||||||
|
function! SortScalaImports()
|
||||||
|
let save_cursor = getpos(".")
|
||||||
|
|
||||||
|
if exists('g:scala_sort_across_groups') && g:scala_sort_across_groups
|
||||||
|
call s:sortAcrossGroups()
|
||||||
|
else
|
||||||
|
call s:sortInsideGroups()
|
||||||
|
end
|
||||||
|
|
||||||
|
"move cursor to where it was before the function call
|
||||||
|
call setpos('.', save_cursor)
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Iterates over _all_ imports and puts them into 3 groups
|
||||||
|
"
|
||||||
|
" 1. Java/Scala imports like java.util.UUID
|
||||||
|
" 2. Third party libraries
|
||||||
|
" 3. First party libraries (ie. your own stuff)
|
||||||
|
"
|
||||||
|
function! s:sortAcrossGroups()
|
||||||
|
let curr = 1
|
||||||
|
let first_line = -1
|
||||||
|
let last_line = -1
|
||||||
|
let trailing_newlines = 0
|
||||||
|
let java_scala_imports = []
|
||||||
|
let first_party_imports = []
|
||||||
|
let third_party_imports = []
|
||||||
|
|
||||||
|
" loop over lines in buffer
|
||||||
|
while curr <= line('$')
|
||||||
|
|
||||||
|
let line = getline(curr)
|
||||||
|
|
||||||
|
if line =~ "^import"
|
||||||
|
if first_line == -1
|
||||||
|
let first_line = curr
|
||||||
|
endif
|
||||||
|
|
||||||
|
if line =~ '^import \(java\(x\)\?\|scala\)\.'
|
||||||
|
call add(java_scala_imports, line)
|
||||||
|
elseif exists('g:scala_first_party_namespaces')
|
||||||
|
let regex = '^import '.g:scala_first_party_namespaces
|
||||||
|
if line =~ regex
|
||||||
|
call add(first_party_imports, line)
|
||||||
|
else
|
||||||
|
call add(third_party_imports, line)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
call add(third_party_imports, line)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let trailing_newlines = 0
|
||||||
|
elseif empty(line)
|
||||||
|
let trailing_newlines = trailing_newlines + 1
|
||||||
|
elseif first_line != -1
|
||||||
|
let last_line = curr - trailing_newlines - 1
|
||||||
|
" break out when you have found the first non-import, non-empty line
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
let curr = curr + 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
call cursor(first_line, 0)
|
||||||
|
let to_delete = last_line - first_line
|
||||||
|
|
||||||
|
if to_delete > 0
|
||||||
|
execute 'd'to_delete
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:sortAndPrint(first_party_imports)
|
||||||
|
call s:sortAndPrint(third_party_imports)
|
||||||
|
call s:sortAndPrint(java_scala_imports)
|
||||||
|
|
||||||
|
if first_line != -1
|
||||||
|
" remove extra blank line at top
|
||||||
|
execute 'delete'
|
||||||
|
endif
|
||||||
|
|
||||||
|
call cursor(last_line + 2, 0)
|
||||||
|
if empty(getline(line(".")))
|
||||||
|
execute 'delete'
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:sortInsideGroups()
|
||||||
|
call cursor(1, 1)
|
||||||
|
|
||||||
|
let start = 1
|
||||||
|
let end = 1
|
||||||
|
|
||||||
|
" repeat until we find no more matches
|
||||||
|
while(start > 0 && end > 0)
|
||||||
|
let pos = line(".")
|
||||||
|
" find first line with import
|
||||||
|
let start = search('^import', 'cW')
|
||||||
|
" find next line which starts with an import, ends with a newline
|
||||||
|
" and the next line is not an import
|
||||||
|
" the 'c' flag accepts matches at the current position allowing single line groups
|
||||||
|
let end = search('^\import.*\n\(import\)\@!', 'cW')
|
||||||
|
|
||||||
|
execute start','end'sort i'
|
||||||
|
|
||||||
|
call cursor(end + 1, 0)
|
||||||
|
|
||||||
|
" stop if end is the last line in the file
|
||||||
|
if line("$") == end
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:sortAndPrint(imports)
|
||||||
|
if len(a:imports) > 0
|
||||||
|
call sort(a:imports, "s:sortIgnoreCase")
|
||||||
|
call append(line("."), "")
|
||||||
|
call append(line("."), a:imports)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" this useless function exists purely so the sort() ignores case
|
||||||
|
" this is needed so scalaz/Scalaz appears next to each other
|
||||||
|
function! s:sortIgnoreCase(i1, i2)
|
||||||
|
return a:i1 == a:i2 ? 0 : a:i1 > a:i2 ? 1 : -1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
command! SortScalaImports call SortScalaImports()
|
||||||
|
|
||||||
|
" vim:set sw=2 sts=2 ts=8 et:
|
11
sources_non_forked/vim-scala/spec/fixtures/multiple_newlines.expected.scala
vendored
Normal file
11
sources_non_forked/vim-scala/spec/fixtures/multiple_newlines.expected.scala
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import AgentTypes._
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Bar
|
12
sources_non_forked/vim-scala/spec/fixtures/multiple_newlines.scala
vendored
Normal file
12
sources_non_forked/vim-scala/spec/fixtures/multiple_newlines.scala
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import AgentTypes._
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
|
||||||
|
|
||||||
|
class Bar
|
9
sources_non_forked/vim-scala/spec/fixtures/no_newline.expected.scala
vendored
Normal file
9
sources_non_forked/vim-scala/spec/fixtures/no_newline.expected.scala
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import AgentTypes._
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
class Bar
|
8
sources_non_forked/vim-scala/spec/fixtures/no_newline.scala
vendored
Normal file
8
sources_non_forked/vim-scala/spec/fixtures/no_newline.scala
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import AgentTypes._
|
||||||
|
import scala.horst
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
class Bar
|
8
sources_non_forked/vim-scala/spec/fixtures/no_newline_after.expected.scala
vendored
Normal file
8
sources_non_forked/vim-scala/spec/fixtures/no_newline_after.expected.scala
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import AgentTypes._
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
class Bar
|
7
sources_non_forked/vim-scala/spec/fixtures/no_newline_after.scala
vendored
Normal file
7
sources_non_forked/vim-scala/spec/fixtures/no_newline_after.scala
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import AgentTypes._
|
||||||
|
import scala.horst
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
class Bar
|
7
sources_non_forked/vim-scala/spec/fixtures/no_package.expected.scala
vendored
Normal file
7
sources_non_forked/vim-scala/spec/fixtures/no_package.expected.scala
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import java.bla
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import AgentTypes._
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
class Bar
|
6
sources_non_forked/vim-scala/spec/fixtures/no_package.scala
vendored
Normal file
6
sources_non_forked/vim-scala/spec/fixtures/no_package.scala
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import java.bla
|
||||||
|
import AgentTypes._
|
||||||
|
import scala.horst
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
class Bar
|
9
sources_non_forked/vim-scala/spec/fixtures/vanilla.expected.scala
vendored
Normal file
9
sources_non_forked/vim-scala/spec/fixtures/vanilla.expected.scala
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import AgentTypes._
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
class Bar
|
9
sources_non_forked/vim-scala/spec/fixtures/vanilla.scala
vendored
Normal file
9
sources_non_forked/vim-scala/spec/fixtures/vanilla.scala
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package com.foo
|
||||||
|
|
||||||
|
import java.bla
|
||||||
|
import AgentTypes._
|
||||||
|
import scala.horst
|
||||||
|
|
||||||
|
import akka.actor.{Actor, ActorLogging, ActorRef, ActorRefFactory, ActorSystem, Props, Stash, Terminated}
|
||||||
|
|
||||||
|
class Bar
|
16
sources_non_forked/vim-scala/spec/import_sorting_spec.rb
Normal file
16
sources_non_forked/vim-scala/spec/import_sorting_spec.rb
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
require "spec_helper"
|
||||||
|
|
||||||
|
describe ":SortScalaImports" do
|
||||||
|
|
||||||
|
describe "Sorting across groups" do
|
||||||
|
["vanilla", "no_newline", "no_newline_after", "no_package",
|
||||||
|
"multiple_newlines"].each do |name|
|
||||||
|
it "should sort vanilla file" do
|
||||||
|
actual = sort_fixture_across_groups name
|
||||||
|
expected = expected(name)
|
||||||
|
actual.should eq(expected)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
44
sources_non_forked/vim-scala/spec/spec_helper.rb
Normal file
44
sources_non_forked/vim-scala/spec/spec_helper.rb
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
require 'vimrunner'
|
||||||
|
require 'tempfile'
|
||||||
|
|
||||||
|
PWD = File.expand_path File.dirname(__FILE__)
|
||||||
|
|
||||||
|
RSpec.configure do |config|
|
||||||
|
|
||||||
|
config.before(:suite) do
|
||||||
|
VIM = Vimrunner.start
|
||||||
|
VIM.add_plugin(File.expand_path('../..', __FILE__), 'plugin/scala.vim')
|
||||||
|
end
|
||||||
|
|
||||||
|
config.after(:suite) do
|
||||||
|
VIM.kill
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def sort_fixture_across_groups(name)
|
||||||
|
fixture_path = "#{PWD}/fixtures/#{name}.scala"
|
||||||
|
|
||||||
|
temp_file = Tempfile.new('vim-scala-')
|
||||||
|
temp_file.write File.read(fixture_path)
|
||||||
|
temp_file.rewind
|
||||||
|
|
||||||
|
VIM.edit temp_file.path
|
||||||
|
|
||||||
|
VIM.command "let g:scala_sort_across_groups=1"
|
||||||
|
VIM.command "SortScalaImports"
|
||||||
|
VIM.write
|
||||||
|
|
||||||
|
temp_file.rewind
|
||||||
|
output = temp_file.read
|
||||||
|
|
||||||
|
temp_file.close
|
||||||
|
temp_file.unlink
|
||||||
|
|
||||||
|
output
|
||||||
|
end
|
||||||
|
|
||||||
|
def expected(name)
|
||||||
|
path = "#{PWD}/fixtures/#{name}.expected.scala"
|
||||||
|
File.read(path)
|
||||||
|
end
|
||||||
|
|
230
sources_non_forked/vim-scala/syntax/scala.vim
Normal file
230
sources_non_forked/vim-scala/syntax/scala.vim
Normal file
|
@ -0,0 +1,230 @@
|
||||||
|
" Vim syntax file
|
||||||
|
" Language: Scala
|
||||||
|
" Maintainer: Derek Wyatt
|
||||||
|
" URL: https://github.com/derekwyatt/vim-scala
|
||||||
|
" License: Apache 2
|
||||||
|
" ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if !exists('main_syntax')
|
||||||
|
if version < 600
|
||||||
|
syntax clear
|
||||||
|
elseif exists("b:current_syntax")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let main_syntax = 'scala'
|
||||||
|
endif
|
||||||
|
|
||||||
|
scriptencoding utf-8
|
||||||
|
|
||||||
|
let b:current_syntax = "scala"
|
||||||
|
|
||||||
|
" Allows for embedding, see #59; main_syntax convention instead? Refactor TOP
|
||||||
|
"
|
||||||
|
" The @Spell here is a weird hack, it means *exclude* if the first group is
|
||||||
|
" TOP. Otherwise we get spelling errors highlighted on code elements that
|
||||||
|
" match scalaBlock, even with `syn spell notoplevel`.
|
||||||
|
function! s:ContainedGroup()
|
||||||
|
try
|
||||||
|
silent syn list @scala
|
||||||
|
return '@scala,@NoSpell'
|
||||||
|
catch /E392/
|
||||||
|
return 'TOP,@Spell'
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
unlet! b:current_syntax
|
||||||
|
|
||||||
|
syn case match
|
||||||
|
syn sync minlines=200 maxlines=1000
|
||||||
|
|
||||||
|
syn keyword scalaKeyword catch do else final finally for forSome if
|
||||||
|
syn keyword scalaKeyword match return throw try while yield macro
|
||||||
|
syn keyword scalaKeyword class trait object extends with nextgroup=scalaInstanceDeclaration skipwhite
|
||||||
|
syn keyword scalaKeyword case nextgroup=scalaKeyword,scalaCaseFollowing skipwhite
|
||||||
|
syn keyword scalaKeyword val nextgroup=scalaNameDefinition,scalaQuasiQuotes skipwhite
|
||||||
|
syn keyword scalaKeyword def var nextgroup=scalaNameDefinition skipwhite
|
||||||
|
hi link scalaKeyword Keyword
|
||||||
|
|
||||||
|
exe 'syn region scalaBlock start=/{/ end=/}/ contains=' . s:ContainedGroup() . ' fold'
|
||||||
|
|
||||||
|
syn keyword scalaAkkaSpecialWord when goto using startWith initialize onTransition stay become unbecome
|
||||||
|
hi link scalaAkkaSpecialWord PreProc
|
||||||
|
|
||||||
|
syn keyword scalatestSpecialWord shouldBe
|
||||||
|
syn match scalatestShouldDSLA /^\s\+\zsit should/
|
||||||
|
syn match scalatestShouldDSLB /\<should\>/
|
||||||
|
hi link scalatestSpecialWord PreProc
|
||||||
|
hi link scalatestShouldDSLA PreProc
|
||||||
|
hi link scalatestShouldDSLB PreProc
|
||||||
|
|
||||||
|
syn match scalaSymbol /'[_A-Za-z0-9$]\+/
|
||||||
|
hi link scalaSymbol Number
|
||||||
|
|
||||||
|
syn match scalaChar /'.'/
|
||||||
|
syn match scalaChar /'\\[\\"'ntbrf]'/ contains=scalaEscapedChar
|
||||||
|
syn match scalaChar /'\\u[A-Fa-f0-9]\{4}'/ contains=scalaUnicodeChar
|
||||||
|
syn match scalaEscapedChar /\\[\\"'ntbrf]/
|
||||||
|
syn match scalaUnicodeChar /\\u[A-Fa-f0-9]\{4}/
|
||||||
|
hi link scalaChar Character
|
||||||
|
hi link scalaEscapedChar Function
|
||||||
|
hi link scalaUnicodeChar Special
|
||||||
|
|
||||||
|
syn match scalaOperator "||"
|
||||||
|
syn match scalaOperator "&&"
|
||||||
|
hi link scalaOperator Special
|
||||||
|
|
||||||
|
syn match scalaNameDefinition /\<[_A-Za-z0-9$]\+\>/ contained nextgroup=scalaPostNameDefinition,scalaVariableDeclarationList
|
||||||
|
syn match scalaNameDefinition /`[^`]\+`/ contained nextgroup=scalaPostNameDefinition
|
||||||
|
syn match scalaVariableDeclarationList /\s*,\s*/ contained nextgroup=scalaNameDefinition
|
||||||
|
syn match scalaPostNameDefinition /\_s*:\_s*/ contained nextgroup=scalaTypeDeclaration
|
||||||
|
hi link scalaNameDefinition Function
|
||||||
|
|
||||||
|
syn match scalaInstanceDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaInstanceHash
|
||||||
|
syn match scalaInstanceDeclaration /`[^`]\+`/ contained
|
||||||
|
syn match scalaInstanceHash /#/ contained nextgroup=scalaInstanceDeclaration
|
||||||
|
hi link scalaInstanceDeclaration Special
|
||||||
|
hi link scalaInstanceHash Type
|
||||||
|
|
||||||
|
syn match scalaUnimplemented /???/
|
||||||
|
hi link scalaUnimplemented ERROR
|
||||||
|
|
||||||
|
syn match scalaCapitalWord /\<[A-Z][A-Za-z0-9$]*\>/
|
||||||
|
hi link scalaCapitalWord Special
|
||||||
|
|
||||||
|
" Handle type declarations specially
|
||||||
|
syn region scalaTypeStatement matchgroup=Keyword start=/\<type\_s\+\ze/ end=/$/ contains=scalaTypeTypeDeclaration,scalaSquareBrackets,scalaTypeTypeEquals,scalaTypeStatement
|
||||||
|
|
||||||
|
" Ugh... duplication of all the scalaType* stuff to handle special highlighting
|
||||||
|
" of `type X =` declarations
|
||||||
|
syn match scalaTypeTypeDeclaration /(/ contained nextgroup=scalaTypeTypeExtension,scalaTypeTypeEquals contains=scalaRoundBrackets skipwhite
|
||||||
|
syn match scalaTypeTypeDeclaration /\%(⇒\|=>\)\ze/ contained nextgroup=scalaTypeTypeDeclaration contains=scalaTypeTypeExtension skipwhite
|
||||||
|
syn match scalaTypeTypeDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypeExtension,scalaTypeTypeEquals skipwhite
|
||||||
|
syn match scalaTypeTypeEquals /=\ze[^>]/ contained nextgroup=scalaTypeTypePostDeclaration skipwhite
|
||||||
|
syn match scalaTypeTypeExtension /)\?\_s*\zs\%(⇒\|=>\|<:\|:>\|=:=\|::\|#\)/ contained nextgroup=scalaTypeTypeDeclaration skipwhite
|
||||||
|
syn match scalaTypeTypePostDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypePostExtension skipwhite
|
||||||
|
syn match scalaTypeTypePostExtension /\%(⇒\|=>\|<:\|:>\|=:=\|::\)/ contained nextgroup=scalaTypeTypePostDeclaration skipwhite
|
||||||
|
hi link scalaTypeTypeDeclaration Type
|
||||||
|
hi link scalaTypeTypeExtension Keyword
|
||||||
|
hi link scalaTypeTypePostDeclaration Special
|
||||||
|
hi link scalaTypeTypePostExtension Keyword
|
||||||
|
|
||||||
|
syn match scalaTypeDeclaration /(/ contained nextgroup=scalaTypeExtension contains=scalaRoundBrackets skipwhite
|
||||||
|
syn match scalaTypeDeclaration /\%(⇒\|=>\)\ze/ contained nextgroup=scalaTypeDeclaration contains=scalaTypeExtension skipwhite
|
||||||
|
syn match scalaTypeDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeExtension skipwhite
|
||||||
|
syn match scalaTypeExtension /)\?\_s*\zs\%(⇒\|=>\|<:\|:>\|=:=\|::\|#\)/ contained nextgroup=scalaTypeDeclaration skipwhite
|
||||||
|
hi link scalaTypeDeclaration Type
|
||||||
|
hi link scalaTypeExtension Keyword
|
||||||
|
hi link scalaTypePostExtension Keyword
|
||||||
|
|
||||||
|
syn match scalaTypeAnnotation /\%([_a-zA-Z0-9$\s]:\_s*\)\ze[_=(\.A-Za-z0-9$]\+/ skipwhite nextgroup=scalaTypeDeclaration contains=scalaRoundBrackets
|
||||||
|
syn match scalaTypeAnnotation /)\_s*:\_s*\ze[_=(\.A-Za-z0-9$]\+/ skipwhite nextgroup=scalaTypeDeclaration
|
||||||
|
hi link scalaTypeAnnotation Normal
|
||||||
|
|
||||||
|
syn match scalaCaseFollowing /\<[_\.A-Za-z0-9$]\+\>/ contained
|
||||||
|
syn match scalaCaseFollowing /`[^`]\+`/ contained
|
||||||
|
hi link scalaCaseFollowing Special
|
||||||
|
|
||||||
|
syn keyword scalaKeywordModifier abstract override final lazy implicit implicitly private protected sealed null require super
|
||||||
|
hi link scalaKeywordModifier Function
|
||||||
|
|
||||||
|
syn keyword scalaSpecial this true false ne eq
|
||||||
|
syn keyword scalaSpecial new nextgroup=scalaInstanceDeclaration skipwhite
|
||||||
|
syn match scalaSpecial "\%(=>\|⇒\|<-\|←\|->\|→\)"
|
||||||
|
syn match scalaSpecial /`[^`]\+`/ " Backtick literals
|
||||||
|
hi link scalaSpecial PreProc
|
||||||
|
|
||||||
|
syn keyword scalaExternal package import
|
||||||
|
hi link scalaExternal Include
|
||||||
|
|
||||||
|
syn match scalaStringEmbeddedQuote /\\"/ contained
|
||||||
|
syn region scalaString start=/"/ end=/"/ contains=scalaStringEmbeddedQuote,scalaEscapedChar,scalaUnicodeChar
|
||||||
|
hi link scalaString String
|
||||||
|
hi link scalaStringEmbeddedQuote String
|
||||||
|
|
||||||
|
syn region scalaIString matchgroup=scalaInterpolationBrackets start=/\<[a-zA-Z][a-zA-Z0-9_]*"/ skip=/\\"/ end=/"/ contains=scalaInterpolation,scalaInterpolationB,scalaEscapedChar,scalaUnicodeChar
|
||||||
|
syn region scalaTripleIString matchgroup=scalaInterpolationBrackets start=/\<[a-zA-Z][a-zA-Z0-9_]*"""/ end=/"""\%([^"]\|$\)/ contains=scalaInterpolation,scalaInterpolationB,scalaEscapedChar,scalaUnicodeChar
|
||||||
|
hi link scalaIString String
|
||||||
|
hi link scalaTripleIString String
|
||||||
|
|
||||||
|
syn match scalaInterpolation /\$[a-zA-Z0-9_$]\+/ contained
|
||||||
|
exe 'syn region scalaInterpolationB matchgroup=scalaInterpolationBoundary start=/\${/ end=/}/ contained contains=' . s:ContainedGroup()
|
||||||
|
hi link scalaInterpolation Function
|
||||||
|
hi link scalaInterpolationB Normal
|
||||||
|
|
||||||
|
syn region scalaFString matchgroup=scalaInterpolationBrackets start=/f"/ skip=/\\"/ end=/"/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
|
||||||
|
syn match scalaFInterpolation /\$[a-zA-Z0-9_$]\+\(%[-A-Za-z0-9\.]\+\)\?/ contained
|
||||||
|
exe 'syn region scalaFInterpolationB matchgroup=scalaInterpolationBoundary start=/${/ end=/}\(%[-A-Za-z0-9\.]\+\)\?/ contained contains=' . s:ContainedGroup()
|
||||||
|
hi link scalaFString String
|
||||||
|
hi link scalaFInterpolation Function
|
||||||
|
hi link scalaFInterpolationB Normal
|
||||||
|
|
||||||
|
syn region scalaTripleString start=/"""/ end=/"""\%([^"]\|$\)/ contains=scalaEscapedChar,scalaUnicodeChar
|
||||||
|
syn region scalaTripleFString matchgroup=scalaInterpolationBrackets start=/f"""/ end=/"""\%([^"]\|$\)/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
|
||||||
|
hi link scalaTripleString String
|
||||||
|
hi link scalaTripleFString String
|
||||||
|
|
||||||
|
hi link scalaInterpolationBrackets Special
|
||||||
|
hi link scalaInterpolationBoundary Function
|
||||||
|
|
||||||
|
syn match scalaNumber /\<0[dDfFlL]\?\>/ " Just a bare 0
|
||||||
|
syn match scalaNumber /\<[1-9]\d*[dDfFlL]\?\>/ " A multi-digit number - octal numbers with leading 0's are deprecated in Scala
|
||||||
|
syn match scalaNumber /\<0[xX][0-9a-fA-F]\+[dDfFlL]\?\>/ " Hex number
|
||||||
|
syn match scalaNumber /\%(\<\d\+\.\d*\|\.\d\+\)\%([eE][-+]\=\d\+\)\=[fFdD]\=/ " exponential notation 1
|
||||||
|
syn match scalaNumber /\<\d\+[eE][-+]\=\d\+[fFdD]\=\>/ " exponential notation 2
|
||||||
|
syn match scalaNumber /\<\d\+\%([eE][-+]\=\d\+\)\=[fFdD]\>/ " exponential notation 3
|
||||||
|
hi link scalaNumber Number
|
||||||
|
|
||||||
|
syn region scalaRoundBrackets start="(" end=")" skipwhite contained contains=scalaTypeDeclaration,scalaSquareBrackets,scalaRoundBrackets
|
||||||
|
|
||||||
|
syn region scalaSquareBrackets matchgroup=scalaSquareBracketsBrackets start="\[" end="\]" skipwhite nextgroup=scalaTypeExtension contains=scalaTypeDeclaration,scalaSquareBrackets,scalaTypeOperator,scalaTypeAnnotationParameter
|
||||||
|
syn match scalaTypeOperator /[-+=:<>]\+/ contained
|
||||||
|
syn match scalaTypeAnnotationParameter /@\<[`_A-Za-z0-9$]\+\>/ contained
|
||||||
|
hi link scalaSquareBracketsBrackets Type
|
||||||
|
hi link scalaTypeOperator Keyword
|
||||||
|
hi link scalaTypeAnnotationParameter Function
|
||||||
|
|
||||||
|
syn match scalaShebang "\%^#!.*" display
|
||||||
|
syn region scalaMultilineComment start="/\*" end="\*/" contains=scalaMultilineComment,scalaDocLinks,scalaParameterAnnotation,scalaCommentAnnotation,scalaTodo,scalaCommentCodeBlock,@Spell keepend fold
|
||||||
|
syn match scalaCommentAnnotation "@[_A-Za-z0-9$]\+" contained
|
||||||
|
syn match scalaParameterAnnotation "\%(@tparam\|@param\|@see\)" nextgroup=scalaParamAnnotationValue skipwhite contained
|
||||||
|
syn match scalaParamAnnotationValue /[.`_A-Za-z0-9$]\+/ contained
|
||||||
|
syn region scalaDocLinks start="\[\[" end="\]\]" contained
|
||||||
|
syn region scalaCommentCodeBlock matchgroup=Keyword start="{{{" end="}}}" contained
|
||||||
|
syn match scalaTodo "\vTODO|FIXME|XXX" contained
|
||||||
|
hi link scalaShebang Comment
|
||||||
|
hi link scalaMultilineComment Comment
|
||||||
|
hi link scalaDocLinks Function
|
||||||
|
hi link scalaParameterAnnotation Function
|
||||||
|
hi link scalaParamAnnotationValue Keyword
|
||||||
|
hi link scalaCommentAnnotation Function
|
||||||
|
hi link scalaCommentCodeBlockBrackets String
|
||||||
|
hi link scalaCommentCodeBlock String
|
||||||
|
hi link scalaTodo Todo
|
||||||
|
|
||||||
|
syn match scalaAnnotation /@\<[`_A-Za-z0-9$]\+\>/
|
||||||
|
hi link scalaAnnotation PreProc
|
||||||
|
|
||||||
|
syn match scalaTrailingComment "//.*$" contains=scalaTodo,@Spell
|
||||||
|
hi link scalaTrailingComment Comment
|
||||||
|
|
||||||
|
syn match scalaAkkaFSM /goto([^)]*)\_s\+\<using\>/ contains=scalaAkkaFSMGotoUsing
|
||||||
|
syn match scalaAkkaFSM /stay\_s\+using/
|
||||||
|
syn match scalaAkkaFSM /^\s*stay\s*$/
|
||||||
|
syn match scalaAkkaFSM /when\ze([^)]*)/
|
||||||
|
syn match scalaAkkaFSM /startWith\ze([^)]*)/
|
||||||
|
syn match scalaAkkaFSM /initialize\ze()/
|
||||||
|
syn match scalaAkkaFSM /onTransition/
|
||||||
|
syn match scalaAkkaFSM /onTermination/
|
||||||
|
syn match scalaAkkaFSM /whenUnhandled/
|
||||||
|
syn match scalaAkkaFSMGotoUsing /\<using\>/
|
||||||
|
syn match scalaAkkaFSMGotoUsing /\<goto\>/
|
||||||
|
hi link scalaAkkaFSM PreProc
|
||||||
|
hi link scalaAkkaFSMGotoUsing PreProc
|
||||||
|
|
||||||
|
let b:current_syntax = 'scala'
|
||||||
|
|
||||||
|
if main_syntax ==# 'scala'
|
||||||
|
unlet main_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
" vim:set sw=2 sts=2 ts=8 et:
|
181
sources_non_forked/vim-scala/syntax/testfile.scala
Normal file
181
sources_non_forked/vim-scala/syntax/testfile.scala
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
package testfile
|
||||||
|
import java.something.com
|
||||||
|
|
||||||
|
package object SomeObject[A <: B] extends Implicits {
|
||||||
|
type Booger[A] = A => Unit
|
||||||
|
type SomeType = A <: B :> C
|
||||||
|
type SomeOtherType = A ⇒ Thing
|
||||||
|
type Something
|
||||||
|
type Something <: SomethingElse
|
||||||
|
type ParserContext = Context { type PrefixType = Parser }
|
||||||
|
|
||||||
|
new Something#SomethingElse
|
||||||
|
|
||||||
|
val GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH = Value
|
||||||
|
|
||||||
|
// Doesn't yet work
|
||||||
|
val GET, HEAD: Value, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH: Value = Value
|
||||||
|
|
||||||
|
def x: Something#SomethingElse
|
||||||
|
|
||||||
|
def hasFunctionType[A, B <: A, Z](f: A => B, g: (A, B) => Z): Unit = {
|
||||||
|
println("Something")
|
||||||
|
}
|
||||||
|
|
||||||
|
val f: (Int, String) => Unit = (i: Int, s: String) => println(s"$i -- $s")
|
||||||
|
val f: (Int, String) ⇒ Unit = (i: Int, s: String) ⇒ println(s"$i -- $s")
|
||||||
|
}
|
||||||
|
|
||||||
|
object Test {
|
||||||
|
def test(
|
||||||
|
param1: List[(Int, Int)],
|
||||||
|
param2: List[Int]):
|
||||||
|
List[Int] = {
|
||||||
|
param2 match {
|
||||||
|
case head :: tail => tail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case class ACaseClass(param1: Float = 14.23f)
|
||||||
|
case object ACaseObject extends Something
|
||||||
|
|
||||||
|
def x(): Unit = {
|
||||||
|
case Something(a, b) =>
|
||||||
|
case SomethingElse() =>
|
||||||
|
case SomethingElseElse =>
|
||||||
|
}
|
||||||
|
|
||||||
|
class ScalaClass(i: Int = 12, b: Trait[A, Trait[B, C]]) extends B with SomeTrait[A, B[String], D] {
|
||||||
|
/**
|
||||||
|
* I forgot comments! We spelcheck them. [[scala.Option]]
|
||||||
|
*
|
||||||
|
* {{{
|
||||||
|
* scala> This is a REPL line
|
||||||
|
* scala> and this is another one
|
||||||
|
* }}}
|
||||||
|
*
|
||||||
|
* <li></li>
|
||||||
|
*
|
||||||
|
* @param parameter Explanation of the parameter. Speling.
|
||||||
|
* @return TODO
|
||||||
|
*/
|
||||||
|
val thing = "A String" // this is a trailing comment, spelchecked too [TODO]
|
||||||
|
val thing = "A String with a \" in it"
|
||||||
|
val intString = "A string with $stuff // and a comment in it"
|
||||||
|
val intString = s"A string /* a comment and */ with $stuff and ${stuff} in it"
|
||||||
|
val intString = s"""A string /* a comment and */ with $stuff and ${stuff} in it"""
|
||||||
|
val intFString = f"A string with $stuff and ${stuff} and ${eval this}%-2.2f and $stuff%2d in it"
|
||||||
|
val intFString = f"""A string with $stuff and ${stuff} and ${eval this}%-2.2f and $stuff%2d in it"""
|
||||||
|
val otherThings = """|This is a string
|
||||||
|
|that spans multiple lines.
|
||||||
|
|""".stripMargin
|
||||||
|
val intString = sql"select * from T where id = $id and name = ${name}"
|
||||||
|
val intString = sql"""
|
||||||
|
select * from T
|
||||||
|
where id = $id and name = ${s"$name Jr"} and age > ${age + 10}
|
||||||
|
"""
|
||||||
|
|
||||||
|
val notImplemented = ???
|
||||||
|
|
||||||
|
implicit val somethingImplicit = true
|
||||||
|
|
||||||
|
// Ripped off from Scalaz
|
||||||
|
final def foldMap[B: Monoid](f: A => B = (a: A) => A): B = F.foldMap(self)(f)
|
||||||
|
final def foldRight[B](z: => B)(f: (A, => B) => B): B = F.foldRight(self, z)(f)
|
||||||
|
final def foldLeft[B](z: B)(f: (B, A) => B): B = F.foldLeft(self, z)(f)
|
||||||
|
final def foldRightM[G[_], B](z: => B)(f: (A, => B) => G[B])(implicit M: Monad[G]): G[B] = F.foldRightM(self, z)(f)
|
||||||
|
final def foldLeftM[G[_], B](z: B)(f: (B, A) => G[B])(implicit M: Monad[G]): G[B] = F.foldLeftM(self, z)(f)
|
||||||
|
final def foldr[B](z: => B)(f: A => (=> B) => B): B = F.foldr(self, z)(f)
|
||||||
|
final def foldl[B](z: B)(f: B => A => B): B = F.foldl(self, z)(f)
|
||||||
|
final def foldrM[G[_], B](z: => B)(f: A => ( => B) => G[B])(implicit M: Monad[G]): G[B] = F.foldrM(self, z)(f)
|
||||||
|
|
||||||
|
val aChar = 'a'
|
||||||
|
val anEscapedChar = '\\'
|
||||||
|
val anotherEscapedChar = '\n'
|
||||||
|
val aUnicodeChar = '\u00ab'
|
||||||
|
val aSymbol = 'SomeSymbol
|
||||||
|
def number = 0xAf903adeL
|
||||||
|
def float = 1f
|
||||||
|
def float = 1F
|
||||||
|
def float = 1.1f
|
||||||
|
def float = 1.1F
|
||||||
|
def float = 231.1232f
|
||||||
|
def float = 231.2321F
|
||||||
|
def float = .2f
|
||||||
|
def float = .2F
|
||||||
|
def double = 1d
|
||||||
|
def double = 1D
|
||||||
|
def double = 1.1d
|
||||||
|
def double = 1.1D
|
||||||
|
def double = 231.1232d
|
||||||
|
def double = 231.2321D
|
||||||
|
def double = 231.2321
|
||||||
|
def double = .2d
|
||||||
|
def double = .2
|
||||||
|
def double = .2D
|
||||||
|
def exp = 1.2342e-24
|
||||||
|
def exp = 1e+24
|
||||||
|
var flarf: Int = 12
|
||||||
|
def flooger(x: String): Unit = println(42)
|
||||||
|
private val booger = "Hithere"
|
||||||
|
protected[this] def something[A](y: SomeTrait[A])(implicit shoot: Function[Int, String]): Long = 12
|
||||||
|
private final val do = done
|
||||||
|
|
||||||
|
someVar match {
|
||||||
|
case Flooger(thing, that, matches) =>
|
||||||
|
flender ! Message(hi, there, guys)
|
||||||
|
case '"' => Bah
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
whatever
|
||||||
|
} catch {
|
||||||
|
case e: Throwable
|
||||||
|
} finally {
|
||||||
|
at the end
|
||||||
|
}
|
||||||
|
|
||||||
|
while (a == b) {
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x <- somecall) {
|
||||||
|
dothing
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
a <- futureCall1
|
||||||
|
b <- futureCall2
|
||||||
|
} yield (a, b)
|
||||||
|
|
||||||
|
protected[package] something = null
|
||||||
|
|
||||||
|
def receive = super.receive
|
||||||
|
|
||||||
|
require(something == true)
|
||||||
|
|
||||||
|
val q"This $is a $string" = something
|
||||||
|
|
||||||
|
q"""return this $thing"""
|
||||||
|
tq"""return this $thing"""
|
||||||
|
tq"return this $thing"
|
||||||
|
cq"""return this $thing"""
|
||||||
|
cq"return this $thing"
|
||||||
|
pq"""return this $thing"""
|
||||||
|
pq"return this $thing"
|
||||||
|
|
||||||
|
val something = s"""bar="foo""""
|
||||||
|
val something = f"""bar="foo""""
|
||||||
|
val something = """bar="foo""""
|
||||||
|
val something = s"Interpolatin' fancy expressions ${bar map (_.toString)}"
|
||||||
|
|
||||||
|
def someFunc[A <: B, X =:= Y]
|
||||||
|
|
||||||
|
val soManyEscapes = "\\\"\u0031\n\b\r\f\t" // and a comment
|
||||||
|
val soManyEscapes = """\\\"\u0031\n\b\r\f\t""" // and a comment
|
||||||
|
val soManyEscapes = s"\\\"\u0031\n\b\r\f\t" // and a comment
|
||||||
|
val soManyEscapes = f"\\\"\u0031\n\b\r\f\t" // and a comment
|
||||||
|
val soManyEscapes = s"""\\\"\u0031\n\b\r\f\t""" // and a comment
|
||||||
|
val soManyEscapes = f"""\\\"\u0031\n\b\r\f\t""" // and a comment
|
||||||
|
val soManyEscapes = "\\\"\u0031\n\b\r\f\t" // and a comment
|
||||||
|
}
|
Loading…
Reference in a new issue