mirror of
1
0
Fork 0
This commit is contained in:
shan23 2018-03-11 01:55:04 +00:00 committed by GitHub
commit a2c4cde56d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 3127 additions and 0 deletions

View File

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2016 Romain Lafourcade
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,206 @@
# ![Apprentice](http://romainl.github.io/Apprentice/images/logo.png)
Apprentice is a dark, low-contrast colorscheme for Vim based on the awesome [Sorcerer](http://www.vim.org/scripts/script.php?script_id=3299) by Jeet Sukumaran.
It is essentially a streamlined version of the original, with a reduced number of colors entirely taken from the default xterm palette to ensure a similar look in 256colors-ready terminal emulators and GUI Vim.
Some code in MacVim:
![image](http://romainl.github.io/Apprentice/images/0macvim.png)
Some code in iTerm, with `TERM=xterm-256color`:
![image](http://romainl.github.io/Apprentice/images/0256term.png)
Some code in mintty, with `TERM=xterm-256color`:
![image](http://romainl.github.io/Apprentice/images/0256mintty.png)
Some code in iTerm, with `TERM=xterm`, using the Tango color palette:
![image](http://romainl.github.io/Apprentice/images/08termtango.png)
## Preparing your environment.
Apprentice is designed first and foremost to look “good” in terminal emulators supporting 256 colors and in GUI Vim (GVim/MacVim). It supports lesser terminal emulators in the sense that it doesnt break but it will definitely look “better” in more capable environments.
### GVim/MacVim
There is nothing to do for GVim/MacVim as GUI Vim supports “True Color” by default.
### “True Color” terminal emulators
Since January 2016, Vim has been able to talk in “True Color” to terminal emulators supporting that feature. This means that it is now not only possible but also very easy to have **the exact same colors** in TUI Vim and GUI Vim.
In practice, this new development doesn't change much for Apprentice which uses the exact same colors in the GUI as it does in the TUI anyway. But you can still try “True Color” if your setup satisfies the requirements with the following command:
:set termguicolors
See [this gist](https://gist.github.com/XVilka/8346728) for more information and support status and, of course, `:help termguicolors`.
### 256color-ready terminal emulators
Most terminal emulators in use nowadays *can* display 256 colors but most of them use a default `TERM` that tells Vim otherwise. Assuming your terminal emulator actually supports 256 colors, you must instruct it to brag about its terminal-hood by setting the correct `TERM` environment variable.
The “ideal” `TERM` usually includes the string `256color`, like `xterm-256color`. The actual value is highly dependent on your terminal emulator and/or your terminal multiplexer, though, so you will have to refer to their manual.
### Working with 8/16 colors
As an alternative to changing your default `TERM` to `xterm-256color` or similar, you can keep its default value (usually something like `xterm` or `screen`) and set your terminal emulator to use [the Apprentice colorscheme](https://github.com/romainl/iterm2-colorschemes#readme) instead of its default colors.
The table below contains a subset of Apprentices palette. You can use a color picker or copy/paste these values:
| Intensity | Normal | Intensity | Bright |
|------------------|--------------------------|------------------|--------------------------|
| 0 | `#1C1C1C` ![#1C1C1C][0] | 8 | `#444444` ![#444444][0] |
| 1 | `#AF5F5F` ![#AF5F5F][1] | 9 | `#FF8700` ![#FF8700][9] |
| 2 | `#5F875F` ![#5F875F][2] | 10 | `#87AF87` ![#87AF87][10] |
| 3 | `#87875F` ![#87875F][3] | 11 | `#FFFFAF` ![#FFFFAF][11] |
| 4 | `#5F87AF` ![#5F87AF][4] | 12 | `#8FAFD7` ![#8FAFD7][12] |
| 5 | `#5F5F87` ![#5F5F87][5] | 13 | `#8787AF` ![#8787AF][13] |
| 6 | `#5F8787` ![#5F8787][6] | 14 | `#5FAFAF` ![#5FAFAF][14] |
| 7 | `#6C6C6C` ![#6C6C6C][7] | 15 | `#FFFFFF` ![#FFFFFF][15] |
| Foreground color | `#BCBCBC` ![#BCBCBC][16] | Background color | `#262626` ![#262626][17] |
Here is a sample `~/.Xresources` for you Linux/BSD users. You can import this into [terminal.sexy](http://terminal.sexy) to convert it to the appropriate color scheme format for your preferred terminal emulator:
*.foreground: #BCBCBC
*.background: #262626
*.color0: #1C1C1C
*.color8: #444444
*.color1: #AF5F5F
*.color9: #FF8700
*.color2: #5F875F
*.color10: #87AF87
*.color3: #87875F
*.color11: #FFFFAF
*.color4: #5F87AF
*.color12: #8FAFD7
*.color5: #5F5F87
*.color13: #8787AF
*.color6: #5F8787
*.color14: #5FAFAF
*.color7: #6C6C6C
*.color15: #FFFFFF
And a sample `~/.minttyrc` for you Cygwin users:
ForegroundColour=188,188,188
BackgroundColour=38,38,38
Black=28,28,28
Red=175,95,95
Green=95,135,95
Yellow=135,135,95
Blue=95,135,175
Magenta=95,95,135
Cyan=95,135,135
White=108,108,108
BoldBlack=68,68,68
BoldRed=255,135,0
BoldGreen=135,175,135
BoldYellow=255,255,175
BoldBlue=143,175,215
BoldMagenta=135,135,175
BoldCyan=95,175,175
BoldWhite=255,255,255
Some code in iTerm, with `TERM=xterm`, using the color palette above:
![image](http://romainl.github.io/Apprentice/images/08termapprentice.png)
Some code in the Windows console, with `TERM=cygwin`, using the color palette above:
![image](http://romainl.github.io/Apprentice/images/016console.png)
### All terminal emulators
I recommend to adjust your terminal's background color to the one used in Apprentice if you want to avoid having a “frame” around Vim:
| Notation | Value |
|-------------|-----------------|
| xterm | `235` |
| hexadecimal | `#262626` |
| rgb | `rgb(38,38,38)` |
## Installing Apprentice.
Colorschemes must be placed in a directory named `colors` that is somewhere in Vims `runtimepath`:
The canonical location is:
~/.vim/colors/apprentice.vim
but it could be:
~/.vim/bundle/apprentice/colors/apprentice.vim
or whatever works for you.
Arch users may be happy to hear that Apprentice [has landed in AUR](https://aur.archlinux.org/packages/vim-apprentice/). To install it, use an AUR helper — `yaourt -S vim-apprentice` — or download the `PKGBUILD` and do `$ makepkg -i`.
## Enabling Apprentice.
To test Apprentice, just type this command from *normal* mode and hit `Enter`:
:colorscheme apprentice
If you like what you see and want to make Apprentice your default colorscheme, add this line to your `~/.vimrc`, preferably near the end, after any `syntax enable`, `syntax on`, `filetype ... on`, `call plug#end()`, or `call vundle#end()` line:
colorscheme apprentice
## Lightline and Airline themes
I removed them from `master` but you can still find them in the "fancylines-and-neovim" branch.
## Neovim terminal theme
I removed it from `master` but you can still find it in the "fancylines-and-neovim" branch.
## What they say about Apprentice.
* Vimgor, in #vim: *“A colorscheme as subtle, gentle and pleasant as its creator isn't.”*
* Gfixler, in [r/vim](http://www.reddit.com/r/vim/comments/2fws13/syntax_on/cke2ued): *“I've been enjoying Apprentice. It's the only color scheme so far that I haven't felt like modifying in any way.”*
* dddbbb, in [r/vim](http://www.reddit.com/r/vim/comments/2fws13/syntax_on/ckekyg1): *“Haha, you've been quoted in the readme. romainl is still with us in spirit! Apprentice looks nice, and it's great that seems simple to get it working in terminal (no t_co hacks).”*
* Gfixler again, in [r/vim](http://www.reddit.com/r/vim/comments/30dph9/solarizedlike_colorschemes/cprnfxm): *“My favorite color scheme by far is Apprentice, but again, it's completely subjective. Pick something that makes you feel good while using it. I particularly love Apprentice's selection blue color. I select things all the time just to experience it. So pretty.”*
;-)
## Derivative works
If light colorschemes are more your thing, [Disciple](https://github.com/romainl/Disciple) is an experimental and mostly unmaintained negative version of Apprentice.
On the same note, [Lightning](https://github.com/wimstefan/Lightning) is a light fork of Apprentice worth considering.
[Intern](https://github.com/drzel/intern-hexchat-theme) is an [HexChat](https://hexchat.github.io/) theme based on Apprentice.
[This very enthusiastic fellow](https://github.com/xHN35RQ) created [a home](https://github.com/xHN35RQ/apprentice-colorschemes) for terminal emulator themes adapted from Apprentice.
A port of Apprentice is available for the IDEA platform. Check it out [over there.](https://github.com/jpeddicord/apprentice-idea)
[Elysian](https://github.com/nhooyr/elysian.vim) is a new very nice colorscheme for 256color terminal emulators inspired by Apprentice.
[apprentice-theme](https://github.com/sjas/apprentice-theme) is a port to spacemacs.
Go team!
[0]: http://romainl.github.io/Apprentice/images/1c1c1c.png
[1]: http://romainl.github.io/Apprentice/images/af5f5f.png
[2]: http://romainl.github.io/Apprentice/images/5f875f.png
[3]: http://romainl.github.io/Apprentice/images/87875f.png
[4]: http://romainl.github.io/Apprentice/images/5f87af.png
[5]: http://romainl.github.io/Apprentice/images/5f5f87.png
[6]: http://romainl.github.io/Apprentice/images/5f8787.png
[7]: http://romainl.github.io/Apprentice/images/6c6c6c.png
[8]: http://romainl.github.io/Apprentice/images/444444.png
[9]: http://romainl.github.io/Apprentice/images/ff8700.png
[10]: http://romainl.github.io/Apprentice/images/87af87.png
[11]: http://romainl.github.io/Apprentice/images/ffffaf.png
[12]: http://romainl.github.io/Apprentice/images/8fafd7.png
[13]: http://romainl.github.io/Apprentice/images/8787af.png
[14]: http://romainl.github.io/Apprentice/images/5fafaf.png
[15]: http://romainl.github.io/Apprentice/images/ffffff.png
[16]: http://romainl.github.io/Apprentice/images/bcbcbc.png
[17]: http://romainl.github.io/Apprentice/images/262626.png

View File

@ -0,0 +1,256 @@
" 'apprentice.vim' -- Vim color scheme.
" Author: Romain Lafourcade (romainlafourcade@gmail.com)
" Description: Essentially a streamlining and conversion to xterm colors of
" 'sorcerer' by Jeet Sukumaran (jeetsukumaran@gmailcom)
" Last Change: 2017 Oct 07
" MADE-UP NAME HEX RGB XTERM ANSI
" ========================================================================
" almost black #1c1c1c rgb(28, 28, 28) 234 0
" darker grey #262626 rgb(38, 38, 38) 235 background color
" dark grey #303030 rgb(48, 48, 48) 236 8
" grey #444444 rgb(68, 68, 68) 238 8
" medium grey #585858 rgb(88, 88, 88) 240 8
" light grey #6c6c6c rgb(108, 108, 108) 242 7
" lighter grey #bcbcbc rgb(188, 188, 188) 250 foreground color
" white #ffffff rgb(255, 255, 255) 231 15
" purple #5f5f87 rgb(95, 95, 135) 60 5
" light purple #8787af rgb(135, 135, 175) 103 13
" green #5f875f rgb(95, 135, 95) 65 2
" light green #87af87 rgb(135, 175, 135) 108 10
" aqua #5f8787 rgb(95, 135, 135) 66 6
" light aqua #5fafaf rgb(95, 175, 175) 73 14
" blue #5f87af rgb(95, 135, 175) 67 4
" light blue #8fafd7 rgb(143, 175, 215) 110 12
" red #af5f5f rgb(175, 95, 95) 131 1
" orange #ff8700 rgb(255, 135, 0) 208 9
" ocre #87875f rgb(135, 135, 95) 101 3
" yellow #ffffaf rgb(255, 255, 175) 229 11
hi clear
if exists("syntax_on")
syntax reset
endif
let colors_name = "apprentice"
if ($TERM =~ '256' || &t_Co >= 256) || has("gui_running")
hi Normal ctermbg=235 ctermfg=250 guibg=#262626 guifg=#bcbcbc cterm=NONE gui=NONE
hi LineNr ctermbg=234 ctermfg=242 guibg=#1c1c1c guifg=#6c6c6c cterm=NONE gui=NONE
hi FoldColumn ctermbg=234 ctermfg=242 guibg=#1c1c1c guifg=#6c6c6c cterm=NONE gui=NONE
hi Folded ctermbg=234 ctermfg=242 guibg=#1c1c1c guifg=#6c6c6c cterm=NONE gui=NONE
hi MatchParen ctermbg=234 ctermfg=229 guibg=#1c1c1c guifg=#ffffaf cterm=NONE gui=NONE
hi signColumn ctermbg=234 ctermfg=242 guibg=#1c1c1c guifg=#6c6c6c cterm=NONE gui=NONE
set background=dark
hi Comment ctermbg=NONE ctermfg=240 guibg=NONE guifg=#585858 cterm=NONE gui=NONE
hi Conceal ctermbg=NONE ctermfg=250 guibg=NONE guifg=#bcbcbc cterm=NONE gui=NONE
hi Constant ctermbg=NONE ctermfg=208 guibg=NONE guifg=#ff8700 cterm=NONE gui=NONE
hi Error ctermbg=NONE ctermfg=131 guibg=NONE guifg=#af5f5f cterm=reverse gui=reverse
hi Identifier ctermbg=NONE ctermfg=67 guibg=NONE guifg=#5f87af cterm=NONE gui=NONE
hi Ignore ctermbg=NONE ctermfg=NONE guibg=NONE guifg=NONE cterm=NONE gui=NONE
hi PreProc ctermbg=NONE ctermfg=66 guibg=NONE guifg=#5f8787 cterm=NONE gui=NONE
hi Special ctermbg=NONE ctermfg=65 guibg=NONE guifg=#5f875f cterm=NONE gui=NONE
hi Statement ctermbg=NONE ctermfg=110 guibg=NONE guifg=#8fafd7 cterm=NONE gui=NONE
hi String ctermbg=NONE ctermfg=108 guibg=NONE guifg=#87af87 cterm=NONE gui=NONE
hi Todo ctermbg=NONE ctermfg=NONE guibg=NONE guifg=NONE cterm=reverse gui=reverse
hi Type ctermbg=NONE ctermfg=103 guibg=NONE guifg=#8787af cterm=NONE gui=NONE
hi Underlined ctermbg=NONE ctermfg=66 guibg=NONE guifg=#5f8787 cterm=underline gui=underline
hi NonText ctermbg=NONE ctermfg=240 guibg=NONE guifg=#585858 cterm=NONE gui=NONE
hi Pmenu ctermbg=238 ctermfg=250 guibg=#444444 guifg=#bcbcbc cterm=NONE gui=NONE
hi PmenuSbar ctermbg=240 ctermfg=NONE guibg=#585858 guifg=NONE cterm=NONE gui=NONE
hi PmenuSel ctermbg=66 ctermfg=235 guibg=#5f8787 guifg=#262626 cterm=NONE gui=NONE
hi PmenuThumb ctermbg=66 ctermfg=66 guibg=#5f8787 guifg=#5f8787 cterm=NONE gui=NONE
hi ErrorMsg ctermbg=131 ctermfg=235 guibg=#af5f5f guifg=#262626 cterm=NONE gui=NONE
hi ModeMsg ctermbg=108 ctermfg=235 guibg=#87af87 guifg=#262626 cterm=NONE gui=NONE
hi MoreMsg ctermbg=NONE ctermfg=66 guibg=NONE guifg=#5f8787 cterm=NONE gui=NONE
hi Question ctermbg=NONE ctermfg=108 guibg=NONE guifg=#87af87 cterm=NONE gui=NONE
hi WarningMsg ctermbg=NONE ctermfg=131 guibg=NONE guifg=#af5f5f cterm=NONE gui=NONE
hi TabLine ctermbg=238 ctermfg=101 guibg=#444444 guifg=#87875f cterm=NONE gui=NONE
hi TabLineFill ctermbg=238 ctermfg=238 guibg=#444444 guifg=#444444 cterm=NONE gui=NONE
hi TabLineSel ctermbg=101 ctermfg=235 guibg=#87875f guifg=#262626 cterm=NONE gui=NONE
hi Cursor ctermbg=242 ctermfg=NONE guibg=#6c6c6c guifg=NONE cterm=NONE gui=NONE
hi CursorColumn ctermbg=236 ctermfg=NONE guibg=#303030 guifg=NONE cterm=NONE gui=NONE
hi CursorLineNr ctermbg=236 ctermfg=73 guibg=#303030 guifg=#5fafaf cterm=NONE gui=NONE
hi CursorLine ctermbg=236 ctermfg=NONE guibg=#303030 guifg=NONE cterm=NONE gui=NONE
hi helpLeadBlank ctermbg=NONE ctermfg=NONE guibg=NONE guifg=NONE cterm=NONE gui=NONE
hi helpNormal ctermbg=NONE ctermfg=NONE guibg=NONE guifg=NONE cterm=NONE gui=NONE
hi StatusLine ctermbg=101 ctermfg=235 guibg=#87875f guifg=#262626 cterm=NONE gui=NONE
hi StatusLineNC ctermbg=238 ctermfg=101 guibg=#444444 guifg=#87875f cterm=NONE gui=NONE
hi Visual ctermbg=235 ctermfg=110 guibg=#262626 guifg=#8fafd7 cterm=reverse gui=reverse
hi VisualNOS ctermbg=NONE ctermfg=NONE guibg=NONE guifg=NONE cterm=underline gui=underline
hi VertSplit ctermbg=238 ctermfg=238 guibg=#444444 guifg=#444444 cterm=NONE gui=NONE
hi WildMenu ctermbg=110 ctermfg=235 guibg=#8fafd7 guifg=#262626 cterm=NONE gui=NONE
hi Function ctermbg=NONE ctermfg=229 guibg=NONE guifg=#ffffaf cterm=NONE gui=NONE
hi SpecialKey ctermbg=NONE ctermfg=240 guibg=NONE guifg=#585858 cterm=NONE gui=NONE
hi Title ctermbg=NONE ctermfg=231 guibg=NONE guifg=#ffffff cterm=NONE gui=NONE
hi DiffAdd ctermbg=235 ctermfg=108 guibg=#262626 guifg=#87af87 cterm=reverse gui=reverse
hi DiffChange ctermbg=235 ctermfg=103 guibg=#262626 guifg=#8787af cterm=reverse gui=reverse
hi DiffDelete ctermbg=235 ctermfg=131 guibg=#262626 guifg=#af5f5f cterm=reverse gui=reverse
hi DiffText ctermbg=235 ctermfg=208 guibg=#262626 guifg=#ff8700 cterm=reverse gui=reverse
hi IncSearch ctermbg=131 ctermfg=235 guibg=#af5f5f guifg=#262626 cterm=NONE gui=NONE
hi Search ctermbg=229 ctermfg=235 guibg=#ffffaf guifg=#262626 cterm=NONE gui=NONE
hi Directory ctermbg=NONE ctermfg=73 guibg=NONE guifg=#5fafaf cterm=NONE gui=NONE
hi debugPC ctermbg=67 guibg=#5f87af
hi debugBreakpoint ctermbg=131 guibg=#af5f5f
if has("gui_running")
hi SpellBad ctermbg=NONE ctermfg=131 guibg=NONE guifg=NONE cterm=undercurl gui=undercurl guisp=#af5f5f
hi SpellCap ctermbg=NONE ctermfg=73 guibg=NONE guifg=NONE cterm=undercurl gui=undercurl guisp=#5fafaf
hi SpellLocal ctermbg=NONE ctermfg=65 guibg=NONE guifg=NONE cterm=undercurl gui=undercurl guisp=#5f875f
hi SpellRare ctermbg=NONE ctermfg=208 guibg=NONE guifg=NONE cterm=undercurl gui=undercurl guisp=#ff8700
else
hi SpellBad ctermbg=NONE ctermfg=131 guibg=NONE guifg=#af5f5f cterm=undercurl gui=undercurl guisp=NONE
hi SpellCap ctermbg=NONE ctermfg=73 guibg=NONE guifg=#5fafaf cterm=undercurl gui=undercurl guisp=NONE
hi SpellLocal ctermbg=NONE ctermfg=65 guibg=NONE guifg=#5f875f cterm=undercurl gui=undercurl guisp=NONE
hi SpellRare ctermbg=NONE ctermfg=208 guibg=NONE guifg=#ff8700 cterm=undercurl gui=undercurl guisp=NONE
endif
hi ColorColumn ctermbg=234 ctermfg=NONE guibg=#1c1c1c guifg=NONE cterm=NONE gui=NONE
elseif &t_Co == 8 || $TERM !~# '^linux' || &t_Co == 16
set t_Co=16
hi Normal ctermbg=NONE ctermfg=white cterm=NONE
set background=dark
hi Comment ctermbg=NONE ctermfg=gray cterm=NONE
hi Conceal ctermbg=NONE ctermfg=white cterm=NONE
hi Constant ctermbg=NONE ctermfg=red cterm=NONE
hi Function ctermbg=NONE ctermfg=yellow cterm=NONE
hi Identifier ctermbg=NONE ctermfg=darkblue cterm=NONE
hi PreProc ctermbg=NONE ctermfg=darkcyan cterm=NONE
hi Special ctermbg=NONE ctermfg=darkgreen cterm=NONE
hi Statement ctermbg=NONE ctermfg=blue cterm=NONE
hi String ctermbg=NONE ctermfg=green cterm=NONE
hi Todo ctermbg=NONE ctermfg=NONE cterm=reverse
hi Type ctermbg=NONE ctermfg=magenta cterm=NONE
hi Error ctermbg=NONE ctermfg=darkred cterm=reverse
hi Ignore ctermbg=NONE ctermfg=NONE cterm=NONE
hi Underlined ctermbg=NONE ctermfg=NONE cterm=reverse
hi LineNr ctermbg=black ctermfg=gray cterm=NONE
hi NonText ctermbg=NONE ctermfg=darkgray cterm=NONE
hi Pmenu ctermbg=darkgray ctermfg=white cterm=NONE
hi PmenuSbar ctermbg=gray ctermfg=NONE cterm=NONE
hi PmenuSel ctermbg=darkcyan ctermfg=black cterm=NONE
hi PmenuThumb ctermbg=darkcyan ctermfg=NONE cterm=NONE
hi ErrorMsg ctermbg=darkred ctermfg=black cterm=NONE
hi ModeMsg ctermbg=darkgreen ctermfg=black cterm=NONE
hi MoreMsg ctermbg=NONE ctermfg=darkcyan cterm=NONE
hi Question ctermbg=NONE ctermfg=green cterm=NONE
hi WarningMsg ctermbg=NONE ctermfg=darkred cterm=NONE
hi TabLine ctermbg=darkgray ctermfg=darkyellow cterm=NONE
hi TabLineFill ctermbg=darkgray ctermfg=black cterm=NONE
hi TabLineSel ctermbg=darkyellow ctermfg=black cterm=NONE
hi Cursor ctermbg=NONE ctermfg=NONE cterm=NONE
hi CursorColumn ctermbg=darkgray ctermfg=NONE cterm=NONE
hi CursorLineNr ctermbg=black ctermfg=cyan cterm=NONE
hi CursorLine ctermbg=darkgray ctermfg=NONE cterm=NONE
hi helpLeadBlank ctermbg=NONE ctermfg=NONE cterm=NONE
hi helpNormal ctermbg=NONE ctermfg=NONE cterm=NONE
hi StatusLine ctermbg=darkyellow ctermfg=black cterm=NONE
hi StatusLineNC ctermbg=darkgray ctermfg=darkyellow cterm=NONE
hi Visual ctermbg=black ctermfg=blue cterm=reverse
hi VisualNOS ctermbg=black ctermfg=white cterm=reverse
hi FoldColumn ctermbg=black ctermfg=darkgray cterm=NONE
hi Folded ctermbg=black ctermfg=darkgray cterm=NONE
hi VertSplit ctermbg=darkgray ctermfg=darkgray cterm=NONE
hi WildMenu ctermbg=blue ctermfg=black cterm=NONE
hi SpecialKey ctermbg=NONE ctermfg=darkgray cterm=NONE
hi Title ctermbg=NONE ctermfg=white cterm=NONE
hi DiffAdd ctermbg=black ctermfg=green cterm=reverse
hi DiffChange ctermbg=black ctermfg=magenta cterm=reverse
hi DiffDelete ctermbg=black ctermfg=darkred cterm=reverse
hi DiffText ctermbg=black ctermfg=red cterm=reverse
hi IncSearch ctermbg=darkred ctermfg=black cterm=NONE
hi Search ctermbg=yellow ctermfg=black cterm=NONE
hi Directory ctermbg=NONE ctermfg=cyan cterm=NONE
hi MatchParen ctermbg=black ctermfg=yellow cterm=NONE
hi SpellBad ctermbg=NONE ctermfg=darkred cterm=undercurl
hi SpellCap ctermbg=NONE ctermfg=darkyellow cterm=undercurl
hi SpellLocal ctermbg=NONE ctermfg=darkgreen cterm=undercurl
hi SpellRare ctermbg=NONE ctermfg=darkmagenta cterm=undercurl
hi ColorColumn ctermbg=black ctermfg=NONE cterm=NONE
hi SignColumn ctermbg=black ctermfg=darkgray cterm=NONE
endif
hi link Boolean Constant
hi link Character Constant
hi link Conditional Statement
hi link Debug Special
hi link Define PreProc
hi link Delimiter Special
hi link Exception Statement
hi link Float Number
hi link HelpCommand Statement
hi link HelpExample Statement
hi link Include PreProc
hi link Keyword Statement
hi link Label Statement
hi link Macro PreProc
hi link Number Constant
hi link Operator Statement
hi link PreCondit PreProc
hi link Repeat Statement
hi link SpecialChar Special
hi link SpecialComment Special
hi link StorageClass Type
hi link Structure Type
hi link Tag Special
hi link Typedef Type
hi link htmlEndTag htmlTagName
hi link htmlLink Function
hi link htmlSpecialTagName htmlTagName
hi link htmlTag htmlTagName
hi link htmlBold Normal
hi link htmlItalic Normal
hi link xmlTag Statement
hi link xmlTagName Statement
hi link xmlEndTag Statement
hi link markdownItalic Preproc
hi link asciidocQuotedEmphasized Preproc
hi link diffBDiffer WarningMsg
hi link diffCommon WarningMsg
hi link diffDiffer WarningMsg
hi link diffIdentical WarningMsg
hi link diffIsA WarningMsg
hi link diffNoEOL WarningMsg
hi link diffOnly WarningMsg
hi link diffRemoved WarningMsg
hi link diffAdded String

View File

@ -0,0 +1,5 @@
.DS_Store
*.orig
*.bak
*.log
*.diff

View File

@ -0,0 +1,21 @@
# vim-drake-syntax
Basic Vim syntax for [drake](https://github.com/Factual/drake).
## Installing
Firstly, set up [pathogen](https://github.com/tpope/vim-pathogen) for Vim.
Then check out this project inside `~/.vim/bundle`:
```bash
mkdir -p ~/.vim/bundle
cd ~/.vim/bundle
git clone https://bitbucket.org/larsyencken/vim-drake-syntax.git
```
Syntax highlighting will then work when you open a Drakefile (or `workflow.d` file).
## Issues
If you find a problem with the syntax highlighting, please come up with a code snippet showing the problem and [file an issue](https://bitbucket.org/larsyencken/vim-drake-syntax/issues/new). Patches are also most welcome.

View File

@ -0,0 +1 @@
au BufNewFile,BufRead workflow.d,Drakefile set filetype=drake syntax=drake

View File

@ -0,0 +1,93 @@
"
" Vim syntax file for drake
" Language: drake
" Maintainer: Lars Yencken <lars@yencken.org>
" Latest Revision: 2013-01-31
"
if exists("b:current_syntax")
finish
endif
let b:current_syntax = ''
unlet b:current_syntax
syn include @Shell syntax/sh.vim
let b:current_syntax = ''
unlet b:current_syntax
syn include @Python syntax/python.vim
let b:current_syntax = ''
unlet b:current_syntax
syn include @Ruby syntax/ruby.vim
let b:current_syntax = ''
unlet b:current_syntax
syn include @Clojure syntax/clojure.vim
let b:current_syntax = ''
unlet b:current_syntax
syn include @R syntax/r.vim
" Comments
syn match drakeComment ";.*$" contains=drakeTodo
" Variable definitions
syn match drakeSetVariable "^[a-zA-Z-_][a-zA-Z-_]*=[^,]*$" contains=drakeVariable
syn match drakeVariable "^[a-zA-Z-_][a-zA-Z-_]*" contained nextgroup=drakeSetIdentifier containedin=drakeVariable
syn match drakeSetIdentifier "=" nextgroup=drakeSetValue
syn match drakeSetValue ".*$" contained contains=drakeString
syn match drakeString "[^ ,]*" contained contains=drakeVariableRef containedin=drakeSetValue
" Method blocks
syn region drakeMethodBlock start="^[a-zA-Z-][a-zA-Z0-9-]*()" end="^$" contains=drakeMethodSignature
syn match drakeMethodSignature "^[a-zA-Z-][a-zA-Z0-9-]*" contained nextgroup=drakeMethodBraces
syn match drakeMethodBraces "()" contained nextgroup=drakeDefaultShBlock,drakeShBlock,drakePyBlock
" Variable references in strings
syn region drakeVariableRef matchgroup=VarBraces start='\$\[' end='\]' contained containedin=drakeString contains=drakeVariableName
syn match drakeVariableName "[a-zA-Z-_][a-zA-Z-_]*" contained containedin=drakeVariableRef
" Rule blocks
syn region drakeBlock start="[^<;, ][^<;, ]*\(, [^<;, ][^<;, ]*\)* <-" end="^$" contains=drakeRule
syn match drakeRule "[^<;, ].* <-\( [^[<; ][^<; ]*\)*" contains=drakeTargets nextgroup=drakeDefaultShBlock,drakeShBlock,drakePyBlock
syn match drakeTargets "[^<;, ][^<;, ]*\(, [^<;, ][^<;, ]*\)*" contained nextgroup=drakeRuleIdentifier contains=drakeString,drakeSourceSep
syn match drakeSources "\( ,?[^<[;, ][^<;, ]*\)*" contained contains=drakeString,drakeSourceSep
syn match drakeRuleIdentifier " <-" contained nextgroup=drakeSources
syn match drakeTargetSep ", " contained containedin=drakeTargets
syn match drakeSourceSep ", " contained containedin=drakeSources
" Todos in comments
syn keyword drakeTodo contained TODO NOTE FIXME XXX
hi link drakeComment Comment
hi link drakeTodo Todo
hi link drakeVariable Identifier
hi link drakeSetIdentifier Delimiter
hi link drakeRuleIdentifier Delimiter
hi link drakeString String
hi link drakeVariableName Identifier
hi link VarBraces SpecialComment
hi link drakeTargetSep Delimiter
hi link drakeSourceSep Delimiter
" Embedded shell region in block
syn region drakeDefaultShBlock matchgroup=Snip start='^[ \t][ \t]*' end='^$' containedin=drakeBlock,drakeMethodBlock contains=@Shell
syn region drakeShBlock matchgroup=Snip start=' \[shell\]$' end='^$' containedin=drakeBlock,drakeMethodBlock contains=@Shell
syn region drakePyBlock matchgroup=Snip start=' \[python\]$' end='^$' containedin=drakeBlock,drakeMethodBlock contains=@Python
syn region drakePyBlock matchgroup=Snip start=' \[ruby\]$' end='^$' containedin=drakeBlock,drakeMethodBlock contains=@Ruby
syn region drakePyBlock matchgroup=Snip start=' \[clojure\]$' end='^$' containedin=drakeBlock,drakeMethodBlock contains=@Clojure
syn region drakePyBlock matchgroup=Snip start=' \[R\]$' end='^$' containedin=drakeBlock,drakeMethodBlock contains=@R
" Embedded shell regions in strings
syn region shellBrackets matchgroup=SnipBraces start='\$(' end=')' containedin=drakeString contains=@Shell
hi link Snip SpecialComment
hi link SnipBraces SpecialComment
hi link drakeVariableRef Identifier
hi link drakeMethodSignature Identifier
hi link drakeMethodBraces SpecialComment
let b:current_syntax = 'drake'

View File

@ -0,0 +1,6 @@
# Ignore Vim tag files
tags
# Ignore Vim swap files
.*.swp
.*.swo

View 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

View File

@ -0,0 +1,5 @@
source 'https://rubygems.org'
gem 'vimrunner', '0.3.0'
gem 'rake', '10.0.4'
gem 'rspec', '~> 2.13.0'

View 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

View 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.

View 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
*/

View File

@ -0,0 +1,6 @@
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new
task :test => :spec
task :default => :spec

View 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

View 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:

View 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/

View 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:

View 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

View 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:

View 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^
}
}

View 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

View 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.

View 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:

View 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
}

View 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:

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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:

View 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
}