aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/tlib_vim/autoload/tlib/string.vim
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/tlib_vim/autoload/tlib/string.vim')
-rwxr-xr-xvim/bundle/tlib_vim/autoload/tlib/string.vim172
1 files changed, 172 insertions, 0 deletions
diff --git a/vim/bundle/tlib_vim/autoload/tlib/string.vim b/vim/bundle/tlib_vim/autoload/tlib/string.vim
new file mode 100755
index 0000000..26b1f32
--- /dev/null
+++ b/vim/bundle/tlib_vim/autoload/tlib/string.vim
@@ -0,0 +1,172 @@
+" @Author: Tom Link (micathom AT gmail com?subject=[vim])
+" @Website: http://www.vim.org/account/profile.php?user_id=4037
+" @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
+" @Revision: 126
+
+
+" :def: function! tlib#string#RemoveBackslashes(text, ?chars=' ')
+" Remove backslashes from text (but only in front of the characters in
+" chars).
+function! tlib#string#RemoveBackslashes(text, ...) "{{{3
+ exec tlib#arg#Get(1, 'chars', ' ')
+ " TLogVAR chars
+ let rv = substitute(a:text, '\\\(['. chars .']\)', '\1', 'g')
+ return rv
+endf
+
+
+" :display: tlib#string#Chomp(string, ?max=0)
+function! tlib#string#Chomp(string, ...) "{{{3
+ let quant = a:0 >= 1 ? '\{,'. a:1 .'}' : '\+'
+ return substitute(a:string, '[[:cntrl:][:space:]]'. quant .'$', '', '')
+endf
+
+
+" Format a template string. Placeholders have the format "%{NAME}". A
+" "%" can be inserted as "%%".
+"
+" Examples:
+" echo tlib#string#Format("foo %{bar} foo", {'bar': 123})
+" => foo 123 foo
+function! tlib#string#Format(template, dict) "{{{3
+ let parts = split(a:template, '\ze%\({.\{-}}\|.\)')
+ let out = []
+ for part in parts
+ let ml = matchlist(part, '^%\({\(.\{-}\)}\|\(.\)\)\(.*\)$')
+ if empty(ml)
+ let rest = part
+ else
+ let var = empty(ml[2]) ? ml[3] : ml[2]
+ let rest = ml[4]
+ if has_key(a:dict, var)
+ call add(out, a:dict[var])
+ elseif var == '%%'
+ call add(out, '%')
+ else
+ call add(out, ml[1])
+ endif
+ endif
+ call add(out, rest)
+ endfor
+ return join(out, '')
+endf
+
+
+" This function deviates from |printf()| in certain ways.
+" Additional items:
+" %{rx} ... insert escaped regexp
+" %{fuzzyrx} ... insert typo-tolerant regexp
+function! tlib#string#Printf1(format, string) "{{{3
+ let s = split(a:format, '%.\zs')
+ " TLogVAR s
+ return join(map(s, 's:PrintFormat(v:val, a:string)'), '')
+endf
+
+function! s:PrintFormat(format, string) "{{{3
+ let cut = match(a:format, '%\({.\{-}}\|.\)$')
+ if cut == -1
+ return a:format
+ else
+ let head = cut > 0 ? a:format[0 : cut - 1] : ''
+ let tail = a:format[cut : -1]
+ " TLogVAR head, tail
+ if tail == '%{fuzzyrx}'
+ let frx = []
+ for i in range(len(a:string))
+ if i > 0
+ let pb = i - 1
+ else
+ let pb = 0
+ endif
+ let slice = tlib#rx#Escape(a:string[pb : i + 1])
+ call add(frx, '['. slice .']')
+ call add(frx, '.\?')
+ endfor
+ let tail = join(frx, '')
+ elseif tail == '%{rx}'
+ let tail = tlib#rx#Escape(a:string)
+ elseif tail == '%%'
+ let tail = '%'
+ elseif tail == '%s'
+ let tail = a:string
+ endif
+ " TLogVAR tail
+ return head . tail
+ endif
+endf
+" function! tlib#string#Printf1(format, string) "{{{3
+" let n = len(split(a:format, '%\@<!%s', 1)) - 1
+" let f = a:format
+" if f =~ '%\@<!%{fuzzyrx}'
+" let frx = []
+" for i in range(len(a:string))
+" if i > 0
+" let pb = i - 1
+" else
+" let pb = 0
+" endif
+" let slice = tlib#rx#Escape(a:string[pb : i + 1])
+" call add(frx, '['. slice .']')
+" call add(frx, '.\?')
+" endfor
+" let f = s:RewriteFormatString(f, '%{fuzzyrx}', join(frx, ''))
+" endif
+" if f =~ '%\@<!%{rx}'
+" let f = s:RewriteFormatString(f, '%{rx}', tlib#rx#Escape(a:string))
+" endif
+" if n == 0
+" return substitute(f, '%%', '%', 'g')
+" else
+" let a = repeat([a:string], n)
+" return call('printf', insert(a, f))
+" endif
+" endf
+
+
+function! s:RewriteFormatString(format, pattern, string) "{{{3
+ let string = substitute(a:string, '%', '%%', 'g')
+ return substitute(a:format, tlib#rx#Escape(a:pattern), escape(string, '\'), 'g')
+endf
+
+
+function! tlib#string#TrimLeft(string) "{{{3
+ return substitute(a:string, '^[[:space:][:cntrl:]]\+', '', '')
+endf
+
+
+function! tlib#string#TrimRight(string) "{{{3
+ return substitute(a:string, '[[:space:][:cntrl:]]\+$', '', '')
+endf
+
+
+function! tlib#string#Strip(string) "{{{3
+ return tlib#string#TrimRight(tlib#string#TrimLeft(a:string))
+endf
+
+
+function! tlib#string#Count(string, rx) "{{{3
+ let s:count = 0
+ call substitute(a:string, a:rx, '\=s:CountHelper()', 'g')
+ return s:count
+endf
+
+function! s:CountHelper() "{{{3
+ let s:count += 1
+endf
+
+
+function! tlib#string#SplitCommaList(text, ...) abort "{{{3
+ let sep = a:0 >= 1 ? a:1 : ',\s*'
+ let parts = split(a:text, '\\\@<!\zs'. sep)
+ let parts = map(parts, 'substitute(v:val, ''\\\(.\)'', ''\1'', ''g'')')
+ return parts
+endf
+
+
+function! tlib#string#Input(...) abort "{{{3
+ TVarArg ['text', ''], ['completion', '']
+ call inputsave()
+ let rv = call(function('input'), a:000)
+ call inputrestore()
+ return rv
+endf