summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2015-06-19 13:27:23 +0200
committerBram Moolenaar <Bram@vim.org>2015-06-19 13:27:23 +0200
commit541f92d6cfdf2215e743553b5f4b6529dd9fcf31 (patch)
treeebd90d293d96f799bc34fd8e1bce937ca0603594 /runtime
parentc7a0d32c834ff321491d8fd7bc68bf6cabd11e44 (diff)
Updated runtime files.
Diffstat (limited to 'runtime')
-rw-r--r--runtime/doc/eval.txt4
-rw-r--r--runtime/doc/todo.txt39
-rw-r--r--runtime/indent/html.vim4
-rw-r--r--runtime/indent/r.vim787
-rw-r--r--runtime/indent/rhelp.vim16
-rw-r--r--runtime/indent/rmd.vim6
-rw-r--r--runtime/indent/rnoweb.vim5
-rw-r--r--runtime/syntax/python.vim19
-rw-r--r--runtime/syntax/sh.vim156
-rw-r--r--runtime/syntax/tex.vim56
10 files changed, 556 insertions, 536 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index dd679ccc2e..44abae6243 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt* For Vim version 7.4. Last change: 2015 Apr 30
+*eval.txt* For Vim version 7.4. Last change: 2015 Jun 19
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -1021,7 +1021,7 @@ A string constant accepts these special characters:
\X. same as \x.
\u.... character specified with up to 4 hex numbers, stored according to the
current value of 'encoding' (e.g., "\u02a4")
-\U.... same as \u....
+\U.... same as \u but allows up to 8 hex numbers.
\b backspace <BS>
\e escape <Esc>
\f formfeed <FF>
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index afd737b5d8..754e388cf0 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt* For Vim version 7.4. Last change: 2015 Jun 09
+*todo.txt* For Vim version 7.4. Last change: 2015 Jun 19
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -78,12 +78,6 @@ Patch to make getregtype() return the right size for non-linux systems.
(Yasuhiro Matsumoto, 2014 Jul 8)
Breaks test_eval. Inefficient, can we only compute y_width when needed?
-Patch to fix test (Christian, 2015 May 5)
-
-Patch to fix ml_get error. (Yukihiro Nakadaira, 2015 May 22)
-
-Patch for neovim. (Christian, 2015 May 5)
-
Problem that a previous silent ":throw" causes a following try/catch not to
work. (ZyX, 2013 Sep 28)
@@ -91,19 +85,9 @@ Problem using ":try" inside ":execute". (ZyX, 2013 Sep 15)
Regression for v_b_A. (Ingo Karkat, 2015 May 18)
-Patch for memory access problem. (Dominique Pelle, 2015 May 5)
-
-R indent files update. (Jakson Alves de Aquino, Mar 31)
-
-Updated Python syntax file. (Dmitry Vasiliev, Mar 30)
-Discucussion about what version to use, Petkovic, 2015 May 19.
-Patch for existing syntax file, Zvezdan Petkovic, 2015 May 17)
-
":cd C:\Windows\System32\drivers\etc*" does not work, even though the
directory exists. (Sergio Gallelli, 2013 Dec 29)
-Patch on issue 361 by James McCoy.
-
Patch on issue 365.
Patch to add "vsplit" to 'switchbuf'. (Brook Hong, 2015 Jun 4)
@@ -121,6 +105,10 @@ keymap for Russian typewriter layout. (Danwerspb, 2015 May 15)
Patch for man.vim. (SungHyun Nam, 2015 May 20)
Doesn't work completely (Dominique Orban)
+The entries added by matchaddpos() are returned by getmatches() but can't be
+set with setmatches(). (lcd47, 2014 Jun 29)
+Patch by Christian, 2015 Jun 16.
+
Invalid memory access in regexp.c. (Dominique Pelle, 2015 May 23)
Using ":windo" to set options in all windows has the side effect that it
@@ -142,6 +130,7 @@ Patch for appending in Visual mode with 'linebreak' set.
Patch to make CTRL-A in Visual mode increment all Visually selected numbers.
Same for decrement with CTRL-X. (Christian Brabandt, 2015 Jun 8)
+Update Jun 9.
C indent: should recognize C11 raw strings. (Mark Lodato, 2015 Mar 1)
Need to recognize R"string" for 'cindent'.
@@ -154,6 +143,11 @@ Patch to detect background terminal color in xterm. (Lubomir Rintel, 2015 Jun
Patch to fix that in command-line window first character is erased
when conceallevel is set. (Hirohito Higashi, 2015 May 12)
+Patch to make Lua 5.3 and later work. (Felix Schnizlein, 2015 Jun 11)
+
+Patch to make \U in a string accept up to 8 characters. (Christian Brabandt,
+2015 Jun 12) Does this break existing scripts?
+
Crash when changing the 'tags' option from a remote command.
(Benjamin Fritz, 2015 Mar 18, stack trace Mar 20)
@@ -176,6 +170,13 @@ specifically? First try with the parens, then without.
Patch to force redraw after ":syn spell" command. (Christian, 2015 May 8)
+Patch for multi-byte characters in langmap and applying a mapping on them.
+(Christian Brabandt, 2015 Jun 12)
+Is this the right solution?
+
+Patch for langmap not working properly with mapping in Command-line mode.
+Issue 376.
+
Value returned by virtcol() changes depending on how lines wrap. This is
inconsistent with the documentation.
@@ -184,6 +185,7 @@ Better greek spell checking. Issue 299.
Patch to add 'completeselect' option. Specifies how to select a candidate in
insert completion. (Shougo, 2013 May 29)
Update to add to existing 'completeopt'. 2013 May 30
+Updated update: Shougo 2015 Jun 12
When complete() first argument is before where insert started and 'backspace'
is Vi compatible, the completion fails. (Hirohito Higashi, 2015 Feb 19)
@@ -336,9 +338,6 @@ Patch to add argument to :cquit. (Thinca, 2014 Oct 12)
No error for missing endwhile. (ZyX, 2014 Mar 20)
-The entries added by matchaddpos() are returned by getmatches() but can't be
-set with setmatches(). (lcd47, 2014 Jun 29)
-
Patch to make extend() fail early when it might fail at some point.
(Olaf Dabrunz, 2015 May 2) Makes extend() slower, do we still want it?
Perhaps only the checks that can be done without looping over the dict or
diff --git a/runtime/indent/html.vim b/runtime/indent/html.vim
index 71443abe5b..7eb963b7b2 100644
--- a/runtime/indent/html.vim
+++ b/runtime/indent/html.vim
@@ -2,7 +2,7 @@
" Header: "{{{
" Maintainer: Bram Moolenaar
" Original Author: Andy Wokula <anwoku@yahoo.de>
-" Last Change: 2015 Jan 11
+" Last Change: 2015 Jun 12
" Version: 1.0
" Description: HTML indent script with cached state for faster indenting on a
" range of lines.
@@ -94,7 +94,7 @@ func! HtmlIndent_CheckUserSettings()
let autotags = g:html_indent_autotags
endif
let b:hi_removed_tags = {}
- if autotags
+ if len(autotags) > 0
call s:RemoveITags(b:hi_removed_tags, split(autotags, ","))
endif
diff --git a/runtime/indent/r.vim b/runtime/indent/r.vim
index 82bdc8bba4..105f0cd7ad 100644
--- a/runtime/indent/r.vim
+++ b/runtime/indent/r.vim
@@ -1,12 +1,12 @@
" Vim indent file
" Language: R
" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
-" Last Change: Fri Feb 15, 2013 08:11PM
+" Last Change: Thu Mar 26, 2015 05:36PM
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
- finish
+ finish
endif
let b:did_indent = 1
@@ -15,478 +15,501 @@ setlocal indentexpr=GetRIndent()
" Only define the function once.
if exists("*GetRIndent")
- finish
+ finish
endif
" Options to make the indentation more similar to Emacs/ESS:
if !exists("g:r_indent_align_args")
- let g:r_indent_align_args = 1
+ let g:r_indent_align_args = 1
endif
if !exists("g:r_indent_ess_comments")
- let g:r_indent_ess_comments = 0
+ let g:r_indent_ess_comments = 0
endif
if !exists("g:r_indent_comment_column")
- let g:r_indent_comment_column = 40
+ let g:r_indent_comment_column = 40
endif
if ! exists("g:r_indent_ess_compatible")
- let g:r_indent_ess_compatible = 0
+ let g:r_indent_ess_compatible = 0
+endif
+if ! exists("g:r_indent_op_pattern")
+ let g:r_indent_op_pattern = '\(+\|-\|\*\|/\|=\|\~\|%\)$'
endif
function s:RDelete_quotes(line)
- let i = 0
- let j = 0
- let line1 = ""
- let llen = strlen(a:line)
- while i < llen
- if a:line[i] == '"'
- let i += 1
- let line1 = line1 . 's'
- while !(a:line[i] == '"' && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen
- let i += 1
- endwhile
- if a:line[i] == '"'
- let i += 1
- endif
- else
- if a:line[i] == "'"
- let i += 1
- let line1 = line1 . 's'
- while !(a:line[i] == "'" && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen
- let i += 1
- endwhile
- if a:line[i] == "'"
- let i += 1
- endif
- else
- if a:line[i] == "`"
- let i += 1
- let line1 = line1 . 's'
- while a:line[i] != "`" && i < llen
- let i += 1
- endwhile
- if a:line[i] == "`"
- let i += 1
- endif
- endif
- endif
+ let i = 0
+ let j = 0
+ let line1 = ""
+ let llen = strlen(a:line)
+ while i < llen
+ if a:line[i] == '"'
+ let i += 1
+ let line1 = line1 . 's'
+ while !(a:line[i] == '"' && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen
+ let i += 1
+ endwhile
+ if a:line[i] == '"'
+ let i += 1
+ endif
+ else
+ if a:line[i] == "'"
+ let i += 1
+ let line1 = line1 . 's'
+ while !(a:line[i] == "'" && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen
+ let i += 1
+ endwhile
+ if a:line[i] == "'"
+ let i += 1
endif
- if i == llen
- break
+ else
+ if a:line[i] == "`"
+ let i += 1
+ let line1 = line1 . 's'
+ while a:line[i] != "`" && i < llen
+ let i += 1
+ endwhile
+ if a:line[i] == "`"
+ let i += 1
+ endif
endif
- let line1 = line1 . a:line[i]
- let j += 1
- let i += 1
- endwhile
- return line1
+ endif
+ endif
+ if i == llen
+ break
+ endif
+ let line1 = line1 . a:line[i]
+ let j += 1
+ let i += 1
+ endwhile
+ return line1
endfunction
" Convert foo(bar()) int foo()
function s:RDelete_parens(line)
- if s:Get_paren_balance(a:line, "(", ")") != 0
- return a:line
- endif
- let i = 0
- let j = 0
- let line1 = ""
- let llen = strlen(a:line)
- while i < llen
- let line1 = line1 . a:line[i]
- if a:line[i] == '('
- let nop = 1
- while nop > 0 && i < llen
- let i += 1
- if a:line[i] == ')'
- let nop -= 1
- else
- if a:line[i] == '('
- let nop += 1
- endif
- endif
- endwhile
- let line1 = line1 . a:line[i]
- endif
+ if s:Get_paren_balance(a:line, "(", ")") != 0
+ return a:line
+ endif
+ let i = 0
+ let j = 0
+ let line1 = ""
+ let llen = strlen(a:line)
+ while i < llen
+ let line1 = line1 . a:line[i]
+ if a:line[i] == '('
+ let nop = 1
+ while nop > 0 && i < llen
let i += 1
- endwhile
- return line1
+ if a:line[i] == ')'
+ let nop -= 1
+ else
+ if a:line[i] == '('
+ let nop += 1
+ endif
+ endif
+ endwhile
+ let line1 = line1 . a:line[i]
+ endif
+ let i += 1
+ endwhile
+ return line1
endfunction
function! s:Get_paren_balance(line, o, c)
- let line2 = substitute(a:line, a:o, "", "g")
- let openp = strlen(a:line) - strlen(line2)
- let line3 = substitute(line2, a:c, "", "g")
- let closep = strlen(line2) - strlen(line3)
- return openp - closep
+ let line2 = substitute(a:line, a:o, "", "g")
+ let openp = strlen(a:line) - strlen(line2)
+ let line3 = substitute(line2, a:c, "", "g")
+ let closep = strlen(line2) - strlen(line3)
+ return openp - closep
endfunction
function! s:Get_matching_brace(linenr, o, c, delbrace)
- let line = SanitizeRLine(getline(a:linenr))
- if a:delbrace == 1
- let line = substitute(line, '{$', "", "")
- endif
- let pb = s:Get_paren_balance(line, a:o, a:c)
- let i = a:linenr
- while pb != 0 && i > 1
- let i -= 1
- let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c)
- endwhile
- return i
+ let line = SanitizeRLine(getline(a:linenr))
+ if a:delbrace == 1
+ let line = substitute(line, '{$', "", "")
+ endif
+ let pb = s:Get_paren_balance(line, a:o, a:c)
+ let i = a:linenr
+ while pb != 0 && i > 1
+ let i -= 1
+ let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c)
+ endwhile
+ return i
endfunction
" This function is buggy because there 'if's without 'else'
" It must be rewritten relying more on indentation
function! s:Get_matching_if(linenr, delif)
-" let filenm = expand("%")
-" call writefile([filenm], "/tmp/matching_if_" . a:linenr)
- let line = SanitizeRLine(getline(a:linenr))
- if a:delif
- let line = substitute(line, "if", "", "g")
- endif
- let elsenr = 0
- let i = a:linenr
- let ifhere = 0
- while i > 0
- let line2 = substitute(line, '\<else\>', "xxx", "g")
- let elsenr += strlen(line) - strlen(line2)
- if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()'
- let elsenr -= 1
- if elsenr == 0
- let ifhere = i
- break
- endif
- endif
- let i -= 1
- let line = SanitizeRLine(getline(i))
- endwhile
- if ifhere
- return ifhere
- else
- return a:linenr
+ let line = SanitizeRLine(getline(a:linenr))
+ if a:delif
+ let line = substitute(line, "if", "", "g")
+ endif
+ let elsenr = 0
+ let i = a:linenr
+ let ifhere = 0
+ while i > 0
+ let line2 = substitute(line, '\<else\>', "xxx", "g")
+ let elsenr += strlen(line) - strlen(line2)
+ if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()'
+ let elsenr -= 1
+ if elsenr == 0
+ let ifhere = i
+ break
+ endif
endif
+ let i -= 1
+ let line = SanitizeRLine(getline(i))
+ endwhile
+ if ifhere
+ return ifhere
+ else
+ return a:linenr
+ endif
endfunction
function! s:Get_last_paren_idx(line, o, c, pb)
- let blc = a:pb
- let line = substitute(a:line, '\t', s:curtabstop, "g")
- let theidx = -1
- let llen = strlen(line)
- let idx = 0
- while idx < llen
- if line[idx] == a:o
- let blc -= 1
- if blc == 0
- let theidx = idx
- endif
- else
- if line[idx] == a:c
- let blc += 1
- endif
- endif
- let idx += 1
- endwhile
- return theidx + 1
+ let blc = a:pb
+ let line = substitute(a:line, '\t', s:curtabstop, "g")
+ let theidx = -1
+ let llen = strlen(line)
+ let idx = 0
+ while idx < llen
+ if line[idx] == a:o
+ let blc -= 1
+ if blc == 0
+ let theidx = idx
+ endif
+ else
+ if line[idx] == a:c
+ let blc += 1
+ endif
+ endif
+ let idx += 1
+ endwhile
+ return theidx + 1
endfunction
" Get previous relevant line. Search back until getting a line that isn't
" comment or blank
function s:Get_prev_line(lineno)
- let lnum = a:lineno - 1
+ let lnum = a:lineno - 1
+ let data = getline( lnum )
+ while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$')
+ let lnum = lnum - 1
let data = getline( lnum )
- while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$')
- let lnum = lnum - 1
- let data = getline( lnum )
- endwhile
- return lnum
+ endwhile
+ return lnum
endfunction
" This function is also used by r-plugin/common_global.vim
" Delete from '#' to the end of the line, unless the '#' is inside a string.
function SanitizeRLine(line)
- let newline = s:RDelete_quotes(a:line)
- let newline = s:RDelete_parens(newline)
- let newline = substitute(newline, '#.*', "", "")
- let newline = substitute(newline, '\s*$', "", "")
- return newline
+ let newline = s:RDelete_quotes(a:line)
+ let newline = s:RDelete_parens(newline)
+ let newline = substitute(newline, '#.*', "", "")
+ let newline = substitute(newline, '\s*$', "", "")
+ if &filetype == "rhelp" && newline =~ '^\\method{.*}{.*}(.*'
+ let newline = substitute(newline, '^\\method{\(.*\)}{.*}', '\1', "")
+ endif
+ return newline
endfunction
function GetRIndent()
- let clnum = line(".") " current line
+ let clnum = line(".") " current line
- let cline = getline(clnum)
- if cline =~ '^\s*#'
- if g:r_indent_ess_comments == 1
- if cline =~ '^\s*###'
- return 0
- endif
- if cline !~ '^\s*##'
- return g:r_indent_comment_column
- endif
- endif
+ let cline = getline(clnum)
+ if cline =~ '^\s*#'
+ if g:r_indent_ess_comments == 1
+ if cline =~ '^\s*###'
+ return 0
+ endif
+ if cline !~ '^\s*##'
+ return g:r_indent_comment_column
+ endif
endif
-
- let cline = SanitizeRLine(cline)
-
- if cline =~ '^\s*}' || cline =~ '^\s*}\s*)$'
- let indline = s:Get_matching_brace(clnum, '{', '}', 1)
- if indline > 0 && indline != clnum
- let iline = SanitizeRLine(getline(indline))
- if s:Get_paren_balance(iline, "(", ")") == 0 || iline =~ '(\s*{$'
- return indent(indline)
- else
- let indline = s:Get_matching_brace(indline, '(', ')', 1)
- return indent(indline)
- endif
- endif
+ endif
+
+ let cline = SanitizeRLine(cline)
+
+ if cline =~ '^\s*}' || cline =~ '^\s*}\s*)$'
+ let indline = s:Get_matching_brace(clnum, '{', '}', 1)
+ if indline > 0 && indline != clnum
+ let iline = SanitizeRLine(getline(indline))
+ if s:Get_paren_balance(iline, "(", ")") == 0 || iline =~ '(\s*{$'
+ return indent(indline)
+ else
+ let indline = s:Get_matching_brace(indline, '(', ')', 1)
+ return indent(indline)
+ endif
endif
+ endif
- " Find the first non blank line above the current line
- let lnum = s:Get_prev_line(clnum)
- " Hit the start of the file, use zero indent.
- if lnum == 0
- return 0
- endif
+ " Find the first non blank line above the current line
+ let lnum = s:Get_prev_line(clnum)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
- let line = SanitizeRLine(getline(lnum))
+ let line = SanitizeRLine(getline(lnum))
- if &filetype == "rhelp"
- if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{'
- return 0
- endif
- if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{'
- return 0
- endif
- if line =~ '^\\method{.*}{.*}(.*'
- let line = substitute(line, '^\\method{\(.*\)}{.*}', '\1', "")
- endif
+ if &filetype == "rhelp"
+ if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{'
+ return 0
endif
-
- if cline =~ '^\s*{'
- if g:r_indent_ess_compatible && line =~ ')$'
- let nlnum = lnum
- let nline = line
- while s:Get_paren_balance(nline, '(', ')') < 0
- let nlnum = s:Get_prev_line(nlnum)
- let nline = SanitizeRLine(getline(nlnum)) . nline
- endwhile
- if nline =~ '^\s*function\s*(' && indent(nlnum) == &sw
- return 0
- endif
- endif
- if s:Get_paren_balance(line, "(", ")") == 0
- return indent(lnum)
- endif
+ if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{'
+ return 0
endif
-
- " line is an incomplete command:
- if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$'
- return indent(lnum) + &sw
+ endif
+
+ if &filetype == "rnoweb" && line =~ "^<<.*>>="
+ return 0
+ endif
+
+ if cline =~ '^\s*{'
+ if g:r_indent_ess_compatible && line =~ ')$'
+ let nlnum = lnum
+ let nline = line
+ while s:Get_paren_balance(nline, '(', ')') < 0
+ let nlnum = s:Get_prev_line(nlnum)
+ let nline = SanitizeRLine(getline(nlnum)) . nline
+ endwhile
+ if nline =~ '^\s*function\s*(' && indent(nlnum) == &sw
+ return 0
+ endif
endif
-
- " Deal with () and []
-
- let pb = s:Get_paren_balance(line, '(', ')')
-
- if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$'))
- return indent(lnum) + &sw
+ if s:Get_paren_balance(line, "(", ")") == 0
+ return indent(lnum)
endif
+ endif
- let bb = s:Get_paren_balance(line, '[', ']')
+ " line is an incomplete command:
+ if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$'
+ return indent(lnum) + &sw
+ endif
- let s:curtabstop = repeat(' ', &tabstop)
- if g:r_indent_align_args == 1
+ " Deal with () and []
- if pb == 0 && bb == 0 && (line =~ '.*[,&|\-\*+<>]$' || cline =~ '^\s*[,&|\-\*+<>]')
- return indent(lnum)
- endif
+ let pb = s:Get_paren_balance(line, '(', ')')
- if pb > 0
- if &filetype == "rhelp"
- let ind = s:Get_last_paren_idx(line, '(', ')', pb)
- else
- let ind = s:Get_last_paren_idx(getline(lnum), '(', ')', pb)
- endif
- return ind
- endif
+ if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$'))
+ return indent(lnum) + &sw
+ endif
- if pb < 0 && line =~ '.*[,&|\-\*+<>]$'
- let lnum = s:Get_prev_line(lnum)
- while pb < 1 && lnum > 0
- let line = SanitizeRLine(getline(lnum))
- let line = substitute(line, '\t', s:curtabstop, "g")
- let ind = strlen(line)
- while ind > 0
- if line[ind] == ')'
- let pb -= 1
- else
- if line[ind] == '('
- let pb += 1
- endif
- endif
- if pb == 1
- return ind + 1
- endif
- let ind -= 1
- endwhile
- let lnum -= 1
- endwhile
- return 0
- endif
+ let s:curtabstop = repeat(' ', &tabstop)
- if bb > 0
- let ind = s:Get_last_paren_idx(getline(lnum), '[', ']', bb)
- return ind
- endif
+ if g:r_indent_align_args == 1
+ if pb > 0 && line =~ '{$'
+ return s:Get_last_paren_idx(line, '(', ')', pb) + &sw
endif
- let post_block = 0
- if line =~ '}$'
- let lnum = s:Get_matching_brace(lnum, '{', '}', 0)
- let line = SanitizeRLine(getline(lnum))
- if lnum > 0 && line =~ '^\s*{'
- let lnum = s:Get_prev_line(lnum)
- let line = SanitizeRLine(getline(lnum))
- endif
- let pb = s:Get_paren_balance(line, '(', ')')
- let post_block = 1
+ let bb = s:Get_paren_balance(line, '[', ']')
+
+ if pb > 0
+ if &filetype == "rhelp"
+ let ind = s:Get_last_paren_idx(line, '(', ')', pb)
+ else
+ let ind = s:Get_last_paren_idx(getline(lnum), '(', ')', pb)
+ endif
+ return ind
endif
- let post_fun = 0
- if pb < 0 && line !~ ')\s*[,&|\-\*+<>]$'
- let post_fun = 1
- while pb < 0 && lnum > 0
- let lnum -= 1
- let linepiece = SanitizeRLine(getline(lnum))
- let pb += s:Get_paren_balance(linepiece, "(", ")")
- let line = linepiece . line
+ if pb < 0 && line =~ '.*[,&|\-\*+<>]$'
+ let lnum = s:Get_prev_line(lnum)
+ while pb < 1 && lnum > 0
+ let line = SanitizeRLine(getline(lnum))
+ let line = substitute(line, '\t', s:curtabstop, "g")
+ let ind = strlen(line)
+ while ind > 0
+ if line[ind] == ')'
+ let pb -= 1
+ else
+ if line[ind] == '('
+ let pb += 1
+ endif
+ endif
+ if pb == 1
+ return ind + 1
+ endif
+ let ind -= 1
endwhile
- if line =~ '{$' && post_block == 0
- return indent(lnum) + &sw
- endif
+ let lnum -= 1
+ endwhile
+ return 0
+ endif
- " Now we can do some tests again
- if cline =~ '^\s*{'
- return indent(lnum)
- endif
- if post_block == 0
- let newl = SanitizeRLine(line)
- if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$'
- return indent(lnum) + &sw
- endif
- endif
+ if bb > 0
+ let ind = s:Get_last_paren_idx(getline(lnum), '[', ']', bb)
+ return ind
endif
+ endif
- if cline =~ '^\s*else'
- if line =~ '<-\s*if\s*()'
- return indent(lnum) + &sw
- else
- if line =~ '\<if\s*()'
- return indent(lnum)
- else
- return indent(lnum) - &sw
- endif
- endif
+ let post_block = 0
+ if line =~ '}$'
+ let lnum = s:Get_matching_brace(lnum, '{', '}', 0)
+ let line = SanitizeRLine(getline(lnum))
+ if lnum > 0 && line =~ '^\s*{'
+ let lnum = s:Get_prev_line(lnum)
+ let line = SanitizeRLine(getline(lnum))
+ endif
+ let pb = s:Get_paren_balance(line, '(', ')')
+ let post_block = 1
+ endif
+
+ " Indent after operator pattern
+ let olnum = s:Get_prev_line(lnum)
+ let oline = getline(olnum)
+ if olnum > 0
+ if line =~ g:r_indent_op_pattern
+ if oline =~ g:r_indent_op_pattern
+ return indent(lnum)
+ else
+ return indent(lnum) + &sw
+ endif
+ else
+ if oline =~ g:r_indent_op_pattern
+ return indent(lnum) - &sw
+ endif
+ endif
+ endif
+
+ let post_fun = 0
+ if pb < 0 && line !~ ')\s*[,&|\-\*+<>]$'
+ let post_fun = 1
+ while pb < 0 && lnum > 0
+ let lnum -= 1
+ let linepiece = SanitizeRLine(getline(lnum))
+ let pb += s:Get_paren_balance(linepiece, "(", ")")
+ let line = linepiece . line
+ endwhile
+ if line =~ '{$' && post_block == 0
+ return indent(lnum) + &sw
endif
- if bb < 0 && line =~ '.*]'
- while bb < 0 && lnum > 0
- let lnum -= 1
- let linepiece = SanitizeRLine(getline(lnum))
- let bb += s:Get_paren_balance(linepiece, "[", "]")
- let line = linepiece . line
- endwhile
- let line = s:RDelete_parens(line)
+ " Now we can do some tests again
+ if cline =~ '^\s*{'
+ return indent(lnum)
+ endif
+ if post_block == 0
+ let newl = SanitizeRLine(line)
+ if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$'
+ return indent(lnum) + &sw
+ endif
endif
+ endif
- let plnum = s:Get_prev_line(lnum)
- let ppost_else = 0
- if plnum > 0
+ if cline =~ '^\s*else'
+ if line =~ '<-\s*if\s*()'
+ return indent(lnum) + &sw
+ else
+ if line =~ '\<if\s*()'
+ return indent(lnum)
+ else
+ return indent(lnum) - &sw
+ endif
+ endif
+ endif
+
+ let bb = s:Get_paren_balance(line, '[', ']')
+ if bb < 0 && line =~ '.*]'
+ while bb < 0 && lnum > 0
+ let lnum -= 1
+ let linepiece = SanitizeRLine(getline(lnum))
+ let bb += s:Get_paren_balance(linepiece, "[", "]")
+ let line = linepiece . line
+ endwhile
+ let line = s:RDelete_parens(line)
+ endif
+
+ let plnum = s:Get_prev_line(lnum)
+ let ppost_else = 0
+ if plnum > 0
+ let pline = SanitizeRLine(getline(plnum))
+ let ppost_block = 0
+ if pline =~ '}$'
+ let ppost_block = 1
+ let plnum = s:Get_matching_brace(plnum, '{', '}', 0)
+ let pline = SanitizeRLine(getline(plnum))
+ if pline =~ '^\s*{$' && plnum > 0
+ let plnum = s:Get_prev_line(plnum)
let pline = SanitizeRLine(getline(plnum))
- let ppost_block = 0
- if pline =~ '}$'
- let ppost_block = 1
- let plnum = s:Get_matching_brace(plnum, '{', '}', 0)
- let pline = SanitizeRLine(getline(plnum))
- if pline =~ '^\s*{$' && plnum > 0
- let plnum = s:Get_prev_line(plnum)
- let pline = SanitizeRLine(getline(plnum))
- endif
- endif
+ endif
+ endif
- if pline =~ 'else$'
- let ppost_else = 1
- let plnum = s:Get_matching_if(plnum, 0)
- let pline = SanitizeRLine(getline(plnum))
- endif
+ if pline =~ 'else$'
+ let ppost_else = 1
+ let plnum = s:Get_matching_if(plnum, 0)
+ let pline = SanitizeRLine(getline(plnum))
+ endif
- if pline =~ '^\s*else\s*if\s*('
- let pplnum = s:Get_prev_line(plnum)
- let ppline = SanitizeRLine(getline(pplnum))
- while ppline =~ '^\s*else\s*if\s*(' || ppline =~ '^\s*if\s*()\s*\S$'
- let plnum = pplnum
- let pline = ppline
- let pplnum = s:Get_prev_line(plnum)
- let ppline = SanitizeRLine(getline(pplnum))
- endwhile
- while ppline =~ '\<\(if\|while\|for\|function\)\s*()$' || ppline =~ '\<else$' || ppline =~ '<-$'
- let plnum = pplnum
- let pline = ppline
- let pplnum = s:Get_prev_line(plnum)
- let ppline = SanitizeRLine(getline(pplnum))
- endwhile
- endif
+ if pline =~ '^\s*else\s*if\s*('
+ let pplnum = s:Get_prev_line(plnum)
+ let ppline = SanitizeRLine(getline(pplnum))
+ while ppline =~ '^\s*else\s*if\s*(' || ppline =~ '^\s*if\s*()\s*\S$'
+ let plnum = pplnum
+ let pline = ppline
+ let pplnum = s:Get_prev_line(plnum)
+ let ppline = SanitizeRLine(getline(pplnum))
+ endwhile
+ while ppline =~ '\<\(if\|while\|for\|function\)\s*()$' || ppline =~ '\<else$' || ppline =~ '<-$'
+ let plnum = pplnum
+ let pline = ppline
+ let pplnum = s:Get_prev_line(plnum)
+ let ppline = SanitizeRLine(getline(pplnum))
+ endwhile
+ endif
- let ppb = s:Get_paren_balance(pline, '(', ')')
- if ppb < 0 && (pline =~ ')\s*{$' || pline =~ ')$')
- while ppb < 0 && plnum > 0
- let plnum -= 1
- let linepiece = SanitizeRLine(getline(plnum))
- let ppb += s:Get_paren_balance(linepiece, "(", ")")
- let pline = linepiece . pline
- endwhile
- let pline = s:RDelete_parens(pline)
- endif
+ let ppb = s:Get_paren_balance(pline, '(', ')')
+ if ppb < 0 && (pline =~ ')\s*{$' || pline =~ ')$')
+ while ppb < 0 && plnum > 0
+ let plnum -= 1
+ let linepiece = SanitizeRLine(getline(plnum))
+ let ppb += s:Get_paren_balance(linepiece, "(", ")")
+ let pline = linepiece . pline
+ endwhile
+ let pline = s:RDelete_parens(pline)
endif
+ endif
- let ind = indent(lnum)
- let pind = indent(plnum)
+ let ind = indent(lnum)
+ let pind = indent(plnum)
- if g:r_indent_align_args == 0 && pb != 0
- let ind += pb * &sw
- return ind
- endif
+ if g:r_indent_align_args == 0 && pb != 0
+ let ind += pb * &sw
+ return ind
+ endif
- if g:r_indent_align_args == 0 && bb != 0
- let ind += bb * &sw
- return ind
- endif
+ if g:r_indent_align_args == 0 && bb != 0
+ let ind += bb * &sw
+ return ind
+ endif
- if ind == pind || (ind == (pind + &sw) && pline =~ '{$' && ppost_else == 0)
- return ind
- endif
+ if ind == pind || (ind == (pind + &sw) && pline =~ '{$' && ppost_else == 0)
+ return ind
+ endif
+
+ let pline = getline(plnum)
+ let pbb = s:Get_paren_balance(pline, '[', ']')
+ while pind < ind && plnum > 0 && ppb == 0 && pbb == 0
+ let ind = pind
+ let plnum = s:Get_prev_line(plnum)
let pline = getline(plnum)
+ let ppb = s:Get_paren_balance(pline, '(', ')')
let pbb = s:Get_paren_balance(pline, '[', ']')
-
- while pind <