Write heuristics for perl, closes #550

This commit is contained in:
Adam Stankiewicz
2020-09-16 15:50:39 +02:00
parent 271679272c
commit 17c2b630e1
16 changed files with 1035 additions and 42 deletions

View File

@@ -263,7 +263,7 @@ def rule_to_code(rule)
if rule.has_key?("lines")
if rule["lines"] == 1
return <<~EOS
let line = getline(1)
let line = getline(nextnonblank(1))
#{indent(rule_to_code(except(rule, "lines")), 0)}
EOS
@@ -423,6 +423,7 @@ def generate_ftdetect(packages, heuristics)
expected_filetypes = expected_filetypes.select { |e| filetype_names.include?(e["name"]) }
native_extensions = Set.new(native_filetypes.flat_map { |f| f["extensions"] || [] })
native_filenames = Set.new(native_filetypes.flat_map { |f| f["filenames"] || [] })
for package in packages
name = package.fetch("name")
@@ -435,6 +436,12 @@ def generate_ftdetect(packages, heuristics)
to_disable << "*." + extension
end
end
for filename in filetype["filenames"]
if native_filenames.include?(filename)
to_disable << filename
end
end
end
if to_disable.size > 0
@@ -457,7 +464,7 @@ def generate_ftdetect(packages, heuristics)
set_command = "call s:Setf('#{name}')"
if filetype["syntax"]
set_command = "if !did_filetype() | set ft=#{name} syntax=#{filetype["syntax"]} | endif"
set_command = "set ft=#{name} syntax=#{filetype["syntax"]}"
end
if filetype["custom_set"]
@@ -544,11 +551,11 @@ def generate_ftdetect(packages, heuristics)
endif
endfunc
func! polyglot#Heuristics()
func! polyglot#Shebang()
" Try to detect filetype from shebang
let l:filetype = polyglot#Shebang()
if l:filetype != ""
exec "setf " . l:filetype
let ft = polyglot#ShebangFiletype()
if ft != ""
call s:Setf(ft)
return 1
endif
@@ -571,7 +578,7 @@ def generate_ftdetect(packages, heuristics)
let s:r_envflag = '%(\\S\\+=\\S\\+\\|-[iS]\\|--ignore-environment\\|--split-string\\)'
let s:r_env = '^\\%(\\' . s:r_envflag . '\\s\\+\\)*\\(\\S\\+\\)'
func! polyglot#Shebang()
func! polyglot#ShebangFiletype()
let l:line1 = getline(1)
if l:line1 !~# "^#!"

View File

@@ -15,6 +15,12 @@ function! TestExtension(filetype, filename, content)
endtry
endfunction
" make sure native vim scripts.vim is respected
call TestExtension("rib", "renderman", "##RenderMan")
" make sure case of file does matter when recognizing file
call TestExtension("ruby", "scripts/build", "#!/usr/bin/env ruby")
call TestExtension("sh", "bash1", "#!/bin/bash")
call TestExtension("sh", "bash2", "#! /bin/bash")
call TestExtension("sh", "bash3", "#! /bin/bash2.3")
@@ -279,3 +285,72 @@ call TestExtension("c", "foo.h", "")
unlet g:c_syntax_for_h
let g:ch_syntax_for_h = 1
call TestExtension("ch", "foo.h", "")
" perl
call TestExtension("perl", "empty.plx", "")
call TestExtension("perl", "empty.al", "")
call TestExtension("perl", "empty.psgi", "")
call TestExtension("pod", "empty.pod", "")
" raku
call TestExtension("raku", "empty.p6", "")
call TestExtension("raku", "empty.pm6", "")
call TestExtension("raku", "empty.pl6", "")
call TestExtension("raku", "empty.raku", "")
call TestExtension("raku", "empty.rakumod", "")
call TestExtension("raku", "empty.pod6", "")
call TestExtension("raku", "empty.rakudoc", "")
call TestExtension("raku", "empty.rakutest", "")
call TestExtension("raku", "empty.t6", "")
" .pm extension
call TestExtension("perl", "empty.pm", "")
call TestExtension("perl", "strict.pm", " use strict hello;")
call TestExtension("perl", "use5.pm", " use 5;")
call TestExtension("perl", "usev5.pm", " use v5;")
call TestExtension("raku", "script.pm", "#!/usr/bin/env perl6\nprint('Hello world')")
call TestExtension("raku", "class.pm", " class Class {}")
call TestExtension("raku", "module.pm", " module foobar")
call TestExtension("xpm", "xpm.pm", "/* XPM */")
call TestExtension("xpm2", "xpm2.pm", "/* XPM2 */")
let g:filetype_pm = "fizfuz"
call TestExtension("fizfuz", "fizfuz.pm", "")
" .pl extension
call TestExtension("perl", "empty.pl", "")
call TestExtension("prolog", "comment.pl", "% hello world")
call TestExtension("prolog", "comment2.pl", "/* hello world */")
call TestExtension("prolog", "statement.pl", "happy(vincent). ")
call TestExtension("prolog", "statement2.pl", "nearbychk(X,Y) :- Y is X-1.")
call TestExtension("perl", "strict.pl", " use strict hello;")
call TestExtension("perl", "use5.pl", " use 5;")
call TestExtension("perl", "usev5.pl", " use v5;")
call TestExtension("raku", "script.pl", "#!/usr/bin/env perl6\nprint('Hello world')")
call TestExtension("raku", "class.pl", " class Class {}")
call TestExtension("raku", "module.pl", " module foobar")
let g:filetype_pl = "fizfuz"
call TestExtension("fizfuz", "fizfuz.pl", "")
" .t extension
call TestExtension("perl", "empty.t", "")
call TestExtension("perl", "strict.t", " use strict hello;")
call TestExtension("perl", "use5.t", " use 5;")
call TestExtension("perl", "usev5.t", " use v5;")
call TestExtension("raku", "script.t", "#!/usr/bin/env perl6\nprint('Hello world')")
call TestExtension("raku", "class.t", " class Class {}")
call TestExtension("raku", "module.t", " module foobar")
call TestExtension("nroff", "module.t", ".nf\n101 Main Street")
let g:filetype_t = "fizfuz"
call TestExtension("fizfuz", "fizfuz.t", "")
" .tt2 extension
call TestExtension("tt2", "empty.tt2", "")
call TestExtension("tt2html", "doctype.tt2", "<!DOCTYPE HTML>")
call TestExtension("tt2html", "percent.tt2", "<%filter>")
call TestExtension("tt2html", "html.tt2", "<html>")
" .html extension
call TestExtension("html", "empty.html", "")
call TestExtension("mason", "mason1.html", "% my $planet = 42;")
call TestExtension("mason", "mason2.html", "<%filter></%filter>")

View File

@@ -154,6 +154,11 @@ call TestFiletype('sexplib')
call TestFiletype('octave')
call TestFiletype('opencl')
call TestFiletype('perl')
call TestFiletype('pod')
call TestFiletype('mason')
call TestFiletype('tt2')
call TestFiletype('tt2html')
call TestFiletype('xs')
call TestFiletype('sql')
call TestFiletype('cql')
call TestFiletype('php')
@@ -232,3 +237,6 @@ call TestFiletype('basic')
call TestFiletype('vb')
call TestFiletype('dosini')
call TestFiletype('odin')
call TestFiletype('bzl')
call TestFiletype('prolog')
call TestFiletype('tads')