Commit: patch 9.2.0033: filetype: sh filetype used for env files

0 views
Skip to first unread message

Christian Brabandt

unread,
1:16 PM (2 hours ago) 1:16 PM
to vim...@googlegroups.com
patch 9.2.0033: filetype: sh filetype used for env files

Commit: https://github.com/vim/vim/commit/d0fa375629b1bfdb8dc054894ca81d7473268455
Author: DuckAfire <155199080...@users.noreply.github.com>
Date: Thu Feb 19 18:04:46 2026 +0000

patch 9.2.0033: filetype: sh filetype used for env files

Problem: filetype: sh filetype used for env files
Solution: Detect *.env and .env.* files as env filetype,
detect .envrc and .envrc.* as sh filetype,
include a simple env syntax script (DuckAfire)

Previously, .env files were handled by the shell syntax. While
functional, this limited the ability to support specific .env
implementations, such as CodeIgniter4 which allows dots in keys
(e.g., "foo.bar=0").

The new dedicated 'env' filetype and syntax script improves legibility
and prevents highlighting from breaking when encountering spaces.
Currently, the syntax does not support indentation; fields, variables,
and comments must start at the beginning of the line.

closes: #19260

Co-authored-by: zeertzjq <zeer...@outlook.com>
Signed-off-by: DuckAfire <155199080...@users.noreply.github.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 470325d13..4bdecfc7c 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1027,7 +1027,7 @@ au BufNewFile,BufRead *.decl,*.dcl,*.dec
" NOTE: Patterns ending in a star are further down, these have lower priority.
au BufNewFile,BufRead .bashrc,bashrc,bash.bashrc,.bash[_-]profile,.bash[_-]logout,.bash[_-]aliases,.bash[_-]history,bash-fc[-.],*.ebuild,*.bash,*.eclass,PKGBUILD,*.bats,*.cygport call dist#ft#SetFileTypeSH("bash")
au BufNewFile,BufRead .kshrc,*.ksh call dist#ft#SetFileTypeSH("ksh")
-au BufNewFile,BufRead */etc/profile,.profile,*.sh,*.env{rc,} call dist#ft#SetFileTypeSH(getline(1))
+au BufNewFile,BufRead */etc/profile,.profile,*.sh,*.envrc,.envrc.* call dist#ft#SetFileTypeSH(getline(1))
" Shell script (Arch Linux) or PHP file (Drupal)
au BufNewFile,BufRead *.install
\ if getline(1) =~ '<?php' |
@@ -1410,6 +1410,9 @@ au BufNewFile,BufRead drac.* call s:StarSetf('dracula')
" Execline (s6) scripts
au BufNewFile,BufRead s6-* call s:StarSetf('execline')

+" Env
+au BufNewFile,BufRead *.env,.env{.*,} setf env
+
" Fvwm
au BufNewFile,BufRead */.fvwm/* call s:StarSetf('fvwm')
au BufNewFile,BufRead *fvwmrc*,*fvwm95*.hook
diff --git a/runtime/syntax/env.vim b/runtime/syntax/env.vim
new file mode 100644
index 000000000..a33eb045d
--- /dev/null
+++ b/runtime/syntax/env.vim
@@ -0,0 +1,28 @@
+" Vim syntax file
+" Language: env
+" Maintainer: DuckAfire <duck...@gmail.com>
+" Last Change: 2026 Jan 27
+" Version: 2
+" Changelog:
+" 0. Create syntax file.
+" 1. Remove unused variable (g:main_syntax).
+" 2. Apply changes required by github@dkearns
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match envField nextgroup=envValue /^\h\%(\w\|\.\)*/
+syn region envValue matchgroup=Operator start=/=/ end=/$/
+syn match envComment contains=envTodo,envTitles /^#.*$/
+syn keyword envTodo contained CAUTION NOTE TODO WARN WARNING
+syn match envTitle contained /^\s*#\s*\zs[A-Z0-9][A-Z0-9 ]*:/
+
+hi def link envField Identifier
+hi def link envValue String
+hi def link envComment Comment
+hi def link envTodo Todo
+hi def link envTitle PreProc
+
+let b:current_syntax = "env"
+
diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim
index 8da2b8f8a..56046037a 100644
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -278,6 +278,7 @@ def s:GetFilenameChecks(): dict<list<string>>
elmfilt: ['filter-rules'],
elsa: ['file.lc'],
elvish: ['file.elv'],
+ env: ['.env', '.env.file', 'file.env'],
epuppet: ['file.epp'],
erlang: ['file.erl', 'file.hrl', 'file.yaws', 'file.app.src', 'rebar.config'],
eruby: ['file.erb', 'file.rhtml'],
@@ -735,7 +736,7 @@ def s:GetFilenameChecks(): dict<list<string>>
sh: ['.bashrc', '.bash_profile', '.bash-profile', '.bash_logout', '.bash-logout', '.bash_aliases', '.bash-aliases', '.bash_history', '.bash-history',
'/tmp/bash-fc-3Ozjlw', '/tmp/bash-fc.3Ozjlw', 'PKGBUILD', 'file.bash', '/usr/share/doc/bash-completion/filter.sh',
'/etc/udev/cdsymlinks.conf', 'any/etc/udev/cdsymlinks.conf', 'file.bats', '.ash_history', 'any/etc/neofetch/config.conf', '.xprofile',
- 'user-dirs.defaults', 'user-dirs.dirs', 'makepkg.conf', '.makepkg.conf', 'file.mdd', 'file.cygport', '.env', '.envrc', 'devscripts.conf',
+ 'user-dirs.defaults', 'user-dirs.dirs', 'makepkg.conf', '.makepkg.conf', 'file.mdd', 'file.cygport', '.envrc', '.envrc.file', 'file.envrc', 'devscripts.conf',
'.devscripts', 'file.lo', 'file.la', 'file.lai'],
shaderslang: ['file.slang'],
sieve: ['file.siv', 'file.sieve'],
diff --git a/src/version.c b/src/version.c
index eb20c8273..c2cc8137d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 33,
/**/
32,
/**/
Reply all
Reply to author
Forward
0 new messages