diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/build | 304 | ||||
| -rw-r--r-- | scripts/eregex.vim | 1102 | ||||
| -rwxr-xr-x | scripts/test | 19 | 
3 files changed, 1425 insertions, 0 deletions
| diff --git a/scripts/build b/scripts/build new file mode 100755 index 00000000..125fa310 --- /dev/null +++ b/scripts/build @@ -0,0 +1,304 @@ +#!/usr/bin/env ruby + +require 'open-uri' +require 'open3' +require 'yaml' +require 'fileutils' + +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 compiler autoload ftplugin ctags after/syntax after/indent after/ftplugin), +  all: %w(syntax indent compiler autoload ftplugin after extras ctags), +  basic: %w(syntax compiler indent after/syntax after/indent), +  syntax: %w(syntax indent after/syntax after/indent), +  noafter: %w(syntax compiler indent autoload ftplugin), +  javascript: %w(syntax indent compiler autoload ftplugin ctags after/syntax after/indent after/ftplugin extras), +  go: %w(autoload/go/config.vim syntax compiler indent after/syntax after/indent) +} + +def parallel(*procs) +  threads = procs.map { |p| Thread.new { method(p).call } } +  threads.map(&:join).map(&:value) +end + +def read_strings(data, keys, print=false) +  if data.is_a?(Hash) +    data.flat_map do |key, val| +      read_strings(val, keys, keys.include?(key)) +    end +  elsif data.is_a?(Array) +    data.flat_map { |d| read_strings(d, keys, print) } +  elsif data.is_a?(String) +    print ? [data] : [] +  else +    [] +  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 +  end +end + +def each_hash(data, &block) +  if data.is_a?(Hash) +    yield data +    data.each do |key, val| +      each_hash(val, &block) +    end +  elsif data.is_a?(Array) +    data.map { |d| each_hash(d, &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"]) +  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") +    end +  end +  transform_patterns(data["disambiguations"]) +end + +def load_languages +  url = "#{BASE_URL}/lib/linguist/languages.yml" +  data = URI.open(url) { |io| YAML.load(io.read) } +end + +def parse_remote(remote) +  match = remote.match(/(?<repo>[^@:]+)(?:@(?<branch>[^:]+))?(?::(?<path>.*))?/) +  [match[:repo], match[:branch] || "master", match[:path]] +end + +def copy_file(package, src, dest) +  return unless [".vim", ".ctags", ".vital"].include?(File.extname(src)) +  FileUtils.mkdir_p(File.dirname(dest)) +  name = package.fetch("name") + +  open(src, "r") do |input| +    open(dest, "a+") do |output| +      if name == "jsx" +        output << "if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)\n\n" +      else +        output << "if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '#{name}') == -1\n\n" +      end +      IO.copy_stream(input, output) +      output << "\nendif\n" +    end +  end +end + +def download +  FileUtils.rm_rf('tmp') + +  PACKAGES.each_slice(20) do |batch| +    batch.map do |package| +      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` +        progress +      end +    end.map(&:join) +  end +end + +$i = 0 +LYRICS = "Never gonna give you up.  Never gonna let you down.  " + +         "Never gonna run around and desert you.  " + +         "Never gonna make you cry.  Never gonna say goodbye.  " + +         "Never gonna tell a lie and hurt you." + +$mutex = Mutex.new +def progress +  $mutex.synchronize do +    $stdout.write(LYRICS[$i] || ".") +    $i += 1 +  end +end + +def extract +  FileUtils.rm_rf(DIRS[:all]) + +  output = [] +  PACKAGES.map do |package| +    repo, branch, path = parse_remote(package["remote"]) +    dir = "tmp/" + repo.split('/')[1] +    subdirs = [] +    for subdir in DIRS.fetch(package.fetch("dirs", "default").to_sym) +      subtree = "#{dir}/#{path ? path + "/" : ""}" +      subpath = "#{subtree}#{subdir}" +      if FileTest.directory?(subpath) +        Dir.glob("#{subdir}/**/*", base: subtree).each do |p| +          next unless File.file?("#{subtree}/#{p}") +          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(", ")})" +    progress +  end + +  readme = File.read('README.md') + +  readme.gsub!( +    %r{(?<=<!--Package Count-->).*?(?=<!--/Package Count-->)}, +    output.size.to_s +  ) + +  readme.gsub!( +    %r{(?<=<!--Language Packs-->).*?(?=<!--/Language Packs-->)}m, +    "\n" + output.sort.join("\n") + "\n" +  ) + +  File.write('README.md', readme) +end + +def generate_ftdetect +  heuristics, languages = parallel(:load_heuristics, :load_languages) + +  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 = [] +    endif + +    function! s:SetDefault(name, value) +      if !exists(a:name) +        let {a:name} = a:value +      endif +    endfunction + +    call s:SetDefault('g:markdown_enable_spell_checking', 0) +    call s:SetDefault('g:markdown_enable_input_abbreviations', 0) +    call s:SetDefault('g:markdown_enable_mappings', 0) + +    " Enable jsx syntax by default +    call s:SetDefault('g:jsx_ext_required', 0) + +    " Make csv loading faster +    call s:SetDefault('g:csv_start', 1) +    call s:SetDefault('g:csv_end', 2) + +    " Disable json concealing by default +    call s:SetDefault('g:vim_json_syntax_conceal', 0) + +    call s:SetDefault('g:filetype_euphoria', 'elixir') + +    if !exists('g:python_highlight_all') +      call s:SetDefault('g:python_highlight_builtins', 1) +      call s:SetDefault('g:python_highlight_builtin_objs', 1) +      call s:SetDefault('g:python_highlight_builtin_types', 1) +      call s:SetDefault('g:python_highlight_builtin_funcs', 1) +      call s:SetDefault('g:python_highlight_builtin_funcs_kwarg', 1) +      call s:SetDefault('g:python_highlight_exceptions', 1) +      call s:SetDefault('g:python_highlight_string_formatting', 1) +      call s:SetDefault('g:python_highlight_string_format', 1) +      call s:SetDefault('g:python_highlight_string_templates', 1) +      call s:SetDefault('g:python_highlight_indent_errors', 1) +      call s:SetDefault('g:python_highlight_space_errors', 1) +      call s:SetDefault('g:python_highlight_doctests', 1) +      call s:SetDefault('g:python_highlight_func_calls', 1) +      call s:SetDefault('g:python_highlight_class_vars', 1) +      call s:SetDefault('g:python_highlight_operators', 1) +      call s:SetDefault('g:python_highlight_file_headers_as_comments', 1) +      call s:SetDefault('g:python_slow_sync', 1) +    endif + +  EOS + +  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 + +    filetypes = package["filetypes"] or raise "Unknown filetype for: #{package["name"]}" + +    for filetype in filetypes +      syntax = filetype["syntax"] ? " syntax=#{filetype["syntax"]}" : "" +      set_command = package.fetch("custom_set", "set ft=#{filetype.fetch("name")}#{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", []) +      filenames = filetype["filenames"] || linguist.fetch("filenames", []) +      filenames = (filenames | filetype.fetch("extra_filenames", [])) - filetype.fetch("ignored_filenames", []) + + +      for extension in extensions.sort +        outer_filetype = filetype["outer_filetype"] +        if outer_filetype +          output << "  au BufNewFile *.*.#{extension} execute \"do BufNewFile filetypedetect \" . expand(\"<afile>:r\") | #{outer_filetype}" +          output << "  au BufReadPre *.*#{extension} execute \"do BufRead filetypedetect \" . expand(\"<afile>:r\") | #{outer_filetype}" +        end +        output << "  au BufNewFile,BufRead *.#{extension} #{set_command}\n" +      end + +      for filename in filenames.sort +        if filename[0] == "." +          filename = "{.,}" + filename[1..] +        end +        output << "  au BufNewFile,BufRead #{filename} #{set_command}\n" +      end +    end + +    output << "endif\n\n" +  end + +  output << <<~EOS +    " restore Vi compatibility settings +    let &cpo = s:cpo_save +    unlet s:cpo_save +  EOS + +  File.write('ftdetect/polyglot.vim', output) +end + +download +extract +generate_ftdetect +puts(" Bye! Have a wonderful time!") +FileUtils.rm_rf("tmp") diff --git a/scripts/eregex.vim b/scripts/eregex.vim new file mode 100644 index 00000000..c07ae362 --- /dev/null +++ b/scripts/eregex.vim @@ -0,0 +1,1102 @@ +"============================================================================= +" File:         eregex.vim and eregex_e.vim +" Author:       AKUTSU toshiyuki <locrian@mbd.ocn.ne.jp> +" Maintainer:   Kao, Wei-Ko <othree@gmail.com> +" Requirements: Vim version 6.1 and later. +" Description:  eregex.vim is a converter from extended regex to vim regex +"               eregex_e.vim is an evaluater for command of eregex.vim +"               The meaning of extended regex is pseudo ruby/perl-style regex. +"               Previous $Id: eregex.vim,v 2.56 2010-10-18 11:59:41+08 ta Exp $ +"               $Id: eregex.vim,v 2.60 2013-02-22 14:38:41+08 ta Exp $ +" Note:         English isn't my mother tongue. +"============================================================================= +" Principle: +" eregex.vim adopts the way of extended regex about "alternation", +" "repetition" and "grouping". +" As for those things, the way of Vim regex is adopted. +" You can use '\_^', '\zs', '\<', '\%<23c', '\_u', etc in extended regex. +"============================================================================= +" Functions: +" +" E2v({extended_regex} [, {iISCDMm}]) +"     The result is a String, which is vim style regex. +" +"     :let vimregex = E2v('(?<=abc),\d+,(?=xzy)','i') +"     :echo vimregex +"     \c\%(abc\)\@<=,\d\+,\%(xzy\)\@= +" +" E2v('','V') +"     The result is a Number, which is eregex.vim version. +" +"     :echo E2v('','V') +"     238 +" +" E2v({replacement} ,{R1,R2,R3}) +"     The result is a String, which is used for the "to" part of :S/from/to/ +" +"     E2v('\r,\n,\&,&,\~,~', 'R1') => \n,\r,\&,&,\~,~ +"     E2v('\r,\n,\&,&,\~,~', 'R2') => \r,\n,&,\&,~,\~ +"     E2v('\r,\n,\&,&,\~,~', 'R3') => \n,\r,&,\&,~,\~ +" +"============================================================================= +" Commands: +" +" :[range]E2v [iISCDMm] +"     Extended regex To Vim regex. +"     Replace each extended-regex in [range] with vim-style-regex. +" +" :M/eregex/[offset][iISCDMm] +"     Match. +"     :M/<span class="foo">.*?<\/span>/Im +"     => /\C<span class="foo">\_.\{-}<\/span> +" +" :[range]S/eregex/replacement/[&cegpriISCDMm] +"     Substitute. +"     :'<,'>S/(\d{1,3})(?=(\d\d\d)+($|\D))/\1,/g +"     => :'<,'>s/\(\d\{1,3}\)\%(\(\d\d\d\)\+\($\|\D\)\)\@=/\1,/g +" +" :[range]G/eregex/command +"     Global. +"     :G/<<-(["'])?EOD\1/,/^\s*EOD\>/:left 8 +"     => :g/<<-\(["']\)\=EOD\1/,/^\s*EOD\>/:left 8 +" +" :[range]V/eregex/command +"     Vglobal +" +"============================================================================= +" Tips And Configuration: +" +" Put the following commands in your ~/.vimrc to replace normal / with :M/ +" +" nnoremap / :M/ +" nnoremap ,/ / +" +" v238, v243 +" If you put 'let eregex_replacement=3' in your ~/.vimrc, +" +" :S/pattern/\r,\n,\&,&,\~,~/ will be converted to :s/pattern/\n,\r,&,\&,~,\~/ +" +"    +--------------------+-----------------------------+ +"    | eregex_replacement | :S/pattern/\n,\r,&,\&,~,\~/ | +"    +--------------------+-----------------------------+ +"    | 0                  | :s/pattern/\n,\r,&,\&,~,\~/ | +"    | 1                  | :s/pattern/\r,\n,&,\&,~,\~/ | +"    | 2                  | :s/pattern/\n,\r,\&,&,\~,~/ | +"    | 3                  | :s/pattern/\r,\n,\&,&,\~,~/ | +"    +--------------------+-----------------------------+ +" See :h sub-replace-special +" +"============================================================================= +" Options: +"   Note: "^L" is "\x0c". +" +"   "i"   ignorecase +"   "I"   noignorecase +"   "S"   convert "\s" to "[ \t\r\n^L]" and also convert "\S" to "[^ \t\r^L]" +"         Mnemonic:  extended spaces +"   "C"   convert "[^az]" to "\_[^az]" and also convert "\W" to "\_W". +"         Mnemonic: extended complement +"         Vim's "[^az]" matches anything but "a", "z", and a newline. +"   "D"   convert "." to "\_." +"         Mnemonic: extended dot +"         Normally, "." matches any character except a newline. +"   "M"   partial multiline;  do both "S" and "C". +"         In other words, It is not "multiline" in ruby way. +"   "m"   full multiline;  do all the above conversions "S", "C" and "D". +"         In other words, It is just "multiline" in ruby way. +" +"+-----+----------------------------------------------+--------------------+ +"| Num | eregex.vim      => vim regex                 | ruby regex         | +"+-----+----------------------------------------------+--------------------+ +"| (1) | :M/a\s[^az].z/  => /a\s[^az].z/              | /a[ \t][^az\n].z/  | +"+-----+----------------------------------------------+--------------------+ +"|     | :M/a\s[^az].z/S => /a[ \t\r\n^L][^az].z/     | /a\s[^az\n].z/     | +"|     | :M/a\s[^az].z/C => /a\s\_[^az].z/            | /a[ \t][^az].z/    | +"|     | :M/a\s[^az].z/D => /a\s[^az]\_.z/            | /a[ \t][^az\n].z/m | +"+-----+----------------------------------------------+--------------------+ +"| (2) | :M/a\s[^az].z/M => /a[ \t\r\n^L]\_[^az].z/   | /a\s[^az].z/       | +"| (3) | :M/a\s[^az].z/m => /a[ \t\r\n^L]\_[^az]\_.z/ | /a\s[^az].z/m      | +"+-----+----------------------------------------------+--------------------+ +" +"    Note: +"        As for "\s", "[^az]" and ".",   "M" and "m" options make +"        eregex.vim-regexen compatible with ruby/perl-style-regexen. +"    Note: +"        Vim's "[^az]" doesn't match a newline. +"        Contrary to the intention, "[^az\n]" matches a newline. +"        The countermeasure is to convert "[^\s]" to "[^ \t\r^L]" with +"        multiline. +" +"============================================================================= +" pseudo ruby/perl-style regexen. +" +"   available extended regexen: +"       alternation: +"           "a|b" +"       repetition: +"           "a+", "a*", "a?", "a+?", "a*?", "a??," +"           "a{3,5}", "a{3,}", "a{,5}", "a{3,5}?", "a{3,}?", "a{,5}?" +"       grouping: +"           "(foo)", "(?:foo)", "(?=foo)", "(?!foo)", "(?<=foo)", +"           "(?<!foo)", "(?>foo)" +"       modifiers: +"           "(?I)", "(?i)", "(?M)", "(?m)", "(?#comment)" +" +"       Note: +"       The use of "\M" or "\m" is preferable to the use of "(?M)" or "(?m)". +"       "(?M)" and "(?m)" can't expand "\s" in brackets to " \t\r\n^L". +" +"    not available extended regexen: +"       "\A", "\b", "\B", "\G", "\Z", "\z", +"       "(?i:a)", "(?-i)", "(?m:.)", +"       There are no equivalents in vim-style regexen. +" +"    special atoms: +"       "\C"   noignorecase +"       "\c"   ignorecase +"       "\M"   partial multiline +"       "\m"   full multiline +" +"       For example: +"       :M/a\s[^az].z/M  => /a[ \t\r\n^L]\_[^az].z/ +"       :M/a\s[^az].z\M/ => /a[ \t\r\n^L]\_[^az].z/ +"       :M/a\s[^az].z/m  => /a[ \t\r\n^L]\_[^az]\_.z/ +"       :M/a\s[^az].z\m/ => /a[ \t\r\n^L]\_[^az]\_.z/ +"       The order of priority: +"       [A] /IiMm,  [B] \C, \c, \M, \m, [C] (?I), (?i), (?M), (?m) +" +"    many other vim-style regexen available: +"       "\d", "\D", "\w", "\W", "\s", "\S", "\a", "\A", +"       "\u", "\U", "\b" +"       "\<", "\>" +"       "\zs", "\ze" +"       "\_[a-z]", "\%[abc]", "[[:alpha:]]" +"       "\_.", "\_^", "\_$" +"       "\%23l", "\%23c", "\%23v", "\%#" +"       and so on. See :h /ordinary-atom +" +"    misc: +"       Convert "\xnn" to char except "\x00", "\x0a" and "\x08". +"       "\x41\x42\x43"  => "ABC" +"       "\x2a\x5b\x5c"  => "\*\[\\" +"       Expand atoms in brackets. +"       "[#$\w]" => "[#$0-9A-Za-z_]" +" +"       "\f" in brackets is converted to "\x0c". +"       but "\f" out of brackets is a class of filename characters. +" +"    eregex.vim expansion of atoms and its meaning. +"    +-------+----------------------+----------------------+ +"    | atom  | out of brackets      | in brackets          | +"    +-------+----------------------+----------------------+ +"    | \a    | alphabetic char      | alphabetic char      | +"    | \b    | \x08                 | \x08                 | +"    | \e    | \x1b                 | \x1b                 | +"    | \f    | filename char        | \x0c                 | +"    | \n    | \x0a                 | \x0a                 | +"    | \r    | \x0d                 | \x0d                 | +"    | \s    | [ \t] or [ \t\r\n\f] | " \t" or " \t\r\n\f" | +"    | \t    | \x09                 | \x09                 | +"    | \v    | \x0b                 | \x0b                 | +"    | \xnn  | hex nn               | hex nn               | +"    +-------+----------------------+----------------------+ +" +"============================================================================= +if version < 601 | finish | endif +if exists("loaded_eregex") +    finish +endif +let loaded_eregex=1 +"============================================================================= +"Commands And Mappings: +command! -nargs=? -range E2v :<line1>,<line2>call <SID>ExtendedRegex2VimRegexLineWise(<q-args>) +command! -nargs=? -count=1 M :let s:eregex_tmp_hlsearch = &hlsearch | let v:searchforward = <SID>Ematch(<count>, <q-args>) | if s:eregex_tmp_hlsearch == 1 | set hlsearch | endif +"command! -nargs=? -range S :<line1>,<line2>call <SID>Esubstitute(<q-args>) +command! -nargs=? -range S :<line1>,<line2>call <SID>Esubstitute(<q-args>) <Bar> :noh + +command! -nargs=? -range=% -bang G :<line1>,<line2>call <SID>Eglobal(<q-bang>, <q-args>) +command! -nargs=? -range=% V :<line1>,<line2>call <SID>Evglobal(<q-args>) + +"============================================================================= +"Script Variables: +let s:eglobal_working=0 + +"-------------------- +let s:ch_with_backslash=0 +let s:ch_posix_charclass=1 +let s:ch_brackets=2 +let s:ch_braces=3 +let s:ch_parentheses_option=4 +let s:ch_parentheses=5 + +let s:re_factor{0}='\\\%([^x_]\|x\x\{0,2}\|_[.$^]\=\)' + +let s:re_factor{1}= '\[:\%(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|' . +          \  'space\|upper\|xdigit\|return\|tab\|escape\|backspace\):\]' + +let s:re_factor{2}='\[\%([^^][^]]*\|\^.[^]]*\)\]' + +let s:re_factor{3}='{[0-9,]\+}?\=' + +"v141 +"let s:re_factor{4}='(?[iISCDMm]\{1,7})' +let s:re_factor{4}='(?[iImM]\{1,2})' +let s:re_factor{5}='(\(?:\|?=\|?!\|?<=\|?<!\|?>\|?[-#ixm]\)\=[^()]*)' + +let s:re_factor_size=6 +"-------------------- +let s:mark_left="\<Esc>" . strftime("%X") . ":" . strftime("%d") . "\<C-f>" +let s:mark_right="\<C-l>" . strftime("%X") . ":" . strftime("%d") . "\<Esc>" + +let s:stack_size=0 + +let s:invert=0 +let s:multiline=0 +let s:ignorecase=0 + +"v220 +let s:re_unescaped='\%(\\\)\@<!\%(\\\\\)*\zs' +let s:re_escaped='\%(\\\)\@<!\%(\\\\\)*\zs\\' +let s:bakregex='' + +let s:mark_complements=s:mark_left . 'cOmPLemEnTs' . s:mark_right + +"v141, 210 +let s:extended_spaces=0 +let s:extended_complements=0 +let s:extended_dots=0 +let s:str_modifiers='iISCDMm' +let s:meta_chars='$*.[\]^~' + +"v217 +"Why does "[^abc\n]" match  a newline ??? +let s:countermeasure=1 +":M/(?:v21[5-9]|why)/i + +"v238 +let s:eregex_replacement=0 +if exists('eregex_replacement') +    let s:eregex_replacement=eregex_replacement +endif + +"v240 +let s:tmp=matchstr("$Revision: 2.60 $", '[0-9.]\+') +let s:maj=matchstr(s:tmp, '\d\+') * 100 +let s:min=matchstr(s:tmp, '\.\zs\d\+') + 0 +let s:version = s:maj + s:min +unlet s:tmp s:maj s:min + +"v260 +if !exists('g:eregex_forward_delim') +  let g:eregex_forward_delim = '/' +endif + +if !exists('g:eregex_backward_delim') +  let g:eregex_backward_delim = '?' +endif + +"v262 +if !exists('g:eregex_force_case') +  let g:eregex_force_case = 0 +endif + + +let s:enable = 0 + +function! eregex#toggle(...) +  let silent = 0 +  if exists('a:1') && a:1 +    let silent = 1 +  endif +  if s:enable == 0 +    exec 'nnoremap <expr> '.g:eregex_forward_delim.' ":<C-U>".v:count1."M/"' +    exec 'nnoremap <expr> '.g:eregex_backward_delim.' ":<C-U>".v:count1."M?"' +    if silent != 1 +      echo "eregx.vim key mapping enabled" +    endif +  else +    exec 'nunmap '.g:eregex_forward_delim +    exec 'nunmap '.g:eregex_backward_delim +    if silent != 1 +      echo "eregx.vim key mapping disabled" +    endif +  endif +  let s:enable = 1 - s:enable +endfun + +if !(exists('g:eregex_default_enable') && g:eregex_default_enable == 0) +  call eregex#toggle(1) +endif + +"============================================================================= +"Functions: +function! s:Push(fct, kind) +    let fct = a:fct + +    if (a:kind==s:ch_with_backslash) && (fct =~# '^\\x\x\{1,2}$') +    " \x41 +        exec 'let code=0 + 0x' . matchstr(fct, '\x\{1,2}$') +        if code!=0x0a && code!=0 && code!=0x08 +            let fct = nr2char(code) +            "v141 +            if stridx(s:meta_chars, fct)!=-1 +                let fct = "\\" . fct +            endif + +        endif + +    elseif a:kind == s:ch_with_backslash +    " \.  \_x +        let chr = fct[1] +        if chr =~# '[+?{}|()=]' +            let fct = chr +        elseif chr =~# '[Vv]' +            if chr ==# 'v' +                let fct=nr2char(0x0b) +            else +                let fct='V' +            endif +        "[IiMm] +        endif + +    elseif a:kind == s:ch_posix_charclass +    " [:alpha:] pass through + +    elseif a:kind == s:ch_brackets +    "[ ] +        let fct = s:ExpandAtomsInBrackets(fct) +    elseif a:kind == s:ch_braces +    "{ } +        let fct = '\' . fct +        " minimal match, not greedy +        if fct =~# '?$' +            if fct =~# '\d\+,\d\+' +                let fct = substitute(fct, '{\(\d\+\),\(\d\+\)}?', '{-\1,\2}', '') +            elseif fct =~# ',}' +                let fct = substitute(fct, '{\(\d\+\),}?', '{-\1,}', '') +            elseif fct =~# '{,' +                let fct = substitute(fct, '{,\(\d\+\)}?', '{-,\1}', '') +            else +                let fct = strpart(fct, 1) +            endif +        endif +    elseif a:kind==s:ch_parentheses_option +    "( ) +        "v223 +        call s:SetModifiers(fct) +        let fct = '' + +    elseif (a:kind==s:ch_parentheses) && (fct =~# '(?[-#ixm]') +    "( ) +        if fct =~# '(?-\=[ixm]\{1,3})' || fct =~# '(?#' +            let fct = '' +        else +            let fct = substitute(fct, '(?-\=[ixm]\{1,3}:\([^()]*\))', '\1', "") +            let fct = s:ReplaceRemainFactorWithVimRegexFactor(fct) +        endif + +    elseif a:kind==s:ch_parentheses +    "( ) +        let kakko = matchstr(fct, '(\(?:\|?=\|?!\|?<=\|?<!\|?>\)\=') +        let fct = substitute(fct, '(\(?:\|?=\|?!\|?<=\|?<!\|?>\)\=', "", "") +        let fct = strpart(fct, 0, strlen(fct)-1) +        let fct = s:ReplaceRemainFactorWithVimRegexFactor(fct) +        if kakko ==# '(' +            let fct = '\(' . fct . '\)' +        elseif kakko ==# '(?:' +            let fct = '\%(' . fct . '\)' +        elseif kakko ==# '(?=' +            let fct = '\%(' . fct . '\)\@=' +        elseif kakko ==# '(?!' +            let fct = '\%(' . fct . '\)\@!' +        elseif kakko ==# '(?<=' +            let fct = '\%(' . fct . '\)\@<=' +        elseif kakko ==# '(?<!' +            let fct = '\%(' . fct . '\)\@<!' +        elseif kakko ==# '(?>' +            let fct = '\%(' . fct . '\)\@>' +        else +            let fct = ":BUG:" +        endif + +    endif +    let s:stack{s:stack_size} = fct +    let s:stack_size = s:stack_size + 1 +endfunction +"end s:Push() +"----------------------------------------------------------------------------- +function! s:ExpandAtomsInBrackets(bracket) +    let bracket = a:bracket +    let re_mark = s:mark_left . '\d\+' . s:mark_right +    let re_snum = s:mark_left . '\(\d\+\)' . s:mark_right +    "v120 +    let has_newline=0 +    "v216,v249 +    let complement=(bracket =~# '^\[^') + +    let searchstart = 0 +    let mtop = match(bracket, re_mark, searchstart) +    while mtop >= 0 +        let mstr = matchstr(bracket, re_mark, searchstart) +        let snum = substitute(mstr, re_snum, '\1', "") + 0 +        "v222 +        let fct = s:stack{snum} +        "exclude, \e=0x1b, \b=0x08, \r=0x0d, \t=0x09 +        if fct =~# '^\\[adfhlosuwx]$' +            let chr = fct[1] +            if chr ==# 'a' +                let fct='A-Za-z' +            elseif chr ==# 'd' +                let fct='0-9' +            elseif chr ==# 'f' +                "let fct=nr2char(0x0c) +                let fct="\x0c" +            elseif chr ==# 'h' +                let fct='A-Za-z_' +            elseif chr ==# 'l' +                let fct='a-z' +            elseif chr ==# 'o' +                let fct='0-7' +            elseif chr ==# 's' +                "v141 +                if s:extended_spaces==1 +                    "v217 +                    if (s:countermeasure==1) && (complement==1) +                        let fct=" \\t\\r\x0c" +                    else +                        let fct=" \\t\\r\\n\x0c" +                    endif +                    let has_newline=1 +                else +                    let fct=' \t' +                endif +            elseif chr ==# 'u' +                let fct='A-Z' +            elseif chr ==# 'w' +                let fct='0-9A-Za-z_' +            elseif chr ==# 'x' +                let fct='0-9A-Fa-f' +            endif + +            let s:stack{snum}=fct +        else +            "v120 +            if fct ==# '\n' +            "If there is only "\n" of inside of the brackets. +            "It becomes the same as "\_.". +                let has_newline=1 +            "v219 +            elseif fct ==# '-' +            " '-' converted from \xnn +            "If there is '-' in the beginning of the brackets and the end. +            "Unnecessary '\' is stuck. +                let s:stack{snum}='\-' +            "v237 +            elseif fct ==# '\[' +            " '\[' converted from \xnn +                let s:stack{snum}='[' +            endif +        endif + +        let searchstart = mtop + strlen(mstr) +        let mtop = match(bracket, re_mark, searchstart) +    endwhile + +    "v120 +    if (complement==1) && (has_newline==0) +        let bracket = s:mark_complements . bracket +    endif + +    return bracket +endfunction +"end ExpandAtomsInBrackets() +"----------------------------------------------------------------------------- +function! s:Pop() +    if s:stack_size <= 0 | return "" | endif +    let s:stack_size = s:stack_size - 1 +    return s:stack{s:stack_size} +endfunction +"----------------------------------------------------------------------------- +" Debug: +function! s:UnletStack() +    let i = 0 +    while exists("s:stack" . i) +        exec "unlet s:stack" . i +        let i = i + 1 +    endwhile +    let s:stack_size = 0 +endfunction +" Debug: +"function! EachStack() +"    let lineno = line(".") +"    let i = 0 +"    while exists("s:stack" . i) +"        call append(lineno + i,  i . " -> " . s:stack{i}) +"        let i = i + 1 +"    endwhile +"endfunction +"----------------------------------------------------------------------------- +function! s:ReplaceExtendedRegexFactorWithNumberFactor(extendedregex) +    let halfway = a:extendedregex +    let s:stack_size = 0 +    let i=0 +    let id_num=0 +    while i < s:re_factor_size +        "CASESENSE: +        let regex = '\C' . s:re_factor{i} +        let mtop = match(halfway, regex) +        while mtop >= 0 +            let factor = matchstr(halfway, regex) +            let pre_match = strpart(halfway, 0, mtop) +            let post_match= strpart(halfway, mtop + strlen(factor)) +            let halfway = pre_match . s:mark_left . id_num . s:mark_right . post_match +            "END: +            call s:Push( factor, i ) +            let id_num = id_num + 1 +            let mtop = match(halfway, regex) +        endwhile +        let i = i + 1 +    endwhile +    return halfway +endfunction +"end s:ReplaceExtendedRegexFactorWithNumberFactor() +"----------------------------------------------------------------------------- +function! s:ReplaceRemainFactorWithVimRegexFactor(halfway) +    let halfway = a:halfway + +    " minimal match, not greedy +    let halfway = substitute(halfway, '+?', '\\{-1,}', 'g') +    let halfway = substitute(halfway, '\*?', '\\{-}', 'g') +    let halfway = substitute(halfway, '??', '\\{-,1}', 'g') +    "-------------------- +    let halfway = substitute(halfway, '+', '\\+', 'g') +    let halfway = substitute(halfway, '?', '\\=', 'g') +    "-------------------- +    let halfway = substitute(halfway, '|', '\\|', 'g') + +    "-------------------- +    let halfway = substitute(halfway, '\~', '\\&', 'g') +    "-------------------- +    "v141 +    if s:extended_dots==1 +        let halfway = substitute(halfway, '\.', '\\_.', 'g') +    endif + +    return halfway +endfunction +"end s:ReplaceRemainFactorWithVimRegexFactor() +"----------------------------------------------------------------------------- +function! s:ReplaceNumberFactorWithVimRegexFactor(halfway) +    let vimregex = a:halfway + +    let i = s:stack_size +    while i > 0 +        let i = i - 1 + +        let factor = s:Pop() +        let str_mark = s:mark_left . i . s:mark_right +        let vimregex = s:ReplaceAsStr(vimregex, str_mark, factor) +    endwhile +    "Debug: +    call s:UnletStack() + +    "v221 +    "v120 +    if stridx(vimregex, s:mark_complements)!=-1 +        "v141 +        if s:extended_complements==1 +            "there isn't \_ before [^...]. +            " [^...] doesn't contain \n. +            let re='\C\%(\%(\\\)\@<!\(\\\\\)*\\_\)\@<!\zs' . s:mark_complements +            let vimregex = substitute(vimregex, re, '\\_', "g") +        endif +        let vimregex = substitute(vimregex, '\C' . s:mark_complements, '', "g") +    endif +    "v220 +    if s:extended_complements==1 +        let re='\C' . s:re_escaped . '\([ADHLOUWX]\)' +        let vimregex = substitute(vimregex, re, '\\_\1', "g") +    endif +    "v141 +    if s:extended_spaces==1 +        "    | atom | normal   | extended spaces +        "    | \s   | [ \t]    | [ \t\r\n\f] +        "    | \S   | [^ \t]   | [^ \t\r\n\f] +        "    | \_s  | \_[ \t]  | [ \t\r\n\f] +        "    | \_S  | \_[^ \t] | [^ \t\r\n\f]       * +        let ff=nr2char(0x0c) +        let re='\C' . s:re_escaped . '_\=s' +        let vimregex=substitute(vimregex, re, '[ \\t\\r\\n' . ff . ']', "g") +        let re='\C' . s:re_escaped . '_\=S' +        if s:countermeasure==1 +            "v216 +            let vimregex=substitute(vimregex, re, '[^ \\t\\r' . ff . ']', "g") +        else +            let vimregex=substitute(vimregex, re, '[^ \\t\\r\\n' . ff . ']', "g") +        endif +    endif + +    if s:ignorecase > 0 +        let tmp = (s:ignorecase==1) ? '\c' : '\C' +        let vimregex = tmp . vimregex +    endif +    "if &magic==0 +    "    let vimregex = '\m' . vimregex +    "endif + +    return vimregex +endfunction +"end s:ReplaceNumberFactorWithVimRegexFactor() +"============================================================================= +"Main: +function! s:ExtendedRegex2VimRegex(extendedregex, ...) +    "v141 +    let s:ignorecase=0 +    let s:multiline=0 +    let s:extended_spaces=0 +    let s:extended_complements=0 +    let s:extended_dots=0 +    if a:0==1 +        "v238,v243 +        if a:1 =~# 'R[0-3]' +            return s:ExchangeReplaceSpecials(a:extendedregex, matchstr(a:1, 'R\zs[0-3]')) +        "v240 +        elseif a:1 ==# 'V' +            return s:version +        endif +        call s:SetModifiers(a:1) +    endif +    "v240 moved here +    if strlen(a:extendedregex)==0 +        return "" +    endif + +    "v141 +    let eregex=a:extendedregex +    "v221 +    let mods = matchstr(eregex, '\C' . s:re_escaped . '[Mm]') +    let mods = mods . matchstr(eregex, '\C' . s:re_escaped . '[Cc]') +    if mods !=# '' +        let mods = substitute(mods, '\CC', 'I',"g") +        let mods = substitute(mods, '\Cc', 'i',"g") +        call s:SetModifiers(mods) +        let re='\C' . s:re_escaped . '[MmCc]' +        let eregex=substitute(eregex, re, '', "g") +    endif + +    "-------------------- +    let halfway = s:ReplaceExtendedRegexFactorWithNumberFactor(eregex) +    let halfway = s:ReplaceRemainFactorWithVimRegexFactor(halfway) +    let vimregex = s:ReplaceNumberFactorWithVimRegexFactor(halfway) +    "v221 +    return vimregex +endfunction +"end s:ExtendedRegex2VimRegex() +"----------------------------------------------------------------------------- +function! s:ExtendedRegex2VimRegexLineWise(...) range +    if a:1 ==# '--version' +        echo "$Id: eregex.vim,v 2.56 2003-09-19 17:39:41+09 ta Exp $" +        return +    endif +    let modifiers= a:1 + +    let i = a:firstline +    while i <= a:lastline +        call setline(i, s:ExtendedRegex2VimRegex(getline(i), modifiers)) +        let i = i + 1 +    endwhile +endfunction +"end s:ExtendedRegex2VimRegexLineWise() +"----------------------------------------------------------------------------- +"Public: +function! E2v(extendedregex, ...) +    if a:0==0 +        return s:ExtendedRegex2VimRegex(a:extendedregex) +    endif +    return s:ExtendedRegex2VimRegex(a:extendedregex, a:1) +endfunction +"end E2v() +"----------------------------------------------------------------------------- +function! s:Ematch(...) +    let ccount = a:1 +    if strlen(a:2) <= 1 +        let string = a:2 . @/ +    else +        let string = a:2 +    endif + +    let delim=string[0] + +    if delim !=# '/' && delim !=# '?'  +        let v:errmsg= "The delimiter `" . delim . "' isn't available,  use `/' ." +        echohl WarningMsg | echo v:errmsg +        return +    endif + +    let rxp ='^delim\([^delim\\]*\%(\\.[^delim\\]*\)*\)' . +        \      '\(delim.*\)\=$' +    let rxp=substitute(rxp, 'delim', delim, "g") + +    let regex = substitute(string, rxp, '\1',"") +    let offset= substitute(string, rxp, '\2', "") + +    "-------------------- +    let modifiers='' +    "v141 +    if offset =~# '[' . s:str_modifiers . ']' +        let modifiers = substitute(offset, '\C[^' . s:str_modifiers . ']\+', "", "g") +        let offset = substitute(offset, '\C[' . s:str_modifiers . ']\+', "", "g") +    endif + +    if g:eregex_force_case == 1 +      if match(modifiers, 'i') == -1 && match(modifiers, 'I') == -1 +        let modifiers .= 'I' +      endif +    endif + +    let regex = s:ExtendedRegex2VimRegex(regex, modifiers) +    "v130 +    "set s:bakregex +    let regex = s:EscapeAndUnescape(regex, delim) + +    "-------------------- +    if offset==# '' +        let offset = delim +    endif + +    let cmd = 'normal! ' . ccount . delim . regex . offset . "\<CR>" +    let v:errmsg='' +    set nohlsearch +    silent! exec cmd +    if (v:errmsg !~# '^E\d\+:') || (v:errmsg =~# '^E486:') +        "v130 +        if s:bakregex !=# '' +            let @/ = s:bakregex +        endif +    endif +    if v:errmsg ==# '' +        redraw! +        if &foldenable && &foldopen =~# 'search' +            exec 'normal!zv' +        endif +    else +        echohl WarningMsg | echo v:errmsg +    endif + +    if delim == '?' +      return 0 +    else +      return 1 +    endif +endfunction +"end s:Ematch() +"----------------------------------------------------------------------------- +function! s:Esubstitute(...) range +    if strlen(a:1) <= 1 | return | endif + +    let string = a:1 +    let delim = s:GetDelim(string[0]) +    if delim==# '' | return | endif + +    let rxp ='^delim\([^delim\\]*\%(\\.[^delim\\]*\)*\)delim\([^delim\\]*\%(\\.[^delim\\]*\)*\)' . +        \      '\(delim.*\)\=$' +    let rxp=substitute(rxp, 'delim', delim, "g") +    if string !~# rxp +        if s:eglobal_working==0 +            echohl WarningMsg | echo 'Invalid arguments S' . a:1 +        endif +        return +    endif +    let regex = substitute(string, rxp, '\1',"") +    let replacement = substitute(string, rxp, '\2', "") +    let options = substitute(string, rxp, '\3',"") +    "-------------------- +    "v141 +    let modifiers='' +    if options =~# '[' . s:str_modifiers . ']' +        let modifiers = substitute(options, '\C[^' . s:str_modifiers . ']\+', "", "g") +        let options = substitute(options, '\C[SCDmM]', "", "g") +    endif + +    if g:eregex_force_case == 1 +      if match(modifiers, 'i') == -1 && match(modifiers, 'I') == -1 +        let modifiers .= 'I' +      endif +    endif + +    let regex = s:ExtendedRegex2VimRegex(regex, modifiers) +    "v130 +    "set s:bakregex +    let regex = s:EscapeAndUnescape(regex, delim) + +    "v238, v243 +    if (s:eregex_replacement > 0) && (strlen(replacement) > 1) +        let replacement = s:ExchangeReplaceSpecials(replacement, s:eregex_replacement) +    endif + +    "-------------------- +    if options ==# '' +        let options = delim +    endif + +    let cmd = a:firstline . ',' . a:lastline . 's' . delim . regex . delim . replacement . options + +    "Evaluater: +    let g:eregex_evaluater_how_exe = s:eglobal_working +    if g:eregex_evaluater_how_exe==0 +        let v:statusmsg='' +        let v:errmsg='' +    endif +    let confirmoption = (options =~# 'c') +    if confirmoption==1 +        "with confirm option. +        let g:eregex_evaluater_how_exe=1 +    endif +    let g:eregex_evaluater_cmd = cmd +    runtime plugin/eregex_e.vim +    if g:eregex_evaluater_how_exe==0 || confirmoption==1 +        unlet! g:eregex_evaluater_cmd +        "v130 +        if s:bakregex !=# '' +            let @/ = s:bakregex +        endif + +        if confirmoption==0 +            if v:errmsg==# '' +                if v:statusmsg !=# '' +                    echohl WarningMsg | echo v:statusmsg +                endif +            else +                echohl WarningMsg | echo v:errmsg +            endif +        endif +    endif + +endfunction +"end s:Esubstitute() +"----------------------------------------------------------------------------- +function! s:Eglobal(bang, ...) range +    if strlen(a:1)<=1 | return | endif +    let string=a:1 +    let delim = s:GetDelim(string[0]) +    if delim==#'' | return | endif + +    "-------------------- +    let re_pattern = substitute('[^delim\\]*\%(\\.[^delim\\]*\)*', 'delim', delim,"g") +    let re_offset = '\%([-+0-9]\d*\|\.[-+]\=\d*\)' +    let re_sep = '[,;]' +    let re_command = '[^,;].*' +    let re_command_less = '\_$' +    let re_end = '\%(' . re_sep . '\|' . re_command . '\|' . re_command_less . '\)' + +    "-------------------- +    let toprxp0 = '^' . delim . '\(' . re_pattern . '\)\(' . delim . re_offset . re_sep . '\)' +    let toprxp1 = '^' . delim . '\(' . re_pattern . '\)\(' . delim . re_sep . '\)' +    let toprxp2 = '^' + +    let endrxp0 = delim . '\(' . re_pattern . '\)\(' . delim . re_offset . re_end . '\)' +    let endrxp1 = delim . '\(' . re_pattern . '\)\(' . delim . re_end . '\)' +    let endrxp2 = delim . '\(' . re_pattern . '\)' . re_command_less + +    "-------------------- +    let mtop = -1 +    let j = 0 +    while j < 3 +        let i = 0 +        while i < 3 +            let regexp = toprxp{j} . endrxp{i} +            let mtop = match(string, regexp) +            if mtop>=0 | break | endif +            let i = i + 1 +        endwhile +        if mtop>=0 | break | endif +        let j = j + 1 +    endwhile +    if mtop<0 | return | endif + +    "-------------------- +    if a:bang==# '!' +        let s:invert=1 +    endif +    let cmd = (s:invert==0) ? 'g' : 'v' +    let s:invert=0 +    let cmd = a:firstline . ',' . a:lastline . cmd +    let globalcmd = '' +    if j == 2 +        let pattern1 = substitute(string, regexp, '\1', "") +        let strright = delim +        if i < 2 +            let strright = substitute(string, regexp, '\2', "") +        endif + +        let pattern1 = s:ExtendedRegex2VimRegex(pattern1) +        "v130 +        let pattern1 = s:EscapeAndUnescape(pattern1, delim) +        let globalcmd = cmd . delim . pattern1 . strright +    else +        let pattern1 = substitute(string, regexp, '\1', "") +        let strmid = substitute(string, regexp, '\2',"") +        let pattern2 = substitute(string, regexp, '\3', "") +        let strright = delim +        if i < 2 +            let strright = substitute(string, regexp, '\4', "") +        endif + +        let pattern1 = s:ExtendedRegex2VimRegex(pattern1) +        let pattern2 = s:ExtendedRegex2VimRegex(pattern2) +        "v130 +        let pattern1 = s:EscapeAndUnescape(pattern1, delim) +        let pattern2 = s:EscapeAndUnescape(pattern2, delim) + +        let globalcmd = cmd . delim . pattern1 . strmid . delim . pattern2 . strright +    endif +    "-------------------- + +    "Evaluater: +    let s:eglobal_working=1 +    let g:eregex_evaluater_how_exe=2 +    let g:eregex_evaluater_cmd = globalcmd + +    runtime plugin/eregex_e.vim +    let s:eglobal_working=0 +    "let g:eregex_evaluater_how_exe=0 +    unlet! g:eregex_evaluater_cmd + +endfunction +"end s:Eglobal() +"----------------------------------------------------------------------------- +function! s:Evglobal(...) range +    let s:invert=1 +    let cmd = a:firstline . ',' . a:lastline . 'G' . a:1 +    exec cmd + +endfunction +"end s:Evglobal() +"----------------------------------------------------------------------------- +function! s:GetDelim(str) +    let valid = '[/@#]' +    let delim = a:str[0] +    if delim =~# valid +        return delim +    endif +    let v:errmsg = "The delimiter `" . delim . "' isn't available,  use " . valid +    echohl WarningMsg | echo v:errmsg +    return '' +endfunction +"end s:GetDelim() +"============================================================================= +"v130 +"called from Ematch(), Esubstitute(), Eglobal() +"use s:re_unescaped, s:re_escaped, s:bakregex +function! s:EscapeAndUnescape(vimregex, delim) +    let vimregex = a:vimregex +    let s:bakregex= a:vimregex +    if a:delim ==# '@' +        return vimregex +    endif + +    if s:bakregex =~# s:re_escaped . a:delim +    " \/ or \# exists +        let s:bakregex = substitute(vimregex, s:re_escaped . a:delim, a:delim, "g") +    endif +    if vimregex =~# s:re_unescaped . a:delim +    " / or # exists +        let vimregex = substitute(vimregex, s:re_unescaped . a:delim, '\\' . a:delim, "g") +    endif + +    return vimregex +endfunction +"end s:EscapeAndUnescape() +"============================================================================= +"v141 +"called from only s:ExtendedRegex2VimRegex() +function! s:SetModifiers(mods) +    "v221 +    if s:ignorecase==0 +        if a:mods =~# 'i' +            let s:ignorecase=1 +        elseif a:mods =~# 'I' +            let s:ignorecase=2 +        endif +    endif +    "v221 +    if s:multiline==0 +        if a:mods =~? 'm' +            let s:extended_spaces=1 +            let s:extended_complements=1 +            if a:mods =~# 'M' +                "partial multiline +                let s:multiline=1 +            else +                "full multiline +                let s:extended_dots=1 +                let s:multiline=2 +            endif +        endif +    endif + +    if a:mods =~# 'S' +        let s:extended_spaces=1 +    endif +    if a:mods =~# 'C' +        let s:extended_complements=1 +    endif +    if a:mods =~# 'D' +        let s:extended_dots=1 +    endif +endfunction +"End: s:SetModifiers(mods) +"============================================================================= +"v238, +function! s:ExchangeReplaceSpecials(replacement, sort) +    let rs=a:replacement +    "v243,v246 +    if (rs !~# '[&~]\|\\[rnx]') || (rs =~# '^\\=') +        return rs +    endif +    if (a:sort % 2)==1 +        let rs=substitute(rs, '\C' . s:re_escaped . 'r', '\\R', "g") +        let rs=substitute(rs, '\C' . s:re_escaped . 'n', '\\r', "g") +        let rs=substitute(rs, '\C' . s:re_escaped . 'R', '\\n', "g") +    endif +    if a:sort >= 2 +        let rs=substitute(rs, '\C' . s:re_escaped . '&', '\\R', "g") +        let rs=substitute(rs, '\C' . s:re_escaped . '\~', '\\N', "g") +        let rs=substitute(rs, '\C' . s:re_unescaped . '[&~]', '\\&', "g") +        let rs=substitute(rs, '\C' . s:re_escaped . 'R', '\&', "g") +        let rs=substitute(rs, '\C' . s:re_escaped . 'N', '\~', "g") +    endif +    return rs +endfunction +"End: s:ExchangeReplaceSpecials() +"============================================================================= +"============================================================================= +"Import: macros/locrian.vim +function! s:ReplaceAsStr(str, search, replacement, ...) +    let gsub = a:0 +    if a:0 > 0 +        let gsub = (a:1=~? 'g') ? 1 : 0 +    endif +    let oldstr = a:str +    let newstr = "" +    let len = strlen(a:search) +    let i = stridx(oldstr, a:search) +    while i >= 0 +        let newstr = newstr . strpart(oldstr, 0, i) . a:replacement +        let oldstr = strpart(oldstr, i + len) +        if gsub==0 +            break +        endif +        let i = stridx(oldstr, a:search) +    endwhile +    if strlen(oldstr)!=0 +        let newstr = newstr . oldstr +    endif +    return newstr +endfunction +"end s:ReplaceAsStr() +"============================================================================= + +function! ExtendedRegex2VimRegex(data) +  return s:ExtendedRegex2VimRegex(a:data) +endfunction diff --git a/scripts/test b/scripts/test new file mode 100755 index 00000000..853d34b4 --- /dev/null +++ b/scripts/test @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e + +vim -N --startuptime /dev/stdout -u <( +  echo "filetype plugin indent on" +  echo "syntax enable" +  echo "let &rtp='$PWD,'.&rtp" +  cat ftdetect/polyglot.vim | grep -E 'set ft=[a-z-]+' -o | sort | uniq | awk -F '=' '{ print $2 }' | while read ft; do +    echo "try" +    echo "  enew" +    echo "  set ft=$ft" +    echo "catch" +    echo "  echo v:exception" +    echo "  exec ':cq!'" +    echo "endtry" +  done +  echo "exec ':q!'" +) | 
