Overview
Comment: | Partially import github.com/keith/swift.vim |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
00ec87204a3224f66ac957b37660dd2a |
User & Date: | js 2020-02-27 20:57:57 |
Context
2020-02-27
| ||
20:59 | Import missing ftplugin/fish.vim check-in: 99f7e3472e user: js tags: trunk | |
20:57 | Partially import github.com/keith/swift.vim check-in: 00ec87204a user: js tags: trunk | |
20:52 | vimrc: Fix runtimepath order check-in: 8483441fc2 user: js tags: trunk | |
Changes
Added vim/ftdetect/swift.vim.
> > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | autocmd BufNewFile,BufRead *.swift set filetype=swift autocmd BufRead * call s:Swift() function! s:Swift() if !empty(&filetype) return endif let line = getline(1) if line =~ "^#!.*swift" setfiletype swift endif endfunction |
Added vim/ftplugin/swift.vim.
> > > > | 1 2 3 4 | setlocal commentstring=//\ %s " @-@ adds the literal @ to iskeyword for @IBAction and similar setlocal iskeyword+=@-@,# setlocal completefunc=syntaxcomplete#Complete |
Added vim/indent/swift.vim.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | " File: swift.vim " Author: Keith Smiley " Description: The indent file for Swift " Last Modified: December 05, 2014 if exists("b:did_indent") finish endif let b:did_indent = 1 let s:cpo_save = &cpo set cpo&vim setlocal nosmartindent setlocal indentkeys-=e setlocal indentkeys+=0] setlocal indentexpr=SwiftIndent() function! s:NumberOfMatches(char, string, index) let instances = 0 let i = 0 while i < strlen(a:string) if a:string[i] == a:char && !s:IsExcludedFromIndentAtPosition(a:index, i + 1) let instances += 1 endif let i += 1 endwhile return instances endfunction function! s:SyntaxNameAtPosition(line, column) return synIDattr(synID(a:line, a:column, 0), "name") endfunction function! s:SyntaxName() return s:SyntaxNameAtPosition(line("."), col(".")) endfunction function! s:IsExcludedFromIndentAtPosition(line, column) let name = s:SyntaxNameAtPosition(a:line, a:column) return s:IsSyntaxNameExcludedFromIndent(name) endfunction function! s:IsExcludedFromIndent() return s:IsSyntaxNameExcludedFromIndent(s:SyntaxName()) endfunction function! s:IsSyntaxNameExcludedFromIndent(name) return a:name ==# "swiftComment" || a:name ==# "swiftString" || a:name ==# "swiftInterpolatedWrapper" || a:name ==# "swiftMultilineInterpolatedWrapper" || a:name ==# "swiftMultilineString" endfunction function! s:IsCommentLine(lnum) return synIDattr(synID(a:lnum, \ match(getline(a:lnum), "\\S") + 1, 0), "name") \ ==# "swiftComment" endfunction function! SwiftIndent(...) let clnum = a:0 ? a:1 : v:lnum let line = getline(clnum) let previousNum = prevnonblank(clnum - 1) while s:IsCommentLine(previousNum) != 0 let previousNum = prevnonblank(previousNum - 1) endwhile let previous = getline(previousNum) let cindent = cindent(clnum) let previousIndent = indent(previousNum) let numOpenParens = s:NumberOfMatches("(", previous, previousNum) let numCloseParens = s:NumberOfMatches(")", previous, previousNum) let numOpenBrackets = s:NumberOfMatches("{", previous, previousNum) let numCloseBrackets = s:NumberOfMatches("}", previous, previousNum) let currentOpenBrackets = s:NumberOfMatches("{", line, clnum) let currentCloseBrackets = s:NumberOfMatches("}", line, clnum) let numOpenSquare = s:NumberOfMatches("[", previous, previousNum) let numCloseSquare = s:NumberOfMatches("]", previous, previousNum) let currentCloseSquare = s:NumberOfMatches("]", line, clnum) if numOpenSquare > numCloseSquare && currentCloseSquare < 1 return previousIndent + shiftwidth() endif if currentCloseSquare > 0 && line !~ '\v\[.*\]' let column = col(".") call cursor(line("."), 1) let openingSquare = searchpair("\\[", "", "\\]", "bWn", "s:IsExcludedFromIndent()") call cursor(line("."), column) if openingSquare == 0 return -1 endif " - Line starts with closing square, indent as opening square if line =~ '\v^\s*]' return indent(openingSquare) endif " - Line contains closing square and more, indent a level above opening return indent(openingSquare) + shiftwidth() endif if line =~ ":$" && (line =~ '^\s*case\W' || line =~ '^\s*default\W') let switch = search("switch", "bWn") return indent(switch) elseif previous =~ ":$" && (previous =~ '^\s*case\W' || previous =~ '^\s*default\W') return previousIndent + shiftwidth() endif if numOpenParens == numCloseParens if numOpenBrackets > numCloseBrackets if currentCloseBrackets > currentOpenBrackets || line =~ "\\v^\\s*}" let column = col(".") call cursor(line("."), 1) let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") call cursor(line("."), column) if openingBracket == 0 return -1 else return indent(openingBracket) endif endif return previousIndent + shiftwidth() elseif previous =~ "}.*{" if line =~ "\\v^\\s*}" return previousIndent endif return previousIndent + shiftwidth() elseif line =~ "}.*{" let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") let bracketLine = getline(openingBracket) let numOpenParensBracketLine = s:NumberOfMatches("(", bracketLine, openingBracket) let numCloseParensBracketLine = s:NumberOfMatches(")", bracketLine, openingBracket) if numOpenParensBracketLine > numCloseParensBracketLine let line = line(".") let column = col(".") call cursor(openingParen, column) let openingParenCol = searchpairpos("(", "", ")", "bWn", "s:IsExcludedFromIndent()")[1] call cursor(line, column) return openingParenCol endif return indent(openingBracket) elseif currentCloseBrackets > currentOpenBrackets let column = col(".") let line = line(".") call cursor(line, 1) let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") call cursor(line, column) let bracketLine = getline(openingBracket) let numOpenParensBracketLine = s:NumberOfMatches("(", bracketLine, openingBracket) let numCloseParensBracketLine = s:NumberOfMatches(")", bracketLine, openingBracket) if numCloseParensBracketLine > numOpenParensBracketLine let line = line(".") let column = col(".") call cursor(openingParen, column) let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") call cursor(line, column) return indent(openingParen) elseif numOpenParensBracketLine > numCloseParensBracketLine let line = line(".") let column = col(".") call cursor(openingParen, column) let openingParenCol = searchpairpos("(", "", ")", "bWn", "s:IsExcludedFromIndent()")[1] call cursor(line, column) return openingParenCol endif return indent(openingBracket) elseif line =~ '^\s*)$' let line = line(".") let column = col(".") call cursor(line, 1) let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") call cursor(line, column) return indent(openingParen) else " - Current line is blank, and the user presses 'o' return previousIndent endif endif if numCloseParens > 0 if currentOpenBrackets > 0 || currentCloseBrackets > 0 if currentOpenBrackets > 0 if numOpenBrackets > numCloseBrackets return previousIndent + shiftwidth() endif if line =~ "}.*{" let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") return indent(openingBracket) endif if numCloseParens > numOpenParens let line = line(".") let column = col(".") call cursor(line - 1, column) let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") call cursor(line, column) return indent(openingParen) endif return previousIndent endif if currentCloseBrackets > 0 let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") return indent(openingBracket) endif return cindent endif if numCloseParens < numOpenParens if numOpenBrackets > numCloseBrackets return previousIndent + shiftwidth() endif let previousParen = match(previous, '\v\($') if previousParen != -1 return previousIndent + shiftwidth() endif let line = line(".") let column = col(".") call cursor(previousNum, col([previousNum, "$"])) let previousParen = searchpairpos("(", "", ")", "cbWn", "s:IsExcludedFromIndent()") call cursor(line, column) " Match the last non escaped paren on the previous line return previousParen[1] endif if numOpenBrackets > numCloseBrackets let line = line(".") let column = col(".") call cursor(previousNum, column) let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") call cursor(line, column) return openingParen + 1 endif " - Previous line has close then open braces, indent previous + 1 'sw' if previous =~ "}.*{" return previousIndent + shiftwidth() endif let line = line(".") let column = col(".") call cursor(previousNum, column) let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") call cursor(line, column) return indent(openingParen) endif " - Line above has (unmatched) open paren, next line needs indent if numOpenParens > 0 let savePosition = getcurpos() let lastColumnOfPreviousLine = col([previousNum, "$"]) - 1 " Must be at EOL because open paren has to be above (left of) the cursor call cursor(previousNum, lastColumnOfPreviousLine) let previousParen = searchpairpos("(", "", ")", "cbWn", "s:IsExcludedFromIndent()")[1] " If the paren on the last line is the last character, indent the contents " at shiftwidth + previous indent if previousParen == lastColumnOfPreviousLine return previousIndent + shiftwidth() endif " The previous line opens a closure and doesn't close it if numOpenBrackets > numCloseBrackets return previousParen + shiftwidth() endif call setpos(".", savePosition) return previousParen endif return cindent endfunction let &cpo = s:cpo_save unlet s:cpo_save |
Added vim/syntax/swift.vim.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 | " File: swift.vim " Author: Keith Smiley " Description: Runtime files for Swift if exists("b:current_syntax") finish endif " Comments " Shebang syntax match swiftShebang "\v#!.*$" " Comment contained keywords syntax keyword swiftTodos contained TODO XXX FIXME NOTE syntax keyword swiftMarker contained MARK " In comment identifiers function! s:CommentKeywordMatch(keyword) execute "syntax match swiftDocString \"\\v^\\s*-\\s*". a:keyword . "\\W\"hs=s+1,he=e-1 contained" endfunction syntax case ignore call s:CommentKeywordMatch("attention") call s:CommentKeywordMatch("author") call s:CommentKeywordMatch("authors") call s:CommentKeywordMatch("bug") call s:CommentKeywordMatch("complexity") call s:CommentKeywordMatch("copyright") call s:CommentKeywordMatch("date") call s:CommentKeywordMatch("experiment") call s:CommentKeywordMatch("important") call s:CommentKeywordMatch("invariant") call s:CommentKeywordMatch("note") call s:CommentKeywordMatch("parameter") call s:CommentKeywordMatch("postcondition") call s:CommentKeywordMatch("precondition") call s:CommentKeywordMatch("remark") call s:CommentKeywordMatch("remarks") call s:CommentKeywordMatch("requires") call s:CommentKeywordMatch("returns") call s:CommentKeywordMatch("see") call s:CommentKeywordMatch("since") call s:CommentKeywordMatch("throws") call s:CommentKeywordMatch("todo") call s:CommentKeywordMatch("version") call s:CommentKeywordMatch("warning") syntax case match delfunction s:CommentKeywordMatch " Literals " Strings syntax region swiftString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=swiftInterpolatedWrapper oneline syntax region swiftMultilineString start=/"""/ end=/"""/ contains=swiftMultilineInterpolatedWrapper syntax region swiftMultilineInterpolatedWrapper start='\v\zs\\\(\s*' end='\v\s*\)' contained containedin=swiftMultilineString contains=swiftInterpolatedString oneline syntax region swiftInterpolatedWrapper start='\v(^|[^\\])\zs\\\(\s*' end='\v\s*\)' contained containedin=swiftString contains=swiftInterpolatedString,swiftString oneline syntax match swiftInterpolatedString "\v\w+(\(\))?" contained containedin=swiftInterpolatedWrapper,swiftMultilineInterpolatedWrapper oneline " Numbers syntax match swiftNumber "\v<\d+>" syntax match swiftNumber "\v<(\d+_+)+\d+(\.\d+(_+\d+)*)?>" syntax match swiftNumber "\v<\d+\.\d+>" syntax match swiftNumber "\v<\d*\.?\d+([Ee]-?)?\d+>" syntax match swiftNumber "\v<0x[[:xdigit:]_]+([Pp]-?)?\x+>" syntax match swiftNumber "\v<0b[01_]+>" syntax match swiftNumber "\v<0o[0-7_]+>" " BOOLs syntax keyword swiftBoolean \ true \ false " Operators syntax match swiftOperator "\v\~" syntax match swiftOperator "\v\s+!" syntax match swiftOperator "\v\%" syntax match swiftOperator "\v\^" syntax match swiftOperator "\v\&" syntax match swiftOperator "\v\*" syntax match swiftOperator "\v-" syntax match swiftOperator "\v\+" syntax match swiftOperator "\v\=" syntax match swiftOperator "\v\|" syntax match swiftOperator "\v\/" syntax match swiftOperator "\v\<" syntax match swiftOperator "\v\>" syntax match swiftOperator "\v\?\?" " Methods/Functions/Properties syntax match swiftMethod "\.\@<=\<\D\w*\>\ze(" syntax match swiftProperty "\.\@<=\<\D\w*\>(\@!" " Swift closure arguments syntax match swiftClosureArgument "\$\d\+\(\.\d\+\)\?" syntax match swiftAvailability "\v((\*(\s*,\s*[a-zA-Z="0-9.]+)*)|(\w+\s+\d+(\.\d+(.\d+)?)?\s*,\s*)+\*)" contains=swiftString syntax keyword swiftPlatforms OSX iOS watchOS OSXApplicationExtension iOSApplicationExtension contained containedin=swiftAvailability syntax keyword swiftAvailabilityArg renamed unavailable introduced deprecated obsoleted message contained containedin=swiftAvailability " Keywords {{{ syntax keyword swiftKeywords \ associatedtype \ associativity \ atexit \ break \ case \ catch \ class \ continue \ convenience \ default \ defer \ deinit \ didSet \ do \ dynamic \ else \ extension \ fallthrough \ fileprivate \ final \ for \ func \ get \ guard \ if \ import \ in \ infix \ init \ inout \ internal \ lazy \ let \ mutating \ nil \ nonmutating \ open \ operator \ optional \ override \ postfix \ precedence \ precedencegroup \ prefix \ private \ protocol \ public \ repeat \ required \ return \ self \ set \ some \ static \ subscript \ super \ switch \ throw \ try \ typealias \ unowned \ var \ weak \ where \ while \ willSet syntax keyword swiftDefinitionModifier \ rethrows \ throws syntax match swiftMultiwordKeywords "indirect case" syntax match swiftMultiwordKeywords "indirect enum" " }}} " Names surrounded by backticks. This aren't limited to keywords because 1) " Swift doesn't limit them to keywords and 2) I couldn't make the keywords not " highlight at the same time syntax region swiftEscapedReservedWord start="`" end="`" oneline syntax keyword swiftAttributes \ @_exported \ @_functionBuilder \ @_implementationOnly \ @_silgen_name \ @assignment \ @autoclosure \ @available \ @convention \ @discardableResult \ @escaping \ @exported \ @frozen \ @IBAction \ @IBDesignable \ @IBInspectable \ @IBOutlet \ @inlinable \ @noescape \ @nonobjc \ @noreturn \ @NSApplicationMain \ @NSCopying \ @NSManaged \ @objc \ @propertyWrapper \ @testable \ @UIApplicationMain \ @usableFromInline \ @warn_unused_result syntax keyword swiftConditionStatement #available syntax keyword swiftStructure \ struct \ enum syntax keyword swiftDebugIdentifier \ #column \ #file \ #function \ #line \ __COLUMN__ \ __FILE__ \ __FUNCTION__ \ __LINE__ syntax keyword swiftLineDirective #setline syntax region swiftTypeWrapper start=":\s*\(\.\)\@!\<\u" skip="\s*,\s*$*\s*" end="$\|/"me=e-1 contains=ALLBUT,swiftInterpolatedWrapper,swiftMultilineInterpolatedWrapper transparent syntax region swiftTypeCastWrapper start="\(as\|is\)\(!\|?\)\=\s\+" end="\v(\s|$|\{)" contains=swiftType,swiftCastKeyword keepend transparent oneline syntax region swiftGenericsWrapper start="\v\<" end="\v\>" contains=swiftType transparent oneline syntax region swiftLiteralWrapper start="\v\=\s*" skip="\v[^\[\]]\(\)" end="\v(\[\]|\(\))" contains=ALL transparent oneline syntax region swiftReturnWrapper start="\v-\>\s*" end="\v(\{|$)" contains=swiftType transparent oneline syntax match swiftType "\v<\u\w*" contained containedin=swiftTypeWrapper,swiftLiteralWrapper,swiftGenericsWrapper,swiftTypeCastWrapper syntax match swiftTypeDeclaration /->/ skipwhite nextgroup=swiftType syntax keyword swiftImports import syntax keyword swiftCastKeyword is as contained " 'preprocesor' stuff syntax keyword swiftPreprocessor \ #if \ #elseif \ #else \ #endif \ #selector \ #warning \ #error " Comment patterns syntax match swiftComment "\v\/\/.*$" \ contains=swiftTodos,swiftDocString,swiftMarker,@Spell oneline syntax region swiftComment start="/\*" end="\*/" \ contains=swiftTodos,swiftDocString,swiftMarker,@Spell fold " Set highlights highlight default link swiftTodos Todo highlight default link swiftDocString String highlight default link swiftShebang Comment highlight default link swiftComment Comment highlight default link swiftMarker Comment highlight default link swiftString String highlight default link swiftMultilineString String highlight default link swiftInterpolatedWrapper Delimiter highlight default link swiftMultilineInterpolatedWrapper Delimiter highlight default link swiftTypeDeclaration Delimiter highlight default link swiftNumber Number highlight default link swiftBoolean Boolean highlight default link swiftOperator Operator highlight default link swiftCastKeyword Keyword highlight default link swiftKeywords Keyword highlight default link swiftMultiwordKeywords Keyword highlight default link swiftEscapedReservedWord Normal highlight default link swiftClosureArgument Operator highlight default link swiftAttributes PreProc highlight default link swiftConditionStatement PreProc highlight default link swiftStructure Structure highlight default link swiftType Type highlight default link swiftImports Include highlight default link swiftPreprocessor PreProc highlight default link swiftMethod Function highlight default link swiftProperty Identifier highlight default link swiftDefinitionModifier Define highlight default link swiftConditionStatement PreProc highlight default link swiftAvailability Normal highlight default link swiftAvailabilityArg Normal highlight default link swiftPlatforms Keyword highlight default link swiftDebugIdentifier PreProc highlight default link swiftLineDirective PreProc " Force vim to sync at least x lines. This solves the multiline comment not " being highlighted issue syn sync minlines=100 let b:current_syntax = "swift" |