summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2020-08-23 23:35:05 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2020-08-23 23:35:05 +0200
commit23defeb61028e25369f54bad521c8948a03f15ba (patch)
treeed0896531b2501e342ad44776758e8c6bc73a899 /scripts
parent114a93bb7c73443d4d0caf9bd9c1875bb96d9d62 (diff)
downloadvim-polyglot-23defeb61028e25369f54bad521c8948a03f15ba.tar.gz
vim-polyglot-23defeb61028e25369f54bad521c8948a03f15ba.zip
fix: Migrate build script to ruby
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/build304
-rw-r--r--scripts/eregex.vim1102
-rwxr-xr-xscripts/test19
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!'"
+)