tft 0.1.1

Text file type list and detection similar to that of Neovim
Documentation
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
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
use std::ops::Deref;

use lazy_regex::regex;
use once_cell::sync::Lazy;
use regex::Regex;

use crate::{detect, FileType, FileTypeResolver};

pub(crate) struct Pattern {
    pub(crate) resolver: FileTypeResolver,
    pub(crate) priority: Option<isize>,
}

impl Pattern {
    fn new(resolver: FileTypeResolver, priority: Option<isize>) -> Self {
        Self { resolver, priority }
    }

    fn starsetf(resolver: FileTypeResolver, priority: Option<isize>) -> Self {
        Self {
            resolver,
            priority: priority.or(Some(isize::MIN)),
        }
    }
}

#[rustfmt::skip]
pub(crate) static PATTERN: Lazy<Vec<(bool, &'static Regex, Pattern)>> = Lazy::new(|| {
    let mut vec = vec![
        (true, regex!(r"^.*etc/a2ps(/.*)?\.cfg$").deref(), Pattern::new(FileTypeResolver::Static(FileType::A2ps), None)),
        (true, regex!(r"^.*usr/share/alsa/alsa\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::AlsaConf), None)),
        (true, regex!(r"^.*etc/asound\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::AlsaConf), None)),
        (true, regex!(r"^.*etc/apache2/sites-.*/.*\.com$"), Pattern::new(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/httpd/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/apache2/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/apache2/(conf\.|mods-|sites-).*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
        (false, regex!(r"^(access|apache2?|httpd|srm)\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/httpd/conf\..*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/httpd/conf\.d/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/httpd/(mods-|sites-).*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Apache), None)),
        (true, regex!(r"^.*etc/proftpd/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ApacheStyle), None)),
        (true, regex!(r"^.*etc/proftpd/conf\..*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ApacheStyle), None)),
        (false, regex!(r"^proftpd\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ApacheStyle), None)),
        (true, regex!(r"^.*asterisk/.*\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Asterisk), None)),
        (true, regex!(r"^.*asterisk.*/.*voicemail\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::AsteriskVoiceMail), None)),
        (true, regex!(r"^.*\.aptitude/config$"), Pattern::new(FileTypeResolver::Static(FileType::AptConf), None)),
        (false, regex!(r"^.*\.[aAsS]$"), Pattern::new(FileTypeResolver::Dynamic(detect::asm), None)),
        (false, regex!(r"^[mM]akefile\.am$"), Pattern::new(FileTypeResolver::Static(FileType::Automake), None)),
        (true, regex!(r"^.*bind/db\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Bindzone), None)),
        (true, regex!(r"^.*named/db\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Bindzone), None)),
        (true, regex!(r"^.*build/conf/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Bitbake), None)),
        (true, regex!(r"^.*meta/conf/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Bitbake), None)),
        (true, regex!(r"^.*meta-.*/conf/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Bitbake), None)),
        (false, regex!(r"^bzr_log\..*$"), Pattern::new(FileTypeResolver::Static(FileType::Bzr), None)),
        (true, regex!(r"^.*enlightenment/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::C), None)),
        (true, regex!(r"^.*cabal\.config$"), Pattern::new(FileTypeResolver::Static(FileType::CabalConfig), None)),
        (true, regex!(r"^.*\.config/cabal/config$"), Pattern::new(FileTypeResolver::Static(FileType::CabalConfig), None)),
        (false, regex!(r"^cabal\.project\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::CabalProject), None)),
        (true, regex!(r"^.*\.calendar/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Calendar), None)),
        (true, regex!(r"^.*share/calendar/(.*/)?calendar\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Calendar), None)),
        (false, regex!(r"^sgml\.catalog.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Catalog), None)),
        (true, regex!(r"^.*etc/defaults?/cdrdao$"), Pattern::new(FileTypeResolver::Static(FileType::CdrdaoConf), None)),
        (true, regex!(r"^.*etc/cdrdao\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::CdrdaoConf), None)),
        (false, regex!(r"^.*hgrc$"), Pattern::new(FileTypeResolver::Static(FileType::Cfg), None)),
        // Decrease priority to avoid conflicts with more specific patterns
        // such as '.*/etc/a2ps/.*\.cfg', '.*enlightenment/.*\.cfg', etc.
        (false, regex!(r"^.*\.[Cc][Ff][Gg]$"), Pattern::new(FileTypeResolver::Dynamic(detect::cfg), Some(-1))),
        (false, regex!(r"^[cC]hange[lL]og.*$"), Pattern::starsetf(FileTypeResolver::Dynamic(detect::changelog), None)),
        (false, regex!(r"^.*\.\.ch$"), Pattern::new(FileTypeResolver::Static(FileType::Chill), None)),
        (false, regex!(r"^.*\.cmake\.in$"), Pattern::new(FileTypeResolver::Static(FileType::CMake), None)),
        // */cmus/rc and */.cmus/rc
        (true, regex!(r"^.*\.?cmus/rc$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
        // */cmus/*.theme and */.cmus/*.theme
        (true, regex!(r"^.*\.?cmus/.*\.theme$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
        (true, regex!(r"^.*\.cmus/autosave$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
        (true, regex!(r"^.*\.cmus/command-history$"), Pattern::new(FileTypeResolver::Static(FileType::Cmusrc), None)),
        (true, regex!(r"^.*etc/hostname\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Config), None)),
        (false, regex!(r"^crontab\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Crontab), None)),
        (true, regex!(r"^.*etc/cron\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Crontab), None)),
        (false, regex!(r"^\.cshrc.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::csh), None)),
        (false, regex!(r"^\.login.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::csh), None)),
        (false, regex!(r"^cvs\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Cvs), None)),
        (false, regex!(r"^.*\.[Dd][Aa][Tt]$"), Pattern::new(FileTypeResolver::Dynamic(detect::dat), None)),
        (true, regex!(r"^.*debian/patches/.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::dep3patch), None)),
        (true, regex!(r"^.*etc/dnsmasq\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::DnsMasq), None)),
        (false, regex!(r"^Containerfile\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Dockerfile), None)),
        (false, regex!(r"^Dockerfile\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Dockerfile), None)),
        (true, regex!(r"^.*etc/yum\.repos\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::DosIni), None)),
        (false, regex!(r"^drac\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Dracula), None)),
        (true, regex!(r"^.*debian/changelog$"), Pattern::new(FileTypeResolver::Static(FileType::DebChangelog), None)),
        (true, regex!(r"^.*debian/control$"), Pattern::new(FileTypeResolver::Static(FileType::DebControl), None)),
        (true, regex!(r"^.*debian/copyright$"), Pattern::new(FileTypeResolver::Static(FileType::DebCopyright), None)),
        (true, regex!(r"^.*etc/apt/sources\.list\.d/.*\.list$"), Pattern::new(FileTypeResolver::Static(FileType::DebSources), None)),
        (true, regex!(r"^.*etc/apt/sources\.list$"), Pattern::new(FileTypeResolver::Static(FileType::DebSources), None)),
        (false, regex!(r"^.*\.directory$"), Pattern::new(FileTypeResolver::Static(FileType::Desktop), None)),
        (false, regex!(r"^.*\.desktop$"), Pattern::new(FileTypeResolver::Static(FileType::Desktop), None)),
        (false, regex!(r"^dictd.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::DictdConf), None)),
        (true, regex!(r"^.*etc/DIR_COLORS$"), Pattern::new(FileTypeResolver::Static(FileType::DirColors), None)),
        (true, regex!(r"^.*etc/dnsmasq\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::DnsMasq), None)),
        (false, regex!(r"^php\.ini-.*$"), Pattern::new(FileTypeResolver::Static(FileType::DosIni), None)),
        (true, regex!(r"^.*\.aws/config$"), Pattern::new(FileTypeResolver::Static(FileType::ConfIni), None)),
        (true, regex!(r"^.*\.aws/credentials$"), Pattern::new(FileTypeResolver::Static(FileType::ConfIni), None)),
        (true, regex!(r"^.*etc/pacman\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::ConfIni), None)),
        (true, regex!(r"^.*etc/yum\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::DosIni), None)),
        (false, regex!(r"^.*lvs$"), Pattern::new(FileTypeResolver::Static(FileType::Dracula), None)),
        (false, regex!(r"^.*lpe$"), Pattern::new(FileTypeResolver::Static(FileType::Dracula), None)),
        (true, regex!(r"^.*dtrace/.*\.d$"), Pattern::new(FileTypeResolver::Static(FileType::DTrace), None)),
        (false, regex!(r"^.*esmtprc$"), Pattern::new(FileTypeResolver::Static(FileType::Esmtprc), None)),
        (true, regex!(r"^.*Eterm/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Eterm), None)),
        (false, regex!(r"^[a-zA-Z0-9].*Dict$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (false, regex!(r"^[a-zA-Z0-9].*Dict\..*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (false, regex!(r"^[a-zA-Z].*Properties$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (false, regex!(r"^[a-zA-Z].*Properties\..*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (false, regex!(r"^.*Transport\..*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (true, regex!(r"^.*constant/g$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (true, regex!(r"^.*0(\.orig)?/.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::foam), None)),
        (true, regex!(r"^.*\.fvwm/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Fvwm), None)),
        (false, regex!(r"^.*fvwmrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Fvwm1), None)),
        (false, regex!(r"^.*fvwm95.*\.hook$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Fvwm1), None)),
        (false, regex!(r"^.*fvwm2rc.*$"), Pattern::starsetf(FileTypeResolver::Dynamic(detect::fvwm), None)),
        (true, regex!(r"^.*tmp/lltmp.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Gedcom), None)),
        (true, regex!(r"^.*etc/gitconfig\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*gitolite-admin/conf/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::GitOlite), None)),
        (false, regex!(r"^tmac\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Nroff), None)),
        (true, regex!(r"^.*\.gitconfig\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::GitConfig), None)),
        // Decrease priority to run after simple pattern checks
        (true, regex!(r"^.*\.git/.*$"), Pattern::new(FileTypeResolver::Dynamic(detect::git), Some(-1))),
        (true, regex!(r"^.*\.git/modules/.*/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.git/modules/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.git/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*etc/gitconfig$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.config/git/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.git/config\.worktree$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.git/worktrees/.*/config\.worktree$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.config/git/config$"), Pattern::new(FileTypeResolver::Static(FileType::GitConfig), None)),
        (true, regex!(r"^.*\.git/info/attributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
        (true, regex!(r"^.*etc/gitattributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
        (true, regex!(r"^.*\.config/git/attributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
        (true, regex!(r"^.*\.config/git/attributes$"), Pattern::new(FileTypeResolver::Static(FileType::GitAttributes), None)),
        (true, regex!(r"^.*\.git/info/exclude$"), Pattern::new(FileTypeResolver::Static(FileType::GitIgnore), None)),
        (true, regex!(r"^.*\.config/git/ignore$"), Pattern::new(FileTypeResolver::Static(FileType::GitIgnore), None)),
        (true, regex!(r"^.*\.config/git/ignore$"), Pattern::new(FileTypeResolver::Static(FileType::GitIgnore), None)),
        (false, regex!(r"^\.gitsendemail\.msg\..{6}$"), Pattern::new(FileTypeResolver::Static(FileType::GitSendEmail), None)),
        (false, regex!(r"^gkrellmrc_.$"), Pattern::new(FileTypeResolver::Static(FileType::Gkrellmrc), None)),
        (true, regex!(r"^.*usr/.*/gnupg/options\.skel$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
        (true, regex!(r"^.*\.gnupg/options$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
        (true, regex!(r"^.*\.gnupg/gpg\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
        (true, regex!(r"^.*\.local/share/gnupg/options$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
        (true, regex!(r"^.*\.local/share/gnupg/gpg\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Gpg), None)),
        (true, regex!(r"^.*etc/(group|gshadow)(\.edit|-)?$"), Pattern::new(FileTypeResolver::Static(FileType::Group), None)),
        (true, regex!(r"^.*var/backups/(group|gshadow)\.bak$"), Pattern::new(FileTypeResolver::Static(FileType::Group), None)),
        (true, regex!(r"^.*boot/grub/(grub\.conf|menu\.lst)$"), Pattern::new(FileTypeResolver::Static(FileType::Grub), None)),
        (true, regex!(r"^.*etc/grub\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Grub), None)),
        // gtkrc* and .gtkrc*
        (false, regex!(r"^\.?gtkrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Gtkrc), None)),
        (true, regex!(r"^.*share/n?vim/doc/.*\.txt$"), Pattern::new(FileTypeResolver::Static(FileType::VimHelp), None)),
        (false, regex!(r"^hg-editor-.*\.txt$"), Pattern::new(FileTypeResolver::Static(FileType::Hgcommit), None)),
        (true, regex!(r"^.*etc/host\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::HostConf), None)),
        (true, regex!(r"^.*etc/hosts\.deny$"), Pattern::new(FileTypeResolver::Static(FileType::HostsAccess), None)),
        (true, regex!(r"^.*etc/hosts\.allow$"), Pattern::new(FileTypeResolver::Static(FileType::HostsAccess), None)),
        (false, regex!(r"^.*\.html\.m4$"), Pattern::new(FileTypeResolver::Static(FileType::HtmlM4), None)),
        (true, regex!(r"^.*\.i3/config$"), Pattern::new(FileTypeResolver::Static(FileType::I3Config), None)),
        (true, regex!(r"^.*i3/config$"), Pattern::new(FileTypeResolver::Static(FileType::I3Config), None)),
        (true, regex!(r"^.*\.icewm/menu$"), Pattern::new(FileTypeResolver::Static(FileType::IceMenu), None)),
        (true, regex!(r"^.*etc/initng/.*/.*\.i$"), Pattern::new(FileTypeResolver::Static(FileType::Initng), None)),
        (false, regex!(r"^JAM.*\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Jam), None)),
        (false, regex!(r"^Prl.*\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Jam), None)),
        (false, regex!(r"^.*\.properties_..$"), Pattern::new(FileTypeResolver::Static(FileType::JProperties), None)),
        (false, regex!(r"^.*\.properties_.._..$"), Pattern::new(FileTypeResolver::Static(FileType::JProperties), None)),
        (false, regex!(r"^org\.eclipse\..*\.prefs$"), Pattern::new(FileTypeResolver::Static(FileType::JProperties), None)),
        (false, regex!(r"^.*\.properties_.._.._.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::JProperties), None)),
        (false, regex!(r"^[jt]sconfig.*\.json$"), Pattern::new(FileTypeResolver::Static(FileType::JsonC), None)),
        (false, regex!(r"^Kconfig\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::KConfig), None)),
        (false, regex!(r"^.*\.[Ss][Uu][Bb]$"), Pattern::new(FileTypeResolver::Static(FileType::Krl), None)),
        (false, regex!(r"^lilo\.conf.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Lilo), None)),
        (true, regex!(r"^.*etc/logcheck/.*\.d.*/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::LogCheck), None)),
        (true, regex!(r"^.*lftp/rc$"), Pattern::new(FileTypeResolver::Static(FileType::Lftp), None)),
        (false, regex!(r"^.*\.libao$"), Pattern::new(FileTypeResolver::Static(FileType::Libao), None)),
        (true, regex!(r"^.*etc/libao\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Libao), None)),
        (true, regex!(r"^.*etc/.*limits\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Limits), None)),
        (true, regex!(r"^.*etc/limits$"), Pattern::new(FileTypeResolver::Static(FileType::Limits), None)),
        (true, regex!(r"^.*etc/.*limits\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Limits), None)),
        (true, regex!(r"^.*LiteStep/.*/.*\.rc$"), Pattern::new(FileTypeResolver::Static(FileType::LiteStep), None)),
        (true, regex!(r"^.*etc/login\.access$"), Pattern::new(FileTypeResolver::Static(FileType::LoginAccess), None)),
        (true, regex!(r"^.*etc/login\.defs$"), Pattern::new(FileTypeResolver::Static(FileType::LoginDefs), None)),
        (false, regex!(r"^\.letter\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^\.article\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (true, regex!(r"^/tmp/SLRN[0-9A-Z.]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^ae\d+\.txt$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^pico\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^mutt-.*-[a-zA-Z0-9]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^muttng-.*-[a-zA-Z0-9]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^neomutt-.*-[a-zA-Z0-9]+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^mutt[\w_-]{6}$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^neomutt[\w_-]{6}$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^snd\.\d+$"), Pattern::new(FileTypeResolver::Static(FileType::Mail), None)),
        (false, regex!(r"^reportbug-.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Mail), None)),
        (true, regex!(r"^.*etc/mail/aliases$"), Pattern::new(FileTypeResolver::Static(FileType::MailAliases), None)),
        (true, regex!(r"^.*etc/aliases$"), Pattern::new(FileTypeResolver::Static(FileType::MailAliases), None)),
        (false, regex!(r"^.*[mM]akefile$"), Pattern::new(FileTypeResolver::Static(FileType::Make), None)),
        (false, regex!(r"^[mM]akefile.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Make), None)),
        (true, regex!(r"^.*etc/man\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::ManConf), None)),
        (true, regex!(r"^.*log/auth$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/auth\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user\.log$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/auth\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user\.err$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/auth\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user\.info$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/auth\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user\.warn$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/auth\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user\.crit$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/auth\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/cron\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/daemon\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/debug\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/kern\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/lpr\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/mail\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/messages\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/news/news\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/syslog\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (true, regex!(r"^.*log/user\.notice$"), Pattern::new(FileTypeResolver::Static(FileType::Messages), None)),
        (false, regex!(r"^.*\.[Mm][Oo][Dd]$"), Pattern::new(FileTypeResolver::Dynamic(detect::mod_), None)),
        (true, regex!(r"^.*etc/modules\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::ModConf), None)),
        (true, regex!(r"^.*etc/conf\.modules$"), Pattern::new(FileTypeResolver::Static(FileType::ModConf), None)),
        (true, regex!(r"^.*etc/modules$"), Pattern::new(FileTypeResolver::Static(FileType::ModConf), None)),
        (true, regex!(r"^.*etc/modprobe\..*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ModConf), None)),
                // TODO: only if file is not executable
        (true, regex!(r"^.*etc/modutils/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::ModConf), None)),
        (false, regex!(r"^.*\.[mi][3g]$"), Pattern::new(FileTypeResolver::Static(FileType::Modula3), None)),
        (false, regex!(r"^Muttrc$"), Pattern::new(FileTypeResolver::Static(FileType::Muttrc), None)),
        (false, regex!(r"^Muttngrc$"), Pattern::new(FileTypeResolver::Static(FileType::Muttrc), None)),
        (true, regex!(r"^.*etc/Muttrc\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        (true, regex!(r"^.*\.mplayer/config$"), Pattern::new(FileTypeResolver::Static(FileType::MPlayerConf), None)),
        (false, regex!(r"^Muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        (false, regex!(r"^Muttngrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        // muttrc* and .muttrc*
        (false, regex!(r"^\.?muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        // muttngrc* and .muttngrc*
        (false, regex!(r"^\.?muttngrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        (true, regex!(r"^.*\.mutt/muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        (true, regex!(r"^.*\.muttng/muttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        (true, regex!(r"^.*\.muttng/muttngrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Muttrc), None)),
        (false, regex!(r"^rndc.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Named), None)),
        (false, regex!(r"^rndc.*\.key$"), Pattern::new(FileTypeResolver::Static(FileType::Named), None)),
        (false, regex!(r"^named.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Named), None)),
        (true, regex!(r"^.*etc/nanorc$"), Pattern::new(FileTypeResolver::Static(FileType::Nanorc), None)),
        (false, regex!(r"^.*\.NS[ACGLMNPS]$"), Pattern::new(FileTypeResolver::Static(FileType::Natural), None)),
        (false, regex!(r"^Neomuttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Neomuttrc), None)),
        // neomuttrc* and .neomuttrc*
        (false, regex!(r"^\.?neomuttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Neomuttrc), None)),
        (true, regex!(r"^.*\.neomutt/neomuttrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Neomuttrc), None)),
        (false, regex!(r"^nginx.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
        (true, regex!(r"^.*etc/nginx/.*$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
        (false, regex!(r"^.*nginx\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
        (true, regex!(r"^.*nginx/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
        (true, regex!(r"^.*usr/local/nginx/conf/.*$"), Pattern::new(FileTypeResolver::Static(FileType::Nginx), None)),
        (false, regex!(r"^.*\.[1-9]$"), Pattern::new(FileTypeResolver::Dynamic(detect::nroff), None)),
        (false, regex!(r"^.*\.ml\.cppo$"), Pattern::new(FileTypeResolver::Static(FileType::OCaml), None)),
        (false, regex!(r"^.*\.mli\.cppo$"), Pattern::new(FileTypeResolver::Static(FileType::OCaml), None)),
        (false, regex!(r"^.*\.opam\.template$"), Pattern::new(FileTypeResolver::Static(FileType::Opam), None)),
        (true, regex!(r"^.*openvpn/.*/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::OpenVpn), None)),
        (false, regex!(r"^.*\.[Oo][Pp][Ll]$"), Pattern::new(FileTypeResolver::Static(FileType::Opl), None)),
        (true, regex!(r"^.*etc/pam\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::PamConf), None)),
        (true, regex!(r"^.*etc/pam\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::PamConf), None)),
        (true, regex!(r"^.*etc/passwd-$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*etc/shadow$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*etc/shadow\.edit$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*var/backups/shadow\.bak$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*var/backups/passwd\.bak$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*etc/passwd$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*etc/passwd\.edit$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (true, regex!(r"^.*etc/shadow-$"), Pattern::new(FileTypeResolver::Static(FileType::Passwd), None)),
        (false, regex!(r"^\.?gitolite\.rc$"), Pattern::new(FileTypeResolver::Static(FileType::Perl), None)),
        (false, regex!(r"^example\.gitolite\.rc$"), Pattern::new(FileTypeResolver::Static(FileType::Perl), None)),
        (false, regex!(r"^.*\.php\d$"), Pattern::new(FileTypeResolver::Static(FileType::Php), None)),
        (false, regex!(r"^.*\.pinforc$"), Pattern::new(FileTypeResolver::Static(FileType::PInfo), None)),
        (true, regex!(r"^.*etc/pinforc$"), Pattern::new(FileTypeResolver::Static(FileType::PInfo), None)),
        (false, regex!(r"^.*\.[Pp][Rr][Gg]$"), Pattern::new(FileTypeResolver::Dynamic(detect::prg), None)),
        (true, regex!(r"^.*etc/protocols$"), Pattern::new(FileTypeResolver::Static(FileType::Protocols), None)),
        (false, regex!(r"^.*printcap.*$"), Pattern::new(FileTypeResolver::Static(FileType::PtcapPrint), None)),
        (true, regex!(r"^.*baseq[2-3]/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Quake), None)),
        (true, regex!(r"^.*quake[1-3]/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Quake), None)),
        (true, regex!(r"^.*id1/.*\.cfg$"), Pattern::new(FileTypeResolver::Static(FileType::Quake), None)),
        (true, regex!(r"^.*queries/.*\.scm$"), Pattern::new(FileTypeResolver::Static(FileType::TreeSitterQuery), None)),
        (false, regex!(r"^.*,v$"), Pattern::new(FileTypeResolver::Static(FileType::Rcs), None)),
        (false, regex!(r"^\.reminders.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Remind), None)),
        (false, regex!(r"^[rR]akefile.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Ruby), None)),
        (false, regex!(r"^[rR]antfile$"), Pattern::new(FileTypeResolver::Static(FileType::Ruby), None)),
        (false, regex!(r"^[rR]akefile$"), Pattern::new(FileTypeResolver::Static(FileType::Ruby), None)),
        (true, regex!(r"^.*etc/sensors\.d/[^.].*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Sensors), None)),
        (true, regex!(r"^.*etc/sensors\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sensors), None)),
        (true, regex!(r"^.*etc/sensors3\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sensors), None)),
        (true, regex!(r"^.*etc/services$"), Pattern::new(FileTypeResolver::Static(FileType::Services), None)),
        (true, regex!(r"^.*etc/serial\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SetSerial), None)),
        (true, regex!(r"^.*etc/udev/cdsymlinks\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sh), None)),
        (false, regex!(r"^\.bash[_-]aliases$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
        (false, regex!(r"^\.bash[_-]logout$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
        (false, regex!(r"^\.bash[_-]profile$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
        (false, regex!(r"^\.kshrc.*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Ksh))), None)),
        (false, regex!(r"^\.profile.*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, None)), None)),
        (true, regex!(r"^.*etc/profile$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, None)), None)),
        (false, regex!(r"^bash-fc[-\.].*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Bash))), None)),
        (false, regex!(r"^\.tcshrc.*$"), Pattern::new(FileTypeResolver::Dynamic(|_, content| detect::sh(content, Some(FileType::Tcsh))), None)),
        (true, regex!(r"^.*etc/sudoers\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Sudoers), None)),
        (false, regex!(r"^.*\._sst\.meta$"), Pattern::new(FileTypeResolver::Static(FileType::Sisu), None)),
        (false, regex!(r"^.*\.-sst\.meta$"), Pattern::new(FileTypeResolver::Static(FileType::Sisu), None)),
        (false, regex!(r"^.*\.sst\.meta$"), Pattern::new(FileTypeResolver::Static(FileType::Sisu), None)),
        (true, regex!(r"^.*etc/slp\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SlpConf), None)),
        (true, regex!(r"^.*etc/slp\.reg$"), Pattern::new(FileTypeResolver::Static(FileType::SlpReg), None)),
        (true, regex!(r"^.*etc/slp\.spi$"), Pattern::new(FileTypeResolver::Static(FileType::SlpSpi), None)),
        (true, regex!(r"^.*etc/ssh/ssh_config\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SshConfig), None)),
        (true, regex!(r"^.*\.ssh/config$"), Pattern::new(FileTypeResolver::Static(FileType::SshConfig), None)),
        (true, regex!(r"^.*\.ssh/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SshConfig), None)),
        (true, regex!(r"^.*etc/ssh/sshd_config\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::SshdConfig), None)),
        (false, regex!(r"^.*\.[Ss][Rr][Cc]$"), Pattern::new(FileTypeResolver::Dynamic(detect::src), None)),
        (true, regex!(r"^.*etc/sudoers$"), Pattern::new(FileTypeResolver::Static(FileType::Sudoers), None)),
        (false, regex!(r"^svn-commit.*\.tmp$"), Pattern::new(FileTypeResolver::Static(FileType::Svn), None)),
        (true, regex!(r"^.*sway/config$"), Pattern::new(FileTypeResolver::Static(FileType::SwayConfig), None)),
        (true, regex!(r"^.*\.sway/config$"), Pattern::new(FileTypeResolver::Static(FileType::SwayConfig), None)),
        (false, regex!(r"^.*\.swift\.gyb$"), Pattern::new(FileTypeResolver::Static(FileType::SwiftGyb), None)),
        (false, regex!(r"^.*\.[Ss][Yy][Ss]$"), Pattern::new(FileTypeResolver::Dynamic(detect::sys), None)),
        (true, regex!(r"^.*etc/sysctl\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sysctl), None)),
        (true, regex!(r"^.*etc/sysctl\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Sysctl), None)),
        (true, regex!(r"^.*systemd/.*\.automount$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.dnssd$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.link$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.mount$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.netdev$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.network$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.nspawn$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.path$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.service$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.slice$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.socket$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.swap$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.target$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*systemd/.*\.timer$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*etc/systemd/.*\.conf\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*\.config/systemd/user/.*\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*etc/systemd/system/.*\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*etc/systemd/system/.*\.d/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*etc/systemd/system/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*\.config/systemd/user/.*\.d/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (true, regex!(r"^.*\.config/systemd/user/\.#.*$"), Pattern::new(FileTypeResolver::Static(FileType::Systemd), None)),
        (false, regex!(r"^.*termcap.*$"), Pattern::new(FileTypeResolver::Static(FileType::PtcapTerm), None)),
        (false, regex!(r"^.*\.t\.html$"), Pattern::new(FileTypeResolver::Static(FileType::Tilde), None)),
        (false, regex!(r"^\.?tmux.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Tmux), None)),
        (false, regex!(r"^\.?tmux.*\.conf.*$"), Pattern::new(FileTypeResolver::Static(FileType::Tmux), Some(-1))),
        (true, regex!(r"^.*\.cargo/config$"), Pattern::new(FileTypeResolver::Static(FileType::Toml), None)),
        (true, regex!(r"^.*\.cargo/credentials$"), Pattern::new(FileTypeResolver::Static(FileType::Toml), None)),
        (true, regex!(r"^.*etc/udev/udev\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::UdevConf), None)),
        (true, regex!(r"^.*etc/udev/permissions\.d/.*\.permissions$"), Pattern::new(FileTypeResolver::Static(FileType::UdevPerm), None)),
        (true, regex!(r"^.*etc/updatedb\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::UpdateDb), None)),
        (true, regex!(r"^.*\.init/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*usr/share/upstart/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*\.config/upstart/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*etc/init/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*etc/init/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*\.config/upstart/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*\.init/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (true, regex!(r"^.*usr/share/upstart/.*\.override$"), Pattern::new(FileTypeResolver::Static(FileType::Upstart), None)),
        (false, regex!(r"^.*\.[Ll][Oo][Gg]$"), Pattern::new(FileTypeResolver::Dynamic(detect::log), None)),
        (false, regex!(r"^.*\.vhdl_[0-9].*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Vhdl), None)),
        (false, regex!(r"^.*\.ws[fc]$"), Pattern::new(FileTypeResolver::Static(FileType::Wsh), None)),
        (true, regex!(r"^.*Xresources/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XDefaults), None)),
        (true, regex!(r"^.*app-defaults/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XDefaults), None)),
        (true, regex!(r"^.*etc/xinetd\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::Xinetd), None)),
        (true, regex!(r"^.*etc/blkid\.tab$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
        (true, regex!(r"^.*etc/blkid\.tab\.old$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
        (false, regex!(r"^.*\.vbproj\.user$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
        (false, regex!(r"^.*\.fsproj\.user$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
        (false, regex!(r"^.*\.csproj\.user$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
        (true, regex!(r"^.*etc/xdg/menus/.*\.menu$"), Pattern::new(FileTypeResolver::Static(FileType::Xml), None)),
        (false, regex!(r"^.*Xmodmap$"), Pattern::new(FileTypeResolver::Static(FileType::XModMap), None)),
        (true, regex!(r"^.*etc/zprofile$"), Pattern::new(FileTypeResolver::Static(FileType::Zsh), None)),
        (false, regex!(r"^.*vimrc.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Vim), None)),
        (false, regex!(r"^Xresources.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XDefaults), None)),
        (true, regex!(r"^.*etc/xinetd\.d/.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Xinetd), None)),
        (false, regex!(r"^.*xmodmap.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::XModMap), None)),
        (true, regex!(r"^.*xorg\.conf\.d/.*\.conf$"), Pattern::new(FileTypeResolver::Static(FileType::XF86Conf4), None)),
        // Increase priority to run before the pattern below
        (false, regex!(r"^XF86Config-4.*$"), Pattern::new(FileTypeResolver::Static(FileType::XF86Conf4), Some(isize::MIN + 1))),
        (false, regex!(r"^XF86Config.*$"), Pattern::starsetf(FileTypeResolver::Dynamic(detect::xfree86), None)),
        (false, regex!(r"^\.zcompdump.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Zsh), None)),
        // .zlog* and zlog*
        (false, regex!(r"^\.?zlog.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Zsh), None)),
        // .zsh* and zsh*
        (false, regex!(r"^\.?zsh.*$"), Pattern::starsetf(FileTypeResolver::Static(FileType::Zsh), None)),
        // Ignored extension
        (false, regex!(r"^.+~$"), Pattern::new(FileTypeResolver::Dynamic(detect::tmp), None)),
    ];
    vec.sort_unstable_by(|(_, _, pat1), (_, _, pat2)| pat2.priority.unwrap_or(0).cmp(&pat1.priority.unwrap_or(0)));
    vec
});