patch 9.1.0593: filetype: Asymptote files are not recognized

Problem:  filetype: Asymptote files are not recognized
Solution: detect '*.asy' files as asy filetype, include
          ftplugin and syntax plugin (AvidSeeker).

Reference: https://asymptote.sourceforge.io/

closes: #15252

Signed-off-by: AvidSeeker <avidseeker7@protonmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/syntax/asy.vim b/runtime/syntax/asy.vim
new file mode 100644
index 0000000..ed2bf71
--- /dev/null
+++ b/runtime/syntax/asy.vim
@@ -0,0 +1,243 @@
+" Vim syntax file
+" Language:     Asymptote
+" Maintainer:   Avid Seeker <avidseeker7@protonmail.com>
+"               Andy Hammerlindl
+" Last Change:  2022 Jan 05
+
+" Hacked together from Bram Moolenaar's C syntax file, and Claudio Fleiner's
+" Java syntax file.
+
+if exists("b:current_syntax")
+  finish
+endif
+
+" useful C/C++/Java keywords
+syn keyword     asyStatement     break return continue unravel
+syn keyword     asyConditional   if else
+syn keyword     asyRepeat        while for do
+syn keyword     asyExternal      access from import include
+syn keyword     asyOperator      new operator
+
+" basic asymptote keywords
+syn keyword     asyConstant      VERSION
+syn keyword     asyConstant      true false default infinity inf nan
+syn keyword     asyConstant      null nullframe nullpath nullpen
+syn keyword     asyConstant      intMin intMax realMin realMax
+syn keyword     asyConstant      realEpsilon realDigits
+syn keyword     asyPathSpec      and cycle controls tension atleast curl
+syn keyword     asyStorageClass  static public restricted private explicit
+syn keyword     asyStructure     struct typedef
+syn keyword     asyType          void bool bool3 int real string file
+syn keyword     asyType          pair triple transform guide path pen frame
+syn keyword     asyType          picture
+
+" module specific keywords
+if exists("asy_syn_plain")
+  syn keyword   asyConstant      currentpicture currentpen defaultpen
+  syn keyword   asyConstant      inch inches cm mm bp pt up down right left
+  syn keyword   asyConstant      E NE N NW W SW S SE
+  syn keyword   asyConstant      ENE NNE NNW WNW WSW SSW SSE ESE
+  syn keyword   asyConstant      I pi twopi
+  syn keyword   asyConstant      CCW CW
+  syn keyword   asyConstant      undefined sqrtEpsilon Align mantissaBits
+  syn keyword   asyConstant      identity zeroTransform invert
+  syn keyword   asyConstant      stdin stdout
+  syn keyword   asyConstant      unitsquare unitcircle circleprecision
+  syn keyword   asyConstant      solid dotted Dotted dashed dashdotted
+  syn keyword   asyConstant      longdashed longdashdotted
+  syn keyword   asyConstant      squarecap roundcap extendcap
+  syn keyword   asyConstant      miterjoin roundjoin beveljoin
+  syn keyword   asyConstant      zerowinding evenodd basealign nobasealign
+  syn keyword   asyConstant      black white gray red green blue Cyan Magenta
+  syn keyword   asyConstant      Yellow Black cyan magenta yellow palered
+  syn keyword   asyConstant      palegreen paleblue palecyan palemagenta
+  syn keyword   asyConstant      paleyellow palegray lightred lightgreen
+  syn keyword   asyConstant      lightblue lightcyan lightmagenta lightyellow
+  syn keyword   asyConstant      lightgray mediumred mediumgreen mediumblue
+  syn keyword   asyConstant      mediumcyan mediummagenta mediumyellow
+  syn keyword   asyConstant      mediumgray heavyred heavygreen heavyblue
+  syn keyword   asyConstant      heavycyan heavymagenta lightolive heavygray
+  syn keyword   asyConstant      deepred deepgreen deepblue deepcyan
+  syn keyword   asyConstant      deepmagenta deepyellow deepgray darkred
+  syn keyword   asyConstant      darkgreen darkblue darkcyan darkmagenta
+  syn keyword   asyConstant      darkolive darkgray orange fuchsia chartreuse
+  syn keyword   asyConstant      springgreen purple royalblue salmon brown
+  syn keyword   asyConstant      olive darkbrown pink palegrey lightgrey
+  syn keyword   asyConstant      mediumgrey grey heavygrey deepgrey darkgrey
+
+  if exists("asy_syn_texcolors")
+    syn keyword asyConstant      GreenYellow Yellow Goldenrod Dandelion
+    syn keyword asyConstant      Apricot Peach Melon YellowOrange Orange
+    syn keyword asyConstant      BurntOrange Bittersweet RedOrange Mahogany
+    syn keyword asyConstant      Maroon BrickRed Red OrangeRed RubineRed
+    syn keyword asyConstant      WildStrawberry Salmon CarnationPink Magenta
+    syn keyword asyConstant      VioletRed Rhodamine Mulberry RedViolet
+    syn keyword asyConstant      Fuchsia Lavender Thistle Orchid DarkOrchid
+    syn keyword asyConstant      Purple Plum Violet RoyalPurple BlueViolet
+    syn keyword asyConstant      Periwinkle CadetBlue CornflowerBlue
+    syn keyword asyConstant      MidnightBlue NavyBlue RoyalBlue Blue
+    syn keyword asyConstant      Cerulean Cyan ProcessBlue SkyBlue Turquoise
+    syn keyword asyConstant      TealBlue Aquamarine BlueGreen Emerald
+    syn keyword asyConstant      JungleGreen SeaGreen Green ForestGreen
+    syn keyword asyConstant      PineGreen LimeGreen YellowGreen SpringGreen
+    syn keyword asyConstant      OliveGreen RawSienna Sepia Brown Tan Gray
+    syn keyword asyConstant      Black White
+  endif
+
+  if exists("asy_syn_x11colors")
+    syn keyword asyConstant      AliceBlue AntiqueWhite Aqua Aquamarine Azure
+    syn keyword asyConstant      Beige Bisque Black BlanchedAlmond Blue
+    syn keyword asyConstant      BlueViolet Brown BurlyWood CadetBlue
+    syn keyword asyConstant      Chartreuse Chocolate Coral CornflowerBlue
+    syn keyword asyConstant      Cornsilk Crimson Cyan DarkBlue DarkCyan
+    syn keyword asyConstant      DarkGoldenrod DarkGray DarkGreen DarkKhaki
+    syn keyword asyConstant      DarkMagenta DarkOliveGreen DarkOrange
+    syn keyword asyConstant      DarkOrchid DarkRed DarkSalmon DarkSeaGreen
+    syn keyword asyConstant      DarkSlateBlue DarkSlateGray DarkTurquoise
+    syn keyword asyConstant      DarkViolet DeepPink DeepSkyBlue DimGray
+    syn keyword asyConstant      DodgerBlue FireBrick FloralWhite ForestGreen
+    syn keyword asyConstant      Fuchsia Gainsboro GhostWhite Gold Goldenrod
+    syn keyword asyConstant      Gray Green GreenYellow Honeydew HotPink
+    syn keyword asyConstant      IndianRed Indigo Ivory Khaki Lavender
+    syn keyword asyConstant      LavenderBlush LawnGreen LemonChiffon
+    syn keyword asyConstant      LightBlue LightCoral LightCyan
+    syn keyword asyConstant      LightGoldenrodYellow LightGreen LightGrey
+    syn keyword asyConstant      LightPink LightSalmon LightSeaGreen
+    syn keyword asyConstant      LightSkyBlue LightSlateGray LightSteelBlue
+    syn keyword asyConstant      LightYellow Lime LimeGreen Linen Magenta
+    syn keyword asyConstant      Maroon MediumAquamarine MediumBlue
+    syn keyword asyConstant      MediumOrchid MediumPurple MediumSeaGreen
+    syn keyword asyConstant      MediumSlateBlue MediumSpringGreen
+    syn keyword asyConstant      MediumTurquoise MediumVioletRed MidnightBlue
+    syn keyword asyConstant      MintCream MistyRose Moccasin NavajoWhite
+    syn keyword asyConstant      Navy OldLace Olive OliveDrab Orange
+    syn keyword asyConstant      OrangeRed Orchid PaleGoldenrod PaleGreen
+    syn keyword asyConstant      PaleTurquoise PaleVioletRed PapayaWhip
+    syn keyword asyConstant      PeachPuff Peru Pink Plum PowderBlue Purple
+    syn keyword asyConstant      Red RosyBrown RoyalBlue SaddleBrown Salmon
+    syn keyword asyConstant      SandyBrown SeaGreen Seashell Sienna Silver
+    syn keyword asyConstant      SkyBlue SlateBlue SlateGray Snow SpringGreen
+    syn keyword asyConstant      SteelBlue Tan Teal Thistle Tomato Turquoise
+    syn keyword asyConstant      Violet Wheat White WhiteSmoke Yellow
+    syn keyword asyConstant      YellowGreen
+  endif
+
+  if exists("asy_syn_three")
+    syn keyword asyType          path3 guide3 transform3
+    syn keyword asyType          projection light material patch surface tube
+    syn keyword asyConstant      currentprojection currentlight defaultrender
+    syn keyword asyConstant      identity4 O X Y Z
+    syn keyword asyConstant      nolight nullpens
+    syn keyword asyConstant      unitsphere unithemisphere unitplane octant1
+    syn keyword asyConstant      unitcone unitsolidcone unitcube unitcylinder
+    syn keyword asyConstant      unitdisk unittube
+  endif
+endif
+
+
+" string constants
+syn region asyCString start=+'+ end=+'+ skip=+\\\\\|\\'+ contains=asyCSpecial
+syn match  asyCSpecial display contained +\\\(['"?\\abfnrtv]\|\o\{1,3}\)+
+syn match  asyCSpecial display contained +\\\(x[0-9A-F]\{1,2\}\|$\)+
+" double quoted strings only special character is \"
+syn region asyString   start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=asySpecial
+syn match  asySpecial  display contained +\(\\\)\@1<!\(\\\\\)*\zs\\"+
+
+
+" number constants
+syn match  asyNumbers     display transparent "\<\d\|\.\d"
+                        \ contains=asyNumber,asyNumberError
+syn match  asyNumber      display contained "\d*\.\=\d*\(e[-+]\=\d\+\)\="
+" highlight number constants with two '.' or with '.' after an 'e'
+syn match  asyNumberError display contained "\d*\.\(\d\|e[-+]\=\)*\.[0-9.]*"
+syn match  asyNumberError display contained "\d*e[-+]\=\d*\.[0-9.]*"
+syn match  asyNumberError display contained "\d*e[-+]\=\(e[-+]\=\)*\.[0-9.]*"
+
+
+" comments and comment strings
+syn keyword  asyTodo            contained TODO FIXME XXX
+syn sync     ccomment           asyComment minlines=15
+if exists("asy_comment_strings")
+  " A comment can contain asyString, asyCString, and asyNumber. But a "*/"
+  " inside a asy*String in a asyComment DOES end the comment!  So we need to
+  " use a special type of asy*String: asyComment*String, which also ends on
+  " "*/", and sees a "*" at the start of the line as comment again.
+  " Unfortunately this doesn't very well work for // type of comments :-(
+  syn match  asyCommentSkip     contained "^\s*\*\($\|\s\+\)"
+  syn region asyCommentString   contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+                              \ end=+\*/+me=s-1
+                              \ contains=asySpecial,asyCommentSkip
+  syn region asyCommentCString  contained start=+'+ skip=+\\\\\|\\'+ end=+'+
+                              \ end=+\*/+me=s-1
+                              \ contains=asyCSpecial,asyCommentSkip
+  syn region asyCommentLString  contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+                              \ end="$" contains=asySpecial
+  syn region asyCommentLCString contained start=+'+ skip=+\\\\\|\\'+ end=+'+
+                              \ end="$" contains=asyCSpecial
+  syn region asyCommentL        start="//" skip="\\$" end="$" keepend
+                              \ contains=asyTodo,asyCommentLString,
+                              \ asyCommentLCString,asyNumbers
+  syn region asyComment         matchgroup=asyComment start="/\*" end="\*/"
+                              \ contains=asyTodo,asyCommentStartError,
+                              \ asyCommentString,asyCommentCString,asyNumbers
+else
+  syn region asyCommentL        start="//" skip="\\$" end="$" keepend
+                              \ contains=asyTodo
+  syn region asyComment         matchgroup=asyComment start="/\*" end="\*/"
+                              \ contains=asyTodo,asyCommentStartError
+endif
+
+" highlight common errors when starting/ending C comments
+syn match    asyCommentError      display "\*/"
+syn match    asyCommentStartError display "/\*"me=e-1 contained
+
+
+" delimiter matching errors
+syn region asyCurly      transparent start='{'  end='}'
+                       \ contains=TOP,asyCurlyError
+syn region asyBrack      transparent start='\[' end='\]' matchgroup=asyError
+                       \ end=';' contains=TOP,asyBrackError
+syn region asyParen      transparent start='('  end=')'  matchgroup=asyError
+                       \ end=';' contains=TOP,asyParenError
+syn match  asyCurlyError display '}'
+syn match  asyBrackError display '\]'
+syn match  asyParenError display ')'
+" for (;;) constructs are exceptions that allow ; inside parenthesis
+syn region asyParen      transparent matchgroup=asyParen
+                       \ start='\(for\s*\)\@<=(' end=')'
+                       \ contains=TOP,asyParenError
+
+" Define the default highlighting.
+hi def link asyCommentL             asyComment
+hi def link asyConditional          Conditional
+hi def link asyRepeat               Repeat
+hi def link asyNumber               Number
+hi def link asyNumberError          asyError
+hi def link asyCurlyError           asyError
+hi def link asyBracketError         asyError
+hi def link asyParenError           asyError
+hi def link asyCommentError         asyError
+hi def link asyCommentStartError    asyError
+hi def link asyOperator             Operator
+hi def link asyStructure            Structure
+hi def link asyStorageClass         StorageClass
+hi def link asyExternal             Include
+hi def link asyDefine               Macro
+hi def link asyError                Error
+hi def link asyStatement            Statement
+hi def link asyType                 Type
+hi def link asyConstant             Constant
+hi def link asyCommentString        asyString
+hi def link asyCommentCString       asyString
+hi def link asyCommentLString       asyString
+hi def link asyCommentLCString      asyString
+hi def link asyCommentSkip          asyComment
+hi def link asyString               String
+hi def link asyCString              String
+hi def link asyComment              Comment
+hi def link asySpecial              SpecialChar
+hi def link asyCSpecial             SpecialChar
+hi def link asyTodo                 Todo
+hi def link asyPathSpec             Statement
+
+let b:current_syntax = "asy"