It seems that a recent commit (314dd79ca) has broken shell-script indention.
This is using Vim 8.1.877.
To reproduce, try creating a simple shell script with several if-then-else
statements. Then edit the script with Vim, and try re-indenting the file with
gg=G, and you will see that the indention is not what is expected.
At first I suspected it might be something in my configuration, but I get the
same problem when running without a vimrc ("vim -u NONE") and manually entering
":filetype plugin indent on" and "set filetype=sh".
For instance, consider this script. Note that the "if" and "then" are
represented with both styles, where if and then are on the same line, and also
where they are on separate lines. Both styles are valid, and a matter of
preference.
#!/bin/bash
# Use gg=G to re-indent whole file
if [[ /bin/true ]]; then
echo "hello true"
else
if [[ /bin/false ]]; then
echo "hello false"
else
echo "true"
fi
fi
if [[ /bin/true ]]
then
echo "hello true"
else
if [[ /bin/false ]]
then
echo "hello false"
else
echo "true"
fi
fi
This gets reformatted by Vim 8.1.877 to be:
#!/bin/bash
# Use gg=G to re-indent whole file
if [[ /bin/true ]]; then
echo "hello true"
else
if [[ /bin/false ]]; then
echo "hello false"
else
echo "true"
fi
fi
if [[ /bin/true ]]
then
echo "hello true"
else
if [[ /bin/false ]]
then
echo "hello false"
else
echo "true"
fi
fi
It appears that the author was trying to improve the indention for shell
scripts, but it seems to have made things worse. :-/
Here's a patch that I made locally that seems to fix it. I am sure there is a
better way to do this, but I was in a rush.
diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim
index c93be3195..028dcf275 100644
--- a/runtime/indent/sh.vim
+++ b/runtime/indent/sh.vim
@@ -114,12 +114,13 @@ function! GetShIndent()
let line = curline
" Current line is a endif line, so get indent from start of "if condition"
line
" TODO: should we do the same for other "end" lines?
- if curline =~ '^\s*\%(fi\)\s*\%(#.*\)\=$'
- let previous_line = search('if.\{-\};\s*then\s*\%(#.*\)\=$', 'bnW')
- if previous_line > 0
- let ind = indent(previous_line)
- endif
- elseif line =~ '^\s*\%(then\|do\|else\|elif\|done\|end\)\>' ||
s:end_block(line)
+" if curline =~ '^\s*\%(fi\)\s*\%(#.*\)\=$'
+" let previous_line = search('if.\{-\};\s*then\s*\%(#.*\)\=$', 'bnW')
+" if previous_line > 0
+" let ind = indent(previous_line)
+" endif
+" elseif line =~ '^\s*\%(then\|do\|else\|elif\|done\|end\)\>' ||
s:end_block(line)
+ if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' ||
s:end_block(line)
let ind -= s:indent_value('default')
elseif line =~ '^\s*esac\>' && s:is_case_empty(getline(v:lnum - 1))
let ind -= s:indent_value('default')
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.