patch 9.2.1128: filetype: icalendar files are not recognized
Commit:
https://github.com/vim/vim/commit/7c049d5ce1d6bc119abf9749ca5cad74225ca83e
Author: Anakin Childerhose <
ana...@childerhose.ca>
Date: Thu Sep 24 19:03:25 2026 +0000
patch 9.2.1128: filetype: icalendar files are not recognized
Problem: filetype: icalendar files are not recognized
Solution: Detect *.ics files as icalendar filetype, include
syntax and filetype plugins (Anakin Childerhose).
Reference:
https://datatracker.ietf.org/doc/html/rfc5545
closes: #21356
Assisted-By: Claude Opus 5
Signed-off-by: Anakin Childerhose <
ana...@childerhose.ca>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS
index bf008dbdc..77149f82f 100644
--- a/.github/MAINTAINERS
+++ b/.github/MAINTAINERS
@@ -230,6 +230,7 @@ runtime/ftplugin/html.vim @dkearns
runtime/ftplugin/http.vim @ribru17
runtime/ftplugin/hyprlang.vim @ribru17
runtime/ftplugin/i3config.vim @hiqua
+runtime/ftplugin/icalendar.vim @anakin4747
runtime/ftplugin/icon.vim @dkearns
runtime/ftplugin/indent.vim @dkearns
runtime/ftplugin/ishd.vim @dkearns
@@ -602,6 +603,7 @@ runtime/syntax/hollywood.vim @sodero
runtime/syntax/html.vim @dkearns
runtime/syntax/htmlangular.vim @dlvandenberg
runtime/syntax/i3config.vim @hiqua
+runtime/syntax/icalendar.vim @anakin4747
runtime/syntax/icon.vim @dkearns
runtime/syntax/indent.vim @dkearns
runtime/syntax/j.vim @glts
diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim
index dbde4d40f..e9fa85f8d 100644
--- a/runtime/autoload/dist/ft.vim
+++ b/runtime/autoload/dist/ft.vim
@@ -3,7 +3,7 @@ vim9script
# Vim functions for file type detection
#
# Maintainer: The Vim Project <
https://github.com/vim/vim>
-# Last Change: 2026 Sep 02
+# Last Change: 2026 Sep 24
# Former Maintainer: Bram Moolenaar <
Br...@vim.org>
# These functions are moved here from runtime/filetype.vim to make startup
@@ -2274,6 +2274,8 @@ const ft_from_ext = {
# Httest
"htt": "httest",
"htb": "httest",
+ # ICalendar
+ "ics": "icalendar",
# Icon
"icn": "icon",
# Microsoft IDL (Interface Description Language) Also *.idl
diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt
index 8437531a8..9c6016554 100644
--- a/runtime/doc/filetype.txt
+++ b/runtime/doc/filetype.txt
@@ -1,4 +1,4 @@
-*filetype.txt* For Vim version 9.2. Last change: 2026 Aug 08
+*filetype.txt* For Vim version 9.2. Last change: 2026 Sep 24
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -799,6 +799,15 @@ To force another recomputation, do: >
[0]
https://html.spec.whatwg.org/multipage/syntax.html#optional-tags
[1]
https://en.wikipedia.org/wiki/Dangling_else
+ICALENDAR *ft-icalendar-plugin* *g:icalendar_folding*
+
+You can enable folding of iCalendar components (BEGIN: and END: pairs)
+using |fold-expr| by: >
+
+ let g:icalendar_folding = 1
+<
+Nested components, such as a VALARM inside a VEVENT, produce nested folds.
+
IDRIS2 *ft-idris2-plugin*
By default the following options are set: >
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 493412810..01d131c6f 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -2084,6 +2084,21 @@ To have *.inc files be recognized as IA64, add this to your .vimrc file: >
:let g:filetype_inc = "ia64"
+
+ICALENDAR *icalendar.vim* *ft-icalendar-syntax*
+
+Highlighting for iCalendar files (RFC 5545), as used by calendaring
+applications with an ".ics" extension.
+
+Component boundaries (BEGIN: and END:), property names, property
+parameters and recurrence rule parts are highlighted separately. A content
+line may be split across several lines by inserting a line break followed
+by a space or a tab; such folded lines are highlighted as a single logical
+line.
+
+Folding of components is provided by the filetype plugin and is off by
+default; see |ft-icalendar-plugin|.
+
INFORM *inform.vim* *ft-inform-syntax*
Inform highlighting includes symbols provided by the Inform Library, as
diff --git a/runtime/doc/tags b/runtime/doc/tags
index a3c7f7458..28bfab4f3 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -7623,6 +7623,8 @@ ft-html-plugin filetype.txt /*ft-html-plugin*
ft-html-syntax syntax.txt /*ft-html-syntax*
ft-htmlos-syntax syntax.txt /*ft-htmlos-syntax*
ft-ia64-syntax syntax.txt /*ft-ia64-syntax*
+ft-icalendar-plugin filetype.txt /*ft-icalendar-plugin*
+ft-icalendar-syntax syntax.txt /*ft-icalendar-syntax*
ft-idris2-indent indent.txt /*ft-idris2-indent*
ft-idris2-plugin filetype.txt /*ft-idris2-plugin*
ft-inform-syntax syntax.txt /*ft-inform-syntax*
@@ -7905,6 +7907,7 @@ g:html_use_encoding syntax.txt /*g:html_use_encoding*
g:html_use_input_for_pc syntax.txt /*g:html_use_input_for_pc*
g:html_use_xhtml syntax.txt /*g:html_use_xhtml*
g:html_whole_filler syntax.txt /*g:html_whole_filler*
+g:icalendar_folding filetype.txt /*g:icalendar_folding*
g:lf_shell_syntax syntax.txt /*g:lf_shell_syntax*
g:lua_folding filetype.txt /*g:lua_folding*
g:lua_subversion filetype.txt /*g:lua_subversion*
@@ -8684,6 +8687,7 @@ i_esc intro.txt /*i_esc*
i` motion.txt /*i`*
ia64.vim syntax.txt /*ia64.vim*
ib motion.txt /*ib*
+icalendar.vim syntax.txt /*icalendar.vim*
iccf uganda.txt /*iccf*
icon-changed version4.txt /*icon-changed*
iconise starting.txt /*iconise*
diff --git a/runtime/ftplugin/icalendar.vim b/runtime/ftplugin/icalendar.vim
new file mode 100644
index 000000000..71783cdf2
--- /dev/null
+++ b/runtime/ftplugin/icalendar.vim
@@ -0,0 +1,53 @@
+" Vim filetype plugin file
+" Language: iCalendar
+" Maintainer: Anakin Childerhose <
ana...@childerhose.ca>
+" Latest Change: 2026 Sept 22
+" License: Vim (see :h license)
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = ''
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists('g:loaded_matchit') && !exists('b:match_words')
+ let b:match_words = '\<BEGIN\:.*\>:\<END\:.*\>'
+ let b:undo_ftplugin ..= '| unlet! b:match_words'
+endif
+
+function s:icalendarComponentFold() abort
+ if get(b:, 'icalendar_fold_tick', -1) == b:changedtick
+ return get(b:icalendar_fold_levels, v:lnum - 1, '=')
+ endif
+
+ let levels = repeat(['='], line('$'))
+ let depth = 0
+ for match in matchbufline('%', '\C^\%(BEGIN\|END\):.*', 1, '$')
+ if match.text =~# '^BEGIN:'
+ let depth += 1
+ let levels[match.lnum - 1] = '>' .. depth
+ elseif match.text =~# '^END:' && depth > 0
+ let levels[match.lnum - 1] = '<' .. depth
+ let depth -= 1
+ endif
+ endfor
+
+ let b:icalendar_fold_levels = levels
+ let b:icalendar_fold_tick = b:changedtick
+ return get(levels, v:lnum - 1, '=')
+endfunction
+
+if has('folding') && exists('*matchbufline') && get(g:, 'icalendar_folding', 0)
+ setlocal foldexpr=s:icalendarComponentFold()
+ setlocal foldmethod=expr
+ let b:undo_ftplugin ..= '| setlocal foldexpr< foldmethod< | unlet! b:icalendar_fold_tick b:icalendar_fold_levels'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=2 sw=2
diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim
index 634a79d02..e97f95c7a 100644
--- a/runtime/makemenu.vim
+++ b/runtime/makemenu.vim
@@ -2,7 +2,7 @@ vim9script
# Script to define the syntax menu in synmenu.vim
# Maintainer: The Vim Project <
https://github.com/vim/vim>
-# Last Change: 2026 Aug 26
+# Last Change: 2026 Sep 24
# Former Maintainer: Bram Moolenaar <
Br...@vim.org>
# This is used by "make menu" in the src directory.
@@ -22,6 +22,7 @@ var cur_menu_item = 0
var cur_menu_char = ""
def Syn(arg: string)
+ # Arg: Menu.SubMenu:syntax
# isolate menu name: until the first dot
var i = match(arg, '\.')
var menu_name = strpart(arg, 0, i)
@@ -348,6 +349,7 @@ SynMenu HIJK.Hosts\ access:hostsaccess
SynMenu HIJK.Hyper\ Builder:hb
SynMenu HIJK.Hyprlang:hyprlang
SynMenu HIJK.I3Config:i3config
+SynMenu HIJK.Icalendar:icalendar
SynMenu HIJK.Icewm\ menu:icemenu
SynMenu HIJK.Icon:icon
SynMenu HIJK.IDL\Generic\ IDL:idl
diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim
index d18649a4f..adce70aa3 100644
--- a/runtime/synmenu.vim
+++ b/runtime/synmenu.vim
@@ -329,59 +329,60 @@ an 50.50.390 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess")<CR>
an 50.50.400 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb")<CR>
an 50.50.410 &Syntax.HIJK.Hyprlang :cal SetSyn("hyprlang")<CR>
an 50.50.430 &Syntax.HIJK.I3Config :cal SetSyn("i3config")<CR>
-an 50.50.440 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu")<CR>
-an 50.50.450 &Syntax.HIJK.Icon :cal SetSyn("icon")<CR>
-an 50.50.460 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl")<CR>
-an 50.50.470 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl")<CR>
-an 50.50.480 &Syntax.HIJK.Idris2 :cal SetSyn("idris2")<CR>
-an 50.50.490 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent")<CR>
-an 50.50.500 &Syntax.HIJK.Inform :cal SetSyn("inform")<CR>
-an 50.50.510 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl")<CR>
-an 50.50.520 &Syntax.HIJK.Initng :cal SetSyn("initng")<CR>
-an 50.50.530 &Syntax.HIJK.Inittab :cal SetSyn("inittab")<CR>
-an 50.50.540 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss")<CR>
-an 50.50.550 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat")<CR>
-an 50.50.560 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog")<CR>
-an 50.50.570 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt")<CR>
-an 50.50.580 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog")<CR>
-an 50.50.590 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog")<CR>
-an 50.50.600 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog")<CR>
-an 50.50.610 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd")<CR>
-an 50.50.620 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang")<CR>
-an 50.50.630 &Syntax.HIJK.Ipkg :cal SetSyn("ipkg")<CR>
-an 50.50.640 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter")<CR>
-an 50.50.660 &Syntax.HIJK.J :cal SetSyn("j")<CR>
-an 50.50.670 &Syntax.HIJK.JAL :cal SetSyn("jal")<CR>
-an 50.50.680 &Syntax.HIJK.JAM :cal SetSyn("jam")<CR>
-an 50.50.690 &Syntax.HIJK.Jargon :cal SetSyn("jargon")<CR>
-an 50.50.700 &Syntax.HIJK.Java.Java :cal SetSyn("java")<CR>
-an 50.50.710 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc")<CR>
-an 50.50.720 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp")<CR>
-an 50.50.730 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties")<CR>
-an 50.50.740 &Syntax.HIJK.JavaScript :cal SetSyn("javascript")<CR>
-an 50.50.750 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact")<CR>
-an 50.50.760 &Syntax.HIJK.Jess :cal SetSyn("jess")<CR>
-an 50.50.770 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph")<CR>
-an 50.50.780 &Syntax.HIJK.Jinja :cal SetSyn("jinja")<CR>
-an 50.50.790 &Syntax.HIJK.JJdescription :cal SetSyn("jjdescription")<CR>
-an 50.50.800 &Syntax.HIJK.Jovial :cal SetSyn("jovial")<CR>
-an 50.50.810 &Syntax.HIJK.JQ :cal SetSyn("jq")<CR>
-an 50.50.820 &Syntax.HIJK.JSON.JSON :cal SetSyn("json")<CR>
-an 50.50.830 &Syntax.HIJK.JSON.JSON-LD :cal SetSyn("jsonld")<CR>
-an 50.50.840 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5")<CR>
-an 50.50.850 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc")<CR>
-an 50.50.860 &Syntax.HIJK.Julia :cal SetSyn("julia")<CR>
-an 50.50.870 &Syntax.HIJK.Just :cal SetSyn("just")<CR>
-an 50.50.890 &Syntax.HIJK.Karel :cal SetSyn("karel")<CR>
-an 50.50.900 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig")<CR>
-an 50.50.910 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript")<CR>
-an 50.50.920 &Syntax.HIJK.Kdl :cal SetSyn("kdl")<CR>
-an 50.50.930 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt")<CR>
-an 50.50.940 &Syntax.HIJK.Kitty :cal SetSyn("kitty")<CR>
-an 50.50.950 &Syntax.HIJK.Kivy :cal SetSyn("kivy")<CR>
-an 50.50.960 &Syntax.HIJK.KixTart :cal SetSyn("kix")<CR>
-an 50.50.970 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin")<CR>
-an 50.50.980 &Syntax.HIJK.Krl :cal SetSyn("krl")<CR>
+an 50.50.440 &Syntax.HIJK.Icalendar :cal SetSyn("icalendar")<CR>
+an 50.50.450 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu")<CR>
+an 50.50.460 &Syntax.HIJK.Icon :cal SetSyn("icon")<CR>
+an 50.50.470 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl")<CR>
+an 50.50.480 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl")<CR>
+an 50.50.490 &Syntax.HIJK.Idris2 :cal SetSyn("idris2")<CR>
+an 50.50.500 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent")<CR>
+an 50.50.510 &Syntax.HIJK.Inform :cal SetSyn("inform")<CR>
+an 50.50.520 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl")<CR>
+an 50.50.530 &Syntax.HIJK.Initng :cal SetSyn("initng")<CR>
+an 50.50.540 &Syntax.HIJK.Inittab :cal SetSyn("inittab")<CR>
+an 50.50.550 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss")<CR>
+an 50.50.560 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat")<CR>
+an 50.50.570 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog")<CR>
+an 50.50.580 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt")<CR>
+an 50.50.590 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog")<CR>
+an 50.50.600 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog")<CR>
+an 50.50.610 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog")<CR>
+an 50.50.620 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd")<CR>
+an 50.50.630 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang")<CR>
+an 50.50.640 &Syntax.HIJK.Ipkg :cal SetSyn("ipkg")<CR>
+an 50.50.650 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter")<CR>
+an 50.50.670 &Syntax.HIJK.J :cal SetSyn("j")<CR>
+an 50.50.680 &Syntax.HIJK.JAL :cal SetSyn("jal")<CR>
+an 50.50.690 &Syntax.HIJK.JAM :cal SetSyn("jam")<CR>
+an 50.50.700 &Syntax.HIJK.Jargon :cal SetSyn("jargon")<CR>
+an 50.50.710 &Syntax.HIJK.Java.Java :cal SetSyn("java")<CR>
+an 50.50.720 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc")<CR>
+an 50.50.730 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp")<CR>
+an 50.50.740 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties")<CR>
+an 50.50.750 &Syntax.HIJK.JavaScript :cal SetSyn("javascript")<CR>
+an 50.50.760 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact")<CR>
+an 50.50.770 &Syntax.HIJK.Jess :cal SetSyn("jess")<CR>
+an 50.50.780 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph")<CR>
+an 50.50.790 &Syntax.HIJK.Jinja :cal SetSyn("jinja")<CR>
+an 50.50.800 &Syntax.HIJK.JJdescription :cal SetSyn("jjdescription")<CR>
+an 50.50.810 &Syntax.HIJK.Jovial :cal SetSyn("jovial")<CR>
+an 50.50.820 &Syntax.HIJK.JQ :cal SetSyn("jq")<CR>
+an 50.50.830 &Syntax.HIJK.JSON.JSON :cal SetSyn("json")<CR>
+an 50.50.840 &Syntax.HIJK.JSON.JSON-LD :cal SetSyn("jsonld")<CR>
+an 50.50.850 &Syntax.HIJK.JSON.JSON5 :cal SetSyn("json5")<CR>
+an 50.50.860 &Syntax.HIJK.JSON.JSONC :cal SetSyn("jsonc")<CR>
+an 50.50.870 &Syntax.HIJK.Julia :cal SetSyn("julia")<CR>
+an 50.50.880 &Syntax.HIJK.Just :cal SetSyn("just")<CR>
+an 50.50.900 &Syntax.HIJK.Karel :cal SetSyn("karel")<CR>
+an 50.50.910 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig")<CR>
+an 50.50.920 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript")<CR>
+an 50.50.930 &Syntax.HIJK.Kdl :cal SetSyn("kdl")<CR>
+an 50.50.940 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt")<CR>
+an 50.50.950 &Syntax.HIJK.Kitty :cal SetSyn("kitty")<CR>
+an 50.50.960 &Syntax.HIJK.Kivy :cal SetSyn("kivy")<CR>
+an 50.50.970 &Syntax.HIJK.KixTart :cal SetSyn("kix")<CR>
+an 50.50.980 &Syntax.HIJK.Kotlin :cal SetSyn("kotlin")<CR>
+an 50.50.990 &Syntax.HIJK.Krl :cal SetSyn("krl")<CR>
an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace")<CR>
an 50.60.110 &Syntax.L.LambdaProlog :cal SetSyn("lprolog")<CR>
an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte")<CR>
diff --git a/runtime/syntax/icalendar.vim b/runtime/syntax/icalendar.vim
new file mode 100644
index 000000000..82f454442
--- /dev/null
+++ b/runtime/syntax/icalendar.vim
@@ -0,0 +1,115 @@
+" Vim syntax file
+" Language: iCalendar
+" Maintainer: Anakin Childerhose <
ana...@childerhose.ca>
+" Latest Change: 2026 Sept 22
+" License: Vim (see :h license)
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax sync minlines=150
+
+" component delineating content lines {{{
+"
+" BEGIN:VCALENDAR
+" ^^^^^ icalendarComponentBegin
+" ^ icalendarComponentSeparator
+" ^^^^^^^^^ icalendarComponentType
+" END:VCALENDAR
+" ^^^ icalendarComponentEnd
+" ^ icalendarComponentSeparator
+" ^^^^^^^^^ icalendarComponentType
+"
+" Line folding in these lines is technically valid but rare so it is ignored to
+" keep the following lines simpler
+syntax keyword icalendarComponentBegin BEGIN nextgroup=icalendarComponentSeparator
+syntax keyword icalendarComponentEnd END nextgroup=icalendarComponentSeparator
+syntax match icalendarComponentSeparator ":" contained nextgroup=icalendarComponentType
+syntax match icalendarComponentType "\w\+" contained
+" component delineating content lines }}}
+
+
+" property content lines {{{
+"
+" TRIGGER;RELATED=START:-PT10M
+" ^^^^^^^ icalendarPropertyName
+" ^ icalendarParamSeparator
+" ^^^^^^^ icalendarPropertyParamName
+" ^ icalendarParamEquals
+" ^^^^^ icalendarPropertyParamValue
+" ^ icalendarPropertySeparator
+" ^^^^^^ icalendarPropertyValue
+"
+" Line folding can occur between any two characters so practically every match
+" needs to support possible folds
+
+let s:fold = '
[ ]'
+let s:prop_chars = '[A-Za-z0-9-]'
+let s:name_regex = $'\({s:prop_chars}\|{s:fold}\)*'
+let s:safe_chars = '[^";:,]'
+
+execute $'syntax match icalendarPropertyName "^{s:name_regex}" nextgroup=icalendarParamSeparator,icalendarPropertySeparator'
+execute $'syntax match icalendarParamSeparator ";\({s:fold}\)*" contained nextgroup=icalendarPropertyParamName'
+execute $'syntax match icalendarPropertyParamName "{s:name_regex}" contained nextgroup=icalendarParamEquals'
+execute $'syntax match icalendarParamEquals "=\({s:fold}\)*" contained nextgroup=icalendarPropertyParamValue'
+" collect safe chars and folds
+execute $'syntax match icalendarPropertyParamValue "\({s:safe_chars}\|{s:fold}\)\+" contained nextgroup=icalendarParamSeparator,icalendarPropertySeparator'
+" unsafe chars need to be quoted:
+" if a value starts with a double quote, ", collect all characters upto the next
+" double quote, [^"]*, including newlines, \_ followed by zero or more folds
+execute $'syntax match icalendarPropertyParamValue "\"\_[^\"]*\"\({s:fold}\)*" contained nextgroup=icalendarParamSeparator,icalendarPropertySeparator'
+execute $'syntax match icalendarPropertySeparator ":\({s:fold}\)*" contained nextgroup=icalendarPropertyValue'
+execute $'syntax match icalendarPropertyValue "\([^
]\|{s:fold}\)*" contained'
+" property content lines }}}
+
+
+" recurring rules {{{
+"
+" RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU
+" ^^^^^ icalendarRrule
+" ^ icalendarRruleSeparator
+" ^^^^ icalendarRruleParamName
+" ^ icalendarRruleEquals
+" ^^^^^^ icalendarRruleParamValue
+" ^ icalendarRruleParamSeparator
+"
+let s:rrule_chars = '[A-Za-z0-9-+,]'
+
+syntax keyword icalendarRrule RRULE nextgroup=icalendarRruleSeparator
+execute $'syntax match icalendarRruleSeparator ":\({s:fold}\)*" contained nextgroup=icalendarRruleParamName'
+execute $'syntax match icalendarRruleParamName "{s:name_regex}" contained nextgroup=icalendarRruleEquals'
+execute $'syntax match icalendarRruleEquals "=\({s:fold}\)*" contained nextgroup=icalendarRruleParamValue'
+execute $'syntax match icalendarRruleParamValue "\({s:rrule_chars}\|{s:fold}\)\+" contained nextgroup=icalendarRruleParamSeparator'
+execute $'syntax match icalendarRruleParamSeparator ";\({s:fold}\)*" contained nextgroup=icalendarRruleParamName'
+" recurring rules }}}
+
+highlight default link icalendarComponentBegin Structure
+highlight default link icalendarComponentEnd Structure
+highlight default link icalendarComponentSeparator Operator
+highlight default link icalendarComponentType Type
+
+highlight default link icalendarPropertyName Identifier
+highlight default link icalendarParamSeparator Operator
+highlight default link icalendarPropertyParamName Type
+highlight default link icalendarParamEquals Operator
+highlight default link icalendarPropertyParamValue String
+highlight default link icalendarPropertySeparator Operator
+highlight default link icalendarPropertyValue Constant
+
+highlight default link icalendarRrule Identifier
+highlight default link icalendarRruleSeparator Operator
+highlight default link icalendarRruleParamName Type
+highlight default link icalendarRruleEquals Operator
+highlight default link icalendarRruleParamValue String
+highlight default link icalendarRruleParamSeparator Operator
+
+let b:current_syntax = "icalendar"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: fdm=marker
diff --git a/runtime/syntax/testdir/dumps/icalendar_00.dump b/runtime/syntax/testdir/dumps/icalendar_00.dump
new file mode 100644
index 000000000..6f8c8a572
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/icalendar_00.dump
@@ -0,0 +1,20 @@
+|-+0#0000e05#a8a8a8255| @6>B+0#00e0003#ffffff0|E|G|I|N|:+0#af5f00255&|V+0#00e0003&|C|A|L|E|N|D|A|R| +0#0000000&@51
+||+0#0000e05#a8a8a8255| @6|P+0#00e0e07#ffffff0| +0#0000000&@65
+||+0#0000e05#a8a8a8255| @6| +0#00e0e07#ffffff0|R|O| +0#0000000&@63
+||+0#0000e05#a8a8a8255| @6| +0#00e0e07#ffffff0|D|I|D| +0#0000000&@62
+||+0#0000e05#a8a8a8255| @6| +0#00e0e07#ffffff0|:+0#af5f00255&| +0#0000000&@64
+||+0#0000e05#a8a8a8255| @6| +0#af5f00255#ffffff0|-+0#e000002&|/@1|P|l| +0#0000000&@60
+||+0#0000e05#a8a8a8255| @6| +0#e000002#ffffff0|o|n|e|.|o|r|g|/@1|N|O|N|S|G|M|L| |p|l|o|n|e|.|a|p@1|.|e|v|e|n|t|/@1|E|N| +0#0000000&@29
+||+0#0000e05#a8a8a8255| @6|V+0#00e0e07#ffffff0|E|R|S|I|O|N|:+0#af5f00255&|2+0#e000002&|.|0| +0#0000000&@55
+||+0#0000e05#a8a8a8255| @6|X+0#00e0e07#ffffff0|-|W|R|-|C|A|L|N|A|M|E|:+0#af5f00255&|t+0#e000002&|e|s|t| |c|r|e|a|t|e| |c|a|l|e|n|d|a|r| +0#0000000&@33
+||+0#0000e05#a8a8a8255| @6|X+0#00e0e07#ffffff0|-|W|R|-|C|A|L|D|E|S|C|:+0#af5f00255&|i+0#e000002&|c|a|l|e|n|d|a|r| |t|e|s|t| +0#0000000&@39
+||+0#0000e05#a8a8a8255| @6|X+0#00e0e07#ffffff0|-|W|R|-|R|E|L|C|A|L|I|D|:+0#af5f00255&|1+0#e000002&|2|3|4|5| +0#0000000&@47
+||+0#0000e05#a8a8a8255| @6|X+0#00e0e07#ffffff0|-|W|R|-|T|I|M|E|Z|O|N|E|:+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a| +0#0000000&@39
+||+0#0000e05#a8a8a8255|-| @5|B+0#00e0003#ffffff0|E|G|I|N|:+0#af5f00255&|V+0#00e0003&|T|I|M|E|Z|O|N|E| +0#0000000&@51
+||+0#0000e05#a8a8a8255@1| @5|T+0#00e0e07#ffffff0|Z|I|D|:+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a| +0#0000000&@48
+||+0#0000e05#a8a8a8255@1| @5|X+0#00e0e07#ffffff0|-|L|I|C|-|L|O|C|A|T|I|O|N|:+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a| +0#0000000&@38
+||+0#0000e05#a8a8a8255@1|-| @4|B+0#00e0003#ffffff0|E|G|I|N|:+0#af5f00255&|D+0#00e0003&|A|Y|L|I|G|H|T| +0#0000000&@52
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|O|F@1|S|E|T|F|R|O|M|:+0#af5f00255&|++0#e000002&|0|1|0@1| +0#0000000&@48
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|O|F@1|S|E|T@1|O|:+0#af5f00255&|++0#e000002&|0|2|0@1| +0#0000000&@50
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|N|A|M|E|:+0#af5f00255&|C+0#e000002&|E|S|T| +0#0000000&@55
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/icalendar_01.dump b/runtime/syntax/testdir/dumps/icalendar_01.dump
new file mode 100644
index 000000000..307c8cb64
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/icalendar_01.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255@1| @5|T+0#00e0e07#ffffff0|Z|I|D|:+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a| +0#0000000&@48
+||+0#0000e05#a8a8a8255@1| @5|X+0#00e0e07#ffffff0|-|L|I|C|-|L|O|C|A|T|I|O|N|:+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a| +0#0000000&@38
+||+0#0000e05#a8a8a8255@1|-| @4|B+0#00e0003#ffffff0|E|G|I|N|:+0#af5f00255&|D+0#00e0003&|A|Y|L|I|G|H|T| +0#0000000&@52
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|O|F@1|S|E|T|F|R|O|M|:+0#af5f00255&|++0#e000002&|0|1|0@1| +0#0000000&@48
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|O|F@1|S|E|T@1|O|:+0#af5f00255&|++0#e000002&|0|2|0@1| +0#0000000&@50
+||+0#0000e05#a8a8a8255@2| @4>T+0#00e0e07#ffffff0|Z|N|A|M|E|:+0#af5f00255&|C+0#e000002&|E|S|T| +0#0000000&@55
+||+0#0000e05#a8a8a8255@2| @4|D+0#00e0e07#ffffff0|T|S|T|A|R|T|:+0#af5f00255&|1+0#e000002&|9|7|0@1|3|2|9|T|0|2|0@3| +0#0000000&@43
+||+0#0000e05#a8a8a8255@2| @4|R+0#00e0e07#ffffff0@1|U|L|E|:+0#af5f00255&| +0#0000000&@60
+||+0#0000e05#a8a8a8255@2| @4| +0#af5f00255#ffffff0|F+0#00e0003&|R| +0#0000000&@63
+||+0#0000e05#a8a8a8255@2| @4| +0#00e0003#ffffff0|E|Q| +0#0000000&@63
+||+0#0000e05#a8a8a8255@2| @4| +0#00e0003#ffffff0|=+0#af5f00255&| +0#0000000&@64
+||+0#0000e05#a8a8a8255@2| @4| +0#af5f00255#ffffff0|Y+0#e000002&|E|A|R| +0#0000000&@61
+||+0#0000e05#a8a8a8255@2| @4| +0#e000002#ffffff0|L|Y| +0#0000000&@63
+||+0#0000e05#a8a8a8255@2| @4| +0#e000002#ffffff0|;+0#af5f00255&| +0#0000000&@64
+||+0#0000e05#a8a8a8255@2| @4| +0#af5f00255#ffffff0|B+0#00e0003&|Y|M| +0#0000000&@62
+||+0#0000e05#a8a8a8255@2| @4| +0#00e0003#ffffff0|O|N|T|H|=+0#af5f00255&| +0#0000000&@60
+||+0#0000e05#a8a8a8255@2| @4| +0#af5f00255#ffffff0|3+0#e000002&|;+0#af5f00255&|B+0#00e0003&|Y|D|A|Y| +0#0000000&@58
+||+0#0000e05#a8a8a8255@2| @4| +0#00e0003#ffffff0|=+0#af5f00255&|-+0#e000002&|1|S|U| +0#0000000&@60
+||+0#0000e05#a8a8a8255@2| @4|E+0#00e0003#ffffff0|N|D|:+0#af5f00255&|D+0#00e0003&|A|Y|L|I|G|H|T| +0#0000000&@54
+@57|1|9|,|1| @9|3|1|%|
diff --git a/runtime/syntax/testdir/dumps/icalendar_02.dump b/runtime/syntax/testdir/dumps/icalendar_02.dump
new file mode 100644
index 000000000..a360a7774
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/icalendar_02.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255@2| @4|E+0#00e0003#ffffff0|N|D|:+0#af5f00255&|D+0#00e0003&|A|Y|L|I|G|H|T| +0#0000000&@54
+||+0#0000e05#a8a8a8255@1|-| @4|B+0#00e0003#ffffff0|E|G|I|N|:+0#af5f00255&|S+0#00e0003&|T|A|N|D|A|R|D| +0#0000000&@52
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|O|F@1|S|E|T|F|R|O|M|:+0#af5f00255&|++0#e000002&| +0#0000000&@52
+||+0#0000e05#a8a8a8255@2| @4| +0#e000002#ffffff0|0|2|0@1| +0#0000000&@61
+||+0#0000e05#a8a8a8255@2| @4|T+0#00e0e07#ffffff0|Z|O|F@1|S|E|T@1|O|:+0#af5f00255&|++0#e000002&|0|1|0@1| +0#0000000&@50
+||+0#0000e05#a8a8a8255@2| @4>T+0#00e0e07#ffffff0|Z|N|A|M|E|:+0#af5f00255&|C+0#e000002&|E|T| +0#0000000&@56
+||+0#0000e05#a8a8a8255@2| @4|D+0#00e0e07#ffffff0|T|S|T|A|R|T|:+0#af5f00255&|1+0#e000002&|9|7|0|1|0|2|5|T|0|3|0@3| +0#0000000&@43
+||+0#0000e05#a8a8a8255@2| @4|R+0#00e0e07#ffffff0@1|U|L|E|:+0#af5f00255&|F+0#00e0003&|R|E|Q|=+0#af5f00255&|Y+0#e000002&|E|A|R|L|Y|;+0#af5f00255&|B+0#00e0003&|Y|M|O|N|T|H|=+0#af5f00255&|1+0#e000002&|0|;+0#af5f00255&|B+0#00e0003&|Y|D|A|Y|=+0#af5f00255&|-+0#e000002&|1|S|U| +0#0000000&@27
+||+0#0000e05#a8a8a8255@2| @4|E+0#00e0003#ffffff0|N|D|:+0#af5f00255&|S+0#00e0003&|T|A|N|D|A|R|D| +0#0000000&@54
+||+0#0000e05#a8a8a8255@1| @5|E+0#00e0003#ffffff0|N|D|:+0#af5f00255&|V+0#00e0003&|T|I|M|E|Z|O|N|E| +0#0000000&@53
+||+0#0000e05#a8a8a8255|-| @5|B+0#00e0003#ffffff0|E|G|I|N|:+0#af5f00255&|V+0#00e0003&|E|V|E|N|T| +0#0000000&@54
+||+0#0000e05#a8a8a8255@1| @5|D+0#00e0e07#ffffff0|T|S|T|A|R|T|;+0#af5f00255&|T+0#00e0003&|Z|I|D|=+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a|:+0#af5f00255&|2+0#e000002&|0|1|2|0|2|1|3|T|1|0@4| +0#0000000&@24
+||+0#0000e05#a8a8a8255@1| @5|D+0#00e0e07#ffffff0|T|E|N|D|;+0#af5f00255&|T+0#00e0003&|Z|I|D|=+0#af5f00255&|E+0#e000002&|u|r|o|p|e|/|V|i|e|n@1|a|:+0#af5f00255&|2+0#e000002&|0|1|2|0|2|1|7|T|1|8|0@3| +0#0000000&@26
+||+0#0000e05#a8a8a8255@1| @5|D+0#00e0e07#ffffff0|T|S|T|A|M|P|:+0#af5f00255&|2+0#e000002&|0|1|0|1|0|1|0|T|0|9|1|0|1|0|Z| +0#0000000&@42
+||+0#0000e05#a8a8a8255@1| @5|C+0#00e0e07#ffffff0|R|E|A|T|E|D|:+0#af5f00255&|2+0#e000002&|0|1|0|1|0|1|0|T|0|9|1|0|1|0|Z| +0#0000000&@42
+||+0#0000e05#a8a8a8255@1| @5|U+0#00e0e07#ffffff0|I|D|:+0#af5f00255&|1+0#e000002&|2|3|4|5|6| +0#0000000&@56
+||+0#0000e05#a8a8a8255@1| @5|S+0#00e0e07#ffffff0|U|M@1|A|R|Y|:+0#af5f00255&|a+0#e000002&|r|t|s|p|r|i|n|t| |2|0|1|2| +0#0000000&@44
+||+0#0000e05#a8a8a8255@1| @5|D+0#00e0e07#ffffff0|E|S|C|R|I|P|T|I|O|N|:+0#af5f00255&|s+0#e000002&|p|r|i|n|t|i|n|g| |a|t| |t|h|e| |a|r|t|s|p|r|i|n|t| +0#0000000&@28
+||+0#0000e05#a8a8a8255@1| @5|L+0#00e0e07#ffffff0|O|C|A|T|I|O|N|:+0#af5f00255&|a+0#e000002&|k|a| |b|i|l|d|,| |w|i|e|n| +0#0000000&@43
+@57|3|7|,|1| @9|7|5|%|
diff --git a/runtime/syntax/testdir/dumps/icalendar_03.dump b/runtime/syntax/testdir/dumps/icalendar_03.dump
new file mode 100644
index 000000000..b56a642d5
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/icalendar_03.dump
@@ -0,0 +1,20 @@
+||+0#0000e05#a8a8a8255@1| @5|L+0#00e0e07#ffffff0|O|C|A|T|I|O|N|:+0#af5f00255&|a+0#e000002&|k|a| |b|i|l|d|,| |w|i|e|n| +0#0000000&@43
+||+0#0000e05#a8a8a8255@1| @5|A+0#00e0e07#ffffff0|T@1|E|N|D|E@1|;+0#af5f00255&|C+0#00e0003&|N|=+0#af5f00255&|M+0#e000002&|a|x| +0#0000000&@51
+||+0#0000e05#a8a8a8255@1| @5| +0#e000002#ffffff0@1|M|u|s|t|e|r|m|a|n@1|;+0#af5f00255&|P+0#00e0003&|A|R|T|S| +0#0000000&@48
+||+0#0000e05#a8a8a8255@1| @5| +0#00e0003#ffffff0|T|A|T|=+0#af5f00255&|A+0#e000002&|C@1| +0#0000000&@58
+||+0#0000e05#a8a8a8255@1| @5| +0#e000002#ffffff0|E|P|T|E|D|:+0#af5f00255&|m+0#e000002&|a|i|l|t|o|:|m|a|x|@|e|x|a|m|p|l|e|.|o|r|g| +0#0000000&@37
+||+0#0000e05#a8a8a8255@1| @5>A+0#00e0e07#ffffff0|T@1|E|N|D|E@1|;+0#af5f00255&|C+0#00e0003&|N|=+0#af5f00255&|"+0#e000002&|M|u|s|t|e|r|m|a|n@1|,| +0#0000000&@42
+||+0#0000e05#a8a8a8255@1| @5| +0#e000002#ffffff0@1|M|a|x|"|;+0#af5f00255&|D+0#00e0003&|E|L|E|G|A|T|E|D|-|F|R|O|M|=+0#af5f00255&|"+0#e000002&|m|a|i| +0#0000000&@40
+||+0#0000e05#a8a8a8255@1| @5| +0#e000002#ffffff0|l|t|o|:|m|o|r|i|t|z|@|e|x|a| +0#0000000&@51
+||+0#0000e05#a8a8a8255@1| @5| +0#e000002#ffffff0|m|p|l|e|.|o|r|g|"|:+0#af5f00255&|m+0#e000002&|a|i|l|t|o|:|m|a|x|@|e|x|a|m|p|l|e|.|o|r|g| +0#0000000&@33
+||+0#0000e05#a8a8a8255@1| @5|E+0#00e0003#ffffff0|N|D|:+0#af5f00255&|V+0#00e0003&|E|V|E|N|T| +0#0000000&@56
+||+0#0000e05#a8a8a8255| @6|E+0#00e0003#ffffff0|N|D|:+0#af5f00255&|V+0#00e0003&|C|A|L|E|N|D|A|R| +0#0000000&@53
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|5@1|,|1| @9|B|o|t|
diff --git a/runtime/syntax/testdir/input/icalendar.ics b/runtime/syntax/testdir/input/icalendar.ics
new file mode 100644
index 000000000..93bdadafc
--- /dev/null
+++ b/runtime/syntax/testdir/input/icalendar.ics
@@ -0,0 +1,60 @@
+BEGIN:VCALENDAR
+P
+ RO
+ DID
+ :
+ -//Pl
+
one.org//NONSGML plone.app.event//EN
+VERSION:2.0
+X-WR-CALNAME:test create calendar
+X-WR-CALDESC:icalendar test
+X-WR-RELCALID:12345
+X-WR-TIMEZONE:Europe/Vienna
+BEGIN:VTIMEZONE
+TZID:Europe/Vienna
+X-LIC-LOCATION:Europe/Vienna
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:
+ FR
+ EQ
+ =
+ YEAR
+ LY
+ ;
+ BYM
+ ONTH=
+ 3;BYDAY
+ =-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+
+ 0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Vienna:20120213T100000
+DTEND;TZID=Europe/Vienna:20120217T180000
+DTSTAMP:20101010T091010Z
+CREATED:20101010T091010Z
+UID:123456
+SUMMARY:artsprint 2012
+DESCRIPTION:sprinting at the artsprint
+LOCATION:aka bild, wien
+ATTENDEE;CN=Max
+ Mustermann;PARTS
+ TAT=ACC
+ EPTED:mailto:
m...@example.org
+ATTENDEE;CN="Mustermann,
+ Max";DELEGATED-FROM="mai
+ lto:moritz@exa
+
mple.org":mailto:
m...@example.org
+END:VEVENT
+END:VCALENDAR
diff --git a/runtime/syntax/testdir/input/setup/icalendar.vim b/runtime/syntax/testdir/input/setup/icalendar.vim
new file mode 100644
index 000000000..d5e58e6e1
--- /dev/null
+++ b/runtime/syntax/testdir/input/setup/icalendar.vim
@@ -0,0 +1,3 @@
+setlocal foldcolumn=8 foldlevel=8 foldmethod=expr
+let g:icalendar_folding = 1
+filetype plugin on
diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim
index 1a7d8de78..d52ce7611 100644
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -400,6 +400,7 @@ def s:GetFilenameChecks(): dict<list<string>>
hyprlang: ['hyprlock.conf', 'hyprland.conf', 'hypridle.conf', 'hyprpaper.conf', '/hypr/foo.conf'],
i3config: ['/home/user/.i3/config', '/home/user/.config/i3/config', '/etc/i3/config', '/etc/xdg/i3/config'],
ibasic: ['file.iba', 'file.ibi'],
+ icalendar: ['file.ics'],
icemenu: ['/.icewm/menu', 'any/.icewm/menu'],
icon: ['file.icn'],
idris2: ['file.idr'],
diff --git a/src/version.c b/src/version.c
index 28f1ad520..8ed01bff9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1128,
/**/
1127,
/**/