diff options
Diffstat (limited to '')
| -rwxr-xr-x | scripts/build | 487 | ||||
| -rwxr-xr-x | scripts/test | 12 | ||||
| -rw-r--r-- | scripts/test_extensions.vim | 197 | ||||
| -rw-r--r-- | scripts/test_filetypes.vim | 46 | 
4 files changed, 626 insertions, 116 deletions
| diff --git a/scripts/build b/scripts/build index f26fb511..150f45c2 100755 --- a/scripts/build +++ b/scripts/build @@ -6,18 +6,82 @@ require 'yaml'  require 'fileutils'  require 'set'  require 'json' +require 'tsort'  Dir.chdir(File.dirname(__dir__)) -PACKAGES = YAML.load_stream(File.read('packages.yaml')) -  BASE_URL = 'https://raw.githubusercontent.com/github/linguist/master' -DIRS = { -  default: %w(syntax indent doc compiler autoload ftplugin ctags after/syntax after/indent after/ftplugin), -  all: %w(syntax indent compiler autoload ftplugin after extras ctags doc), -  syntax: %w(syntax indent after/syntax after/indent) -} +def camelize(str) +  str.split(/[-_\.]/).map { |a| a.capitalize }.join("") +end + +def except(hash, *keys) +  h = hash.dup +  keys.each { |k| h.delete(k) } +  h +end + +def load_data() +  packages = Hash[YAML.load_stream(File.read('packages.yaml')) +    .group_by { |a| a.fetch("name") } +    .map { |a, b| [a, b.first] }] + +  deps = Hash.new { |h, k| h[k] = [] } + +  for package in packages.values +    for name in [package.fetch("after", [])].flatten +      packages[name] or raise "#{package["name"]} depends on unknown package: #{name}" +      deps[name] << package["name"] +    end +  end + +  each_node = lambda {|&b| packages.keys.each(&b) } +  each_child = lambda {|n, &b| deps[n].each(&b) } + +  languages = load_languages + +  # Reason can have ocaml as interpreter but let's not depend on it... +  languages["Reason"]["interpreters"] -= ["ocaml"] + +  packages = TSort.tsort(each_node, each_child).map { |a| packages[a] } + +  for package in packages +    for filetype in package["filetypes"] +      if filetype["linguist"] +        if filetype["extensions"] +          raise "#{package["name"]} #{filetype["name"]}: extensions can't be set when linguist is defined" +        end + +        if filetype["filenames"] +          raise "#{package["name"]} #{filetype["name"]}: filenames can't be set when linguist is defined" +        end + +        linguist = languages.fetch(filetype["linguist"]) + +        filetype["extensions"] = (linguist["extensions"] || []).map { |e| e[1..-1] } | +          filetype.fetch("extra_extensions", []) - +          filetype.fetch("ignored_extensions", []).uniq + +        filetype["filenames"] = (linguist["filenames"] || []) | +          filetype.fetch("extra_filenames", []) - +          filetype.fetch("ignored_filenames", []).uniq +         +        filetype["interpreters"] = (linguist["interpreters"] || []) | +          filetype.fetch("extra_interpreters", []) - +          filetype.fetch("ignored_interpreters", []).uniq +      else +        filetype["extensions"] ||= [] +        filetype["filenames"] ||= [] +        filetype["interpreters"] ||= [] +      end +    end +  end + +  heuristics = YAML.load_stream(File.read('heuristics.yaml')) + +  [packages, transform_patterns(heuristics)] +end  def parallel(*procs)    threads = procs.map { |p| Thread.new { method(p).call } } @@ -38,17 +102,12 @@ def read_strings(data, keys, print=false)    end  end -def transform_with(data, keys, transfrom=false, &block) -  if data.is_a?(Hash) -    Hash[data.map do |key, val| -      [key, transform_with(val, keys, keys.include?(key), &block)] -    end] -  elsif data.is_a?(Array) -    data.map { |d| transform_with(d, keys, transfrom, &block) } -  elsif data.is_a?(String) -    transfrom ? yield(data) : data -  else -    data +def patterns_to_vim_patterns(patterns) +  stdin, stdout, stderr = Open3.popen3('vim', '-V', '--clean', '/dev/stdin', '-es', '-c', "echo expand('%:p:h') | source #{__dir__}/eregex.vim", '-c', "for line in range(0, line('$')) | call setline(line, ExtendedRegex2VimRegex(getline(line))) | endfor", '-c', ':wq! /dev/stdout', chdir: __dir__) +  stdin.write(patterns.join("\n")) +  stdin.close +  stdout.readlines.map(&:chomp).map do |r| +    r.gsub('\b', '\(\<\|\>\)')    end  end @@ -63,29 +122,21 @@ def each_hash(data, &block)    end  end -def patterns_to_vim_patterns(patterns) -  stdin, stdout, stderr = Open3.popen3('vim', '-V', '--clean', '/dev/stdin', '-es', '-c', "echo expand('%:p:h') | source #{__dir__}/scripts/eregex.vim", '-c', "for line in range(0, line('$')) | call setline(line, ExtendedRegex2VimRegex(getline(line))) | endfor", '-c', ':wq! /dev/stdout', chdir: __dir__) -  stdin.write(patterns.join("\n")) -  stdin.close -  stdout.readlines -end -def transform_patterns(data) -  patterns = read_strings(data, ["pattern", "patterns"]) +def transform_patterns(heuristics) +  patterns = [] +  each_hash(heuristics) do |h| +    if h.has_key?("pattern") +      patterns << h["pattern"] +    end +  end    patterns_mapping = Hash[patterns.zip(patterns_to_vim_patterns(patterns))] -  transform_with(data, ["pattern", "patterns"]) { |a| patterns_mapping[a] } -end - -def load_heuristics -  url = "#{BASE_URL}/lib/linguist/heuristics.yml" -  data = URI.open(url) { |io| YAML.load(io.read) } -  each_hash(data["disambiguations"]) do |h| -    if h.has_key?("named_pattern") -      h["pattern"] = data["named_patterns"].fetch(h["named_pattern"]) -      h.delete("named_pattern") +  each_hash(heuristics) do |h| +    if h.has_key?("pattern") +      h["pattern"] = patterns_mapping.fetch(h["pattern"])      end    end -  transform_patterns(data["disambiguations"]) +  heuristics  end  def load_languages @@ -99,7 +150,6 @@ def parse_remote(remote)  end  def copy_file(package, src, dest) -  return unless [".vim", ".ctags", ".vital", ".txt"].include?(File.extname(src))    FileUtils.mkdir_p(File.dirname(dest))    name = package.fetch("name") @@ -116,17 +166,17 @@ def copy_file(package, src, dest)    end  end -def download -  FileUtils.rm_rf('tmp') - -  PACKAGES.each_slice(20) do |batch| -    batch.map do |package| +def download(packages) +  packages.map { |p| p["remote"] or raise "No remote for: " + p["name"] }.uniq.each_slice(20) do |remotes| +    remotes.map do |remote|        Thread.new do -        repo, branch, path = parse_remote(package.fetch("remote")) -        dir = "tmp/" + repo.split('/')[1] -        FileUtils.mkdir_p(dir) -        url = "https://codeload.github.com/#{repo}/tar.gz/#{branch}" -        `curl --silent -fL #{url} | tar -zx -C "#{dir}" --strip 1` +        repo, branch, path = parse_remote(remote) +        dir = "tmp/" + repo +        unless File.exist?(dir) +          FileUtils.mkdir_p(dir) +          url = "https://codeload.github.com/#{repo}/tar.gz/#{branch}" +          `curl --silent -fL #{url} | tar -zx -C "#{dir}" --strip 1` +        end          progress        end      end.map(&:join) @@ -147,15 +197,116 @@ def progress    end  end -def extract -  FileUtils.rm_rf(DIRS[:all]) +def indent(str, amount) +  str.gsub(/^(?!$)/, " " * amount).gsub(/\s+$/, "").gsub(/^ +\n/, "") +end + +def pattern_to_condition(rule) +  operator = (rule["negative"] ? "!" : "=") + "~" + (rule["ignore_case"] ? "?" : "#") + +  "line #{operator} '#{rule["pattern"]}'" +end + +def rules_to_code(rules) +  output = "" + +  vars = [] +  each_hash(rules) do |h| +    if h.has_key?("set") +      vars << h["set"] +    end +  end + + +  if vars.size > 0 +    output << vars.uniq.sort.map do |var| +      "let #{var} = 0" +    end.join("\n") + "\n" +  end + +  output << rule_to_code(rules) +end + +def rule_to_code(rule) +  if rule.has_key?("lines") +    if rule["lines"] == 1 +      return <<~EOS +        let line = getline(1) + +        #{indent(rule_to_code(except(rule, "lines")), 0)} +      EOS +    else +      return <<~EOS +        for lnum in range(1, min([line("$"), #{rule["lines"]}])) +          let line = getline(lnum) + +        #{indent(rule_to_code(except(rule, "lines")), 2)} +        endfor +      EOS +    end +  end + +  if rule.has_key?("rules") +    return rule["rules"].map { |r| indent(rule_to_code(r), 0) }.join("\n") +  end + +  if rule.has_key?("pattern") +    return <<~EOS +      if #{pattern_to_condition(rule)} +      #{indent(rule_to_code(except(rule, "pattern", "ignore_case", "negative")), 2)} +      endif +    EOS +  end + +  if rule.has_key?("if_set") +    return <<~EOS +      if #{rule["negative"] ? "!" : ""}#{rule["if_set"]} +      #{indent(rule_to_code(except(rule, "if_set", "negative")), 2)} +      endif +    EOS +  end + +  if rule.has_key?("set") +    return <<~EOS +      let #{rule["set"]} = 1 +      #{indent(rule_to_code(except(rule, "set")), 0)} +    EOS +  end + +  if (rule.keys - ["filetype", "override", "set"]).size > 0 +    raise "Unknown rule: #{JSON.generate(rule)}" +  end +   +  if rule.has_key?("override") +    return <<~EOS +      if exists("#{rule["override"]}") +        exe "setf " . #{rule["override"]} | return +      endif +    EOS +  end + +  if rule.has_key?("filetype") +    return "setf #{rule["filetype"]} | return" +  end + +  return "" +end + +def extract(packages) +  all_dirs = %w(syntax indent doc compiler autoload ftplugin ctags extras after) + +  default_dirs = %w( +    syntax indent doc compiler autoload ftplugin ctags extras +    after/syntax after/indent after/ftplugin +  ) + +  FileUtils.rm_rf(all_dirs)    output = [] -  PACKAGES.map do |package| +  packages.map do |package|      repo, branch, path = parse_remote(package["remote"]) -    dir = "tmp/" + repo.split('/')[1] -    subdirs = [] -    dirs = DIRS.fetch(package.fetch("dirs", "default").to_sym) +    dir = "tmp/" + repo +    dirs = package.fetch("dirs", default_dirs)      ignored_dirs = package.fetch("ignored_dirs", [])      if ignored_dirs.size > 0        dirs = dirs.reject { |d| ignored_dirs.any? { |id| d.start_with?(id) } } @@ -165,18 +316,31 @@ def extract        subtree = "#{dir}/#{path ? path + "/" : ""}"        subpath = "#{subtree}#{subdir}"        if FileTest.directory?(subpath) -        Dir.glob("#{subdir}/**/*", base: subtree).each do |p| +        if repo == "vim/vim" && (["glob", "globs"] & package.keys).size == 0 +          raise "Package from vim/vim should define glob or globs: #{package["name"]}" +        end +        glob = package.fetch("glob", package.fetch('globs', '**/*.{vim,ctags,vital,txt}')) +        Dir.glob("#{subdir}/#{glob}", base: subtree).each do |p|            next unless File.file?("#{subtree}/#{p}") +          if p.include?("samba") +            raise package["name"] +          end            copy_file(package, "#{subtree}/#{p}", p)          end - -        subdirs << subdir.split("/").last        elsif File.exist?(subpath)          copy_file(package, subpath, subdir)        end      end -    output << "- [#{package["name"]}](https://github.com/#{repo}) (#{subdirs.uniq.join(", ")})" +    if branch != "master" || path +      if path +        output << "- [#{package["name"]}](https://github.com/#{repo}/tree/#{branch}/#{path})" +      else +        output << "- [#{package["name"]}](https://github.com/#{repo}/tree/#{branch})" +      end +    else +      output << "- [#{package["name"]}](https://github.com/#{repo})" +    end      progress    end @@ -195,16 +359,23 @@ def extract    File.write('README.md', readme)  end -def generate_ftdetect -  heuristics, languages = parallel(:load_heuristics, :load_languages) - +def generate_ftdetect(packages, heuristics)    output = <<~EOS      " don't spam the user when Vim is started in Vi compatibility mode      let s:cpo_save = &cpo      set cpo&vim -    if !exists('g:polyglot_disabled') -      let g:polyglot_disabled = [] +    " Disable all native vim ftdetect +    if exists('g:polyglot_test') +      autocmd! +    endif + +    let s:disabled_packages = {} + +    if exists('g:polyglot_disabled') +      for pkg in g:polyglot_disabled +        let s:disabled_packages[pkg] = 1 +      endfor      endif      function! s:SetDefault(name, value) @@ -248,47 +419,55 @@ def generate_ftdetect        call s:SetDefault('g:python_highlight_file_headers_as_comments', 1)        call s:SetDefault('g:python_slow_sync', 1)      endif -    EOS -  ambiguous_extensions = PACKAGES.flat_map { |e| e["filetypes"] }.flat_map do |e| -    if e["linguist"] -      ((languages[e["linguist"]]["extensions"] || []).map { |e| e[1..-1] } | e.fetch("extra_extensions", [])) - e.fetch("ignored_extensions", []) -    else -      e.fetch("extensions", []) +  extensions = Hash.new { |h, k| h[k] = [] } + +  for package in packages +    for filetype in package["filetypes"] +      for ext in filetype["extensions"] +        extensions[ext] << filetype["name"] +      end      end -  end.group_by(&:itself).transform_values(&:count).select { |a, b| b > 1 }.keys.to_set +  end + +  ambiguous_extensions = extensions +    .select { |a, b| b.uniq.size > 1 }.keys.sort    expected_filetypes = detect_filetypes -  for package in PACKAGES +  for package in packages      name = package.fetch("name") -    output << if name == "jsx" -      "if !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)\n" -    else -      "if index(g:polyglot_disabled, '#{name}') == -1\n" -    end + +    output << "if !has_key(s:disabled_packages, '#{name}')\n"      filetypes = package["filetypes"] or raise "Unknown filetype for: #{package["name"]}" +    package_heuristics = [] +      for filetype in filetypes        name = filetype.fetch("name") -      syntax = filetype["syntax"] ? " syntax=#{filetype["syntax"]}" : "" -      set_command = package.fetch("custom_set", "set ft=#{name}#{syntax}") +      syntax = filetype["syntax"] ? " | set syntax=#{filetype["syntax"]}" : "" -      linguist = filetype["linguist"] ? languages.fetch(filetype["linguist"]) : {} -      extensions = filetype["extensions"] || linguist.fetch("extensions", []).map { |e| e[1..] } -      extensions = (extensions | filetype.fetch("extra_extensions", [])) - filetype.fetch("ignored_extensions", []) +      set_command = "setf #{name}" -      filenames = filetype["filenames"] || linguist.fetch("filenames", []) -      filenames = (filenames | filetype.fetch("extra_filenames", [])) - filetype.fetch("ignored_filenames", []) +      if filetype["syntax"] +        set_command = "if !did_filetype() | set ft=#{name} syntax=#{filetype["syntax"]} | endif" +      end + +      if filetype["custom_set"] +        set_command = filetype["custom_set"] +      end + +      extensions = filetype["extensions"] +      filenames = filetype["filenames"]        if expected_filetypes[name] && !filetype["syntax"]          for e in expected_filetypes.fetch(name)[:extensions] - extensions - expand_all(filetype.fetch("ignored_extensions", []))            puts "Probable missing extension for #{name}: #{e}"          end -        for e in expand_all(expected_filetypes.fetch(name)[:filenames]) - expand_all(filenames).flat_map { |e| [e, e.gsub(/^\./, '')] } - expand_all(filetype.fetch("ignored_filenames", [])) - ['*'] +        for e in expected_filetypes.fetch(name)[:filenames] - expand_all(filenames).flat_map { |e| [e, e.gsub(/^\./, '')] } - expand_all(filetype.fetch("ignored_filenames", [])) - ['*']            puts "Probable missing filename for #{name}: #{e}"          end        end @@ -300,9 +479,14 @@ def generate_ftdetect            output << "  au BufReadPre *.*.#{extension} execute \"do BufRead filetypedetect \" . expand(\"<afile>:r\") | #{outer_filetype}\n"          end -        if ambiguous_extensions.include?(extension) -          output << "  au BufNewFile,BufRead *.#{extension} setf #{filetype["name"]}\n" +        heuristic = heuristics.find { |h| h["extensions"].include?(extension) } +        if heuristic +          package_heuristics << heuristic          else +          # if ambiguous_extensions.include?(extension) +          #   puts "Ambiguous extension without heuristic: #{extension} => #{filetype["name"]}" +          # end +          #            output << "  au BufNewFile,BufRead *.#{extension} #{set_command}\n"          end        end @@ -315,25 +499,114 @@ def generate_ftdetect        end      end +    for heuristic in package_heuristics.uniq +      extensions = heuristic["extensions"].map { |e| "*.#{e}" } +      output << "  au! BufNewFile,BufRead #{extensions.join(",")} call polyglot#Detect#{camelize(heuristic["extensions"].first)}Filetype()\n" +    end +      output << "endif\n\n"    end    output << <<~EOS +    au BufNewFile,BufRead,StdinReadPost *  +      \\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat  +      \\ | call polyglot#Heuristics() | endif +      " restore Vi compatibility settings      let &cpo = s:cpo_save      unlet s:cpo_save    EOS -  # filetypes = detect_filetypes -  # -  # for filetype in filetypes -  #    -  # end -    File.write('ftdetect/polyglot.vim', output) + +  output = <<~EOS +    " Line continuation is used here, remove 'C' from 'cpoptions' +    let s:cpo_save = &cpo +    set cpo&vim + +    func! polyglot#Heuristics() +      " Try to detect filetype from shebang +      let l:filetype = polyglot#Shebang() +      if l:filetype != "" +        exec "setf " . l:filetype +        return +      endif +    endfunc +     +    let s:interpreters = { +    EOS + +    for filetype in packages.flat_map { |p| p.fetch("filetypes", []) }.sort_by { |a| a["name"] } +      for interpreter in filetype["interpreters"] +        output << "  \\ '#{interpreter}': '#{filetype["name"]}',\n" +      end +    end + +  output << <<~EOS +      \\ } + +    let s:r_hashbang = '^#!\\s*\\(\\S\\+\\)\\s*\\(.*\\)\\s*' +    let s:r_envflag = '%(\\S\\+=\\S\\+\\|-[iS]\\|--ignore-environment\\|--split-string\\)' +    let s:r_env = '^\\%(\\' . s:r_envflag . '\\s\\+\\)*\\(\\S\\+\\)' + +    func! polyglot#Shebang() +      let l:line1 = getline(1) + +      if l:line1 !~# "^#!" +        return +      endif + +      let l:pathrest = matchlist(l:line1, s:r_hashbang) + +      if len(l:pathrest) == 0 +        return  +      endif + +      let [_, l:path, l:rest; __] = l:pathrest + +      let l:script = split(l:path, "/")[-1] + +      if l:script == "env" +        let l:argspath = matchlist(l:rest, s:r_env) +        if len(l:argspath) == 0 +          return +        endif + +        let l:script = l:argspath[1] +      endif + +      if has_key(s:interpreters, l:script) +        return s:interpreters[l:script] +      endif + +      for interpreter in keys(s:interpreters) +        if l:script =~# '^' . interpreter +          return s:interpreters[interpreter] +        endif +      endfor +    endfunc + +  EOS + +  for heuristic in heuristics +    output << <<~EOS +      func! polyglot#Detect#{camelize(heuristic["extensions"].first)}Filetype() +      #{indent(rules_to_code(heuristic), 2)} +      endfunc + +    EOS +  end + +  output << <<~EOS +    " Restore 'cpoptions' +    let &cpo = s:cpo_save +    unlet s:cpo_save +  EOS + +  File.write('autoload/polyglot.vim', output)  end -def generate_tests +def generate_tests(packages)    output = <<~EOS      function! TestFiletype(filetype)        try @@ -349,7 +622,7 @@ def generate_tests    EOS -  for package in PACKAGES +  for package in packages      for filetype in package.fetch("filetypes", [])        output << "call TestFiletype('#{filetype["name"]}')\n"      end @@ -407,7 +680,7 @@ def expand_all(pattern)  end  def detect_filetypes -  filetypes = Dir['tmp/*/ftdetect/*.vim'].flat_map do |file| +  filetypes = Dir['tmp/**/ftdetect/*.vim'].flat_map do |file|      contents = File.read(file).gsub(/^\s*au(tocmd)?!?\s*$/, '')      results = contents.scan(/^\s*(?:au!|au|au[^g][^ ]*) +(?:\S+)\s+(\S+)[\s\\]+([^\n]+)/)      results = results.map do |a, b| @@ -427,14 +700,24 @@ def detect_filetypes    end.group_by { |a, b| a }.map { |a, b| [a, b.map { |c, d| d }] }.map { |a, b|      [a, {        extensions: b.select { |x| x.match(/^\*\.[^\/]+$/) }.map { |a| a.strip[2..] }, -      filenames: b.select { |x| !x.match(/^\*\.[^\/]+$/) } +      filenames: expand_all(b.select { |x| !x.match(/^\*\.[^\/]+$/) })      }]    }]  end -download -extract -generate_ftdetect -generate_tests -puts(" Bye! Have a wonderful time!") -FileUtils.rm_rf("tmp") +if __FILE__ == $0 +  if !ENV["DEV"] +    FileUtils.rm_rf("tmp") +  end + +  packages, heuristics = load_data() +  download(packages) +  extract(packages) +  generate_ftdetect(packages, heuristics) +  generate_tests(packages) +  puts(" Bye! Have a wonderful time!") + +  if !ENV["DEV"] +    FileUtils.rm_rf("tmp") +  end +end diff --git a/scripts/test b/scripts/test index 88a2e973..97480439 100755 --- a/scripts/test +++ b/scripts/test @@ -2,12 +2,10 @@  set -e -vim --clean -N --cmd " -  filetype plugin indent on -  syntax enable +vim --clean -N -u <(echo "    let &rtp='$PWD,'.&rtp -  source ftdetect/polyglot.vim +  let g:polyglot_test = 1    source scripts/test_extensions.vim -  source scripts/test_filetypes.vim -  exec ':q!' -" +  \"source scripts/test_filetypes.vim +  qa! +") diff --git a/scripts/test_extensions.vim b/scripts/test_extensions.vim index c7a22025..cb52bef8 100644 --- a/scripts/test_extensions.vim +++ b/scripts/test_extensions.vim @@ -1,16 +1,209 @@  function! TestExtension(filetype, filename, content)    try -    exec "e " . a:filename +    let g:message = "" +    exec "noautocmd n " . a:filename +    put =a:content +    1delete _ +    filetype detect      exec "if &filetype != '" . a:filetype . "' \nthrow &filetype\nendif" +    exec ":bw!"    catch +    echo g:message      echo 'Filename "' . a:filename  . '" does not resolve to extension "' . a:filetype . '"'      echo '  instead received: "' . v:exception . '"'      exec ':cq!'    endtry  endfunction +call TestExtension('sh', 'bash1', "#!/bin/bash") +call TestExtension('sh', 'bash2', "#! /bin/bash") +call TestExtension('sh', 'bash3', "#! /bin/bash2.3") +call TestExtension('sh', 'bash4', "#!/usr/bin/env bash") +call TestExtension('sh', 'bash6', "#!/usr/bin/env -i -=split-string foo=bar bash -l foo") +call TestExtension('sh', 'bash1', "#!/bin/bash") + +" Vim help file +call TestExtension('help', $VIMRUNTIME . '/doc/foobar.txt', '') + +" Abaqus or Trasys +call TestExtension('abaqus', 'foobar.inp', "*HEADING\nFoobar") +call TestExtension('trasys', 'foobar.inp', "MSC PATRAN\n* foobar\nHEADER SURFACE DATA\nBSC ENCLO1") + +" 8th (Firth-derivative) +call TestExtension('8th', 'foobar.8th', '') +call TestExtension('8th', 'foobar.8th', '') + +" A-A-P recipe +call TestExtension('aap', 'foobar.aap', '') + + +" A2ps printing utility +call TestExtension('a2ps', '/etc/a2ps.cfg', '') +call TestExtension('a2ps', '/usr/local/etc/a2ps.cfg', '') +call TestExtension('a2ps', '/etc/a2ps/foobar.cfg', '') +call TestExtension('a2ps', '/usr/local/etc/a2ps/foobar.cfg', '') +call TestExtension('a2ps', '/tmp/a2psrc', '') +call TestExtension('a2ps', '/tmp/.a2psrc', '') + +" ABAB/4 +call TestExtension('abap', 'foobar.abap', '') + +" ABC music notation +call TestExtension('abc', 'foobar.abc', '') + +" ABEL +call TestExtension('abel', 'foobar.abl', '') + +" AceDB +call TestExtension('acedb', 'foobar.wrm', '') + +" Ada (83, 9X, 95) +call TestExtension('ada', 'foobar.adb', '') +call TestExtension('ada', 'foobar.ads', '') +call TestExtension('ada', 'foobar.ada', '') +call TestExtension('ada', 'foobar.gpr', '') + +" AHDL +call TestExtension('ahdl', 'foobar.tdf', '') + +" AIDL +call TestExtension('aidl', 'foobar.aidl', '') + +" AMPL +call TestExtension('ampl', 'foobar.run', '') + +" Ant +call TestExtension('ant', 'build.xml', '') + +" Arduino +call TestExtension('arduino', 'foobar.ino', '') +call TestExtension('arduino', 'foobar.pde', '') + +" Apache config file +call TestExtension('apache', '.htaccess', '') +call TestExtension('apache', '/etc/httpd/foobar.conf', '') +call TestExtension('apache', '/etc/apache2/sites-foobar/foobar.com', '') +call TestExtension('apache', '/usr/local/etc/httpd/foobar.conf', '') +call TestExtension('apache', '/usr/local/etc/apache2/sites-foobar/foobar.com', '') + +" XA65 MOS6510 cross assembler +call TestExtension('a65', 'foobar.a65', '') + +" Applescript +call TestExtension('applescript', 'foobar.scpt', '') + +" Applix ELF +call TestExtension('elf', 'foobar.am', '') +call TestExtension('automake', 'Makefile.am', '') +call TestExtension('automake', 'makefile.am', '') + +" ALSA configuration +call TestExtension('alsaconf', '.asoundrc', '') +call TestExtension('alsaconf', '/usr/share/alsa/alsa.conf', '') +call TestExtension('alsaconf', '/media/foo/usr/share/alsa/alsa.conf', '') +call TestExtension('alsaconf', '/etc/asound.conf', '') +call TestExtension('alsaconf', '/media/foo/etc/asound.conf', '') + +" Arc Macro Language +call TestExtension('aml', 'foobar.aml', '') + +" APT config file +call TestExtension('aptconf', 'apt.conf', '') +call TestExtension('aptconf', '/root/.aptitude/config', '') +call TestExtension('aptconf', '/etc/apt/apt.conf.d/foo_bar-12', '') +call TestExtension('aptconf', '/etc/apt/apt.conf.d/foo_bar-12.conf', '') +call TestExtension('', '/etc/apt/apt.conf.d/.gsdf', '') + +" Arch Inventory file +call TestExtension('arch', '.arch-inventory', '') +call TestExtension('arch', '=tagging-method', '') + +" ART*Enterprise (formerly ART-IM) +call TestExtension('art', 'foobar.art', '') + +" AsciiDoc +call TestExtension('asciidoc', 'foobar.asciidoc', '') +call TestExtension('asciidoc', 'foobar.adoc', '') + +" ASN.1 +call TestExtension('asn', 'foobar.asn', '') +call TestExtension('asn', 'foobar.asn1', '') + +" Active Server Pages (with Visual Basic Script) +call TestExtension('aspvbs', 'foobar.asa', '') +let g:filetype_asa = 'fizfuz' +call TestExtension('fizfuz', 'foobar.asa', '') + +" Active Server Pages (with Perl or Visual Basic Script) +call TestExtension('aspvbs', 'vbs.asp', "") +call TestExtension('aspperl', 'perl.asp', "<Job ID=\"DropFiles\">\n<script language=\"PerlScript\">\n</script>\n</Job>") +let g:filetype_asp = 'fizfuz' +call TestExtension('fizfuz', 'fizfuz.asp', '') + + +" Grub (must be before catch *.lst) +call TestExtension('grub', '/boot/grub/menu.lst', '') +call TestExtension('grub', '/media/foobar/boot/grub/menu.lst', '') +call TestExtension('grub', '/boot/grub/grub.conf', '') +call TestExtension('grub', '/media/foobar/boot/grub/grub.conf', '') +call TestExtension('grub', '/etc/grub.conf', '') +call TestExtension('grub', '/media/foobar/etc/grub.conf', '') + +" Assembly (all kinds) +" *.lst is not pure assembly, it has two extra columns (address, byte codes) + +au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst	call dist#ft#FTasm() + +" Macro (VAX) +call TestExtension('vmasm', 'foobar.mar', '') + +" Atlas +call TestExtension('atlas', 'foobar.atl', '') +call TestExtension('atlas', 'foobar.as', '') + +" Autoit v3 +call TestExtension('autoit', 'foobar.au3', '') + +" Autohotkey +call TestExtension('autohotkey', 'foobar.ahk', '') + +" Automake +call TestExtension('automake', 'Makefile.am', '') +call TestExtension('automake', 'makefile.am', '') +call TestExtension('automake', 'GNUmakefile.am', '') + +" Autotest .at files are actually m4 +call TestExtension('m4', 'foobar.at', '') + +" Avenue +call TestExtension('ave', 'foobar.ave', '') + +" Awk +call TestExtension('awk', 'foobar.awk', '') + +" vim-polyglot only  call TestExtension('blade', 'test.blade.php', '')  call TestExtension('yaml.ansible', 'playbook.yml', '')  call TestExtension('yaml.ansible', 'host_vars/foobar', '') -call TestExtension('yaml.ansible', 'handlers.foo.yaml', '') +call TestExtension('yaml.ansible', 'handlers.foobar.yaml', '')  call TestExtension('yaml.ansible', 'requirements.yaml', '') +call TestExtension('ps1xml', 'foobar.ps1xml', '') + +" .m extension +call TestExtension('octave', 'matlab.m', '') +call TestExtension('objc', 'objc.m', "\n\n  #import <Foundation/Foundation.h>") +call TestExtension('octave', 'objc.m', "results_ub_times=zeros(2,2,M);\n%results pour la lower bound") +call TestExtension('mma', 'mathematica.m', "newcase[ \"00003\" ];\n  (* Hello world *)") +call TestExtension('murphi', 'murphi.m', "type\n  square: 1 .. 9") +call TestExtension('murphi', 'murphi.m', "something\n--foobar") +call TestExtension('octave', 'percentcomment.m', "hello world\n%foobar") +call TestExtension('objc', 'comment.m', "\n/* Hello world */") +let g:filetype_m = 'fizfuz' +call TestExtension('fizfuz', 'fizfuz.m', '') + +" .fs extension +call TestExtension('forth', 'empty.fs', '') +call TestExtension('fsharp', 'fsharp.fs', "let myInt = 5") +call TestExtension('glsl', 'glsl.fs', "//#version 120\nvoid main() {}") +let g:filetype_fs = 'fizfuz' +call TestExtension('fizfuz', 'fizfuz.fs', '') diff --git a/scripts/test_filetypes.vim b/scripts/test_filetypes.vim index 53a21af4..a9bae396 100644 --- a/scripts/test_filetypes.vim +++ b/scripts/test_filetypes.vim @@ -10,12 +10,40 @@ function! TestFiletype(filetype)    endtry  endfunction +call TestFiletype('8th') +call TestFiletype('a2ps') +call TestFiletype('a65') +call TestFiletype('aap') +call TestFiletype('abap') +call TestFiletype('abaqus') +call TestFiletype('abc') +call TestFiletype('abel') +call TestFiletype('acedb')  call TestFiletype('asl') +call TestFiletype('ada') +call TestFiletype('ahdl') +call TestFiletype('aidl') +call TestFiletype('alsaconf') +call TestFiletype('aml') +call TestFiletype('ampl') +call TestFiletype('ant') +call TestFiletype('apache')  call TestFiletype('apiblueprint')  call TestFiletype('applescript') +call TestFiletype('aptconf') +call TestFiletype('arch')  call TestFiletype('arduino') +call TestFiletype('art')  call TestFiletype('asciidoc')  call TestFiletype('autohotkey') +call TestFiletype('automake') +call TestFiletype('asn') +call TestFiletype('aspvbs') +call TestFiletype('aspperl') +call TestFiletype('atlas') +call TestFiletype('autoit') +call TestFiletype('ave') +call TestFiletype('awk')  call TestFiletype('c')  call TestFiletype('cpp')  call TestFiletype('caddyfile') @@ -32,6 +60,7 @@ call TestFiletype('cucumber')  call TestFiletype('cuesheet')  call TestFiletype('dart')  call TestFiletype('dhall') +call TestFiletype('grub')  call TestFiletype('d')  call TestFiletype('dcov')  call TestFiletype('dd') @@ -39,6 +68,7 @@ call TestFiletype('ddoc')  call TestFiletype('dsdl')  call TestFiletype('Dockerfile')  call TestFiletype('yaml.docker-compose') +call TestFiletype('elf')  call TestFiletype('elixir')  call TestFiletype('eelixir')  call TestFiletype('elm') @@ -49,6 +79,7 @@ call TestFiletype('fennel')  call TestFiletype('ferm')  call TestFiletype('fish')  call TestFiletype('fbs') +call TestFiletype('forth')  call TestFiletype('fsharp')  call TestFiletype('gdscript3')  call TestFiletype('gitconfig') @@ -95,13 +126,16 @@ call TestFiletype('llvm')  call TestFiletype('tablegen')  call TestFiletype('log')  call TestFiletype('lua') +call TestFiletype('m4')  call TestFiletype('mako') +call TestFiletype('octave')  call TestFiletype('mma')  call TestFiletype('markdown')  call TestFiletype('markdown.mdx')  call TestFiletype('meson')  call TestFiletype('dosini')  call TestFiletype('moon') +call TestFiletype('murphi')  call TestFiletype('nginx')  call TestFiletype('nim')  call TestFiletype('nix') @@ -115,17 +149,16 @@ call TestFiletype('ocamlbuild_tags')  call TestFiletype('ocpbuild')  call TestFiletype('ocpbuildroot')  call TestFiletype('sexplib') -call TestFiletype('octave')  call TestFiletype('opencl')  call TestFiletype('perl')  call TestFiletype('sql')  call TestFiletype('sql')  call TestFiletype('cql') -call TestFiletype('php')  call TestFiletype('blade') +call TestFiletype('php')  call TestFiletype('plantuml')  call TestFiletype('pony') -call TestFiletype('powershell') +call TestFiletype('ps1')  call TestFiletype('ps1xml')  call TestFiletype('proto')  call TestFiletype('pug') @@ -181,13 +214,16 @@ call TestFiletype('vala')  call TestFiletype('vbnet')  call TestFiletype('vcl')  call TestFiletype('velocity') +call TestFiletype('vmasm')  call TestFiletype('vue')  call TestFiletype('xdc')  call TestFiletype('xml')  call TestFiletype('xsl') -call TestFiletype('yaml')  call TestFiletype('yaml.ansible') +call TestFiletype('yaml')  call TestFiletype('helm') +call TestFiletype('help')  call TestFiletype('zephir') -call TestFiletype('zig')  call TestFiletype('zir') +call TestFiletype('zig') +call TestFiletype('trasys') | 
