使 vim 正确缩进管道 while 循环

Make vim properly indent piped while loop

我一直在用这行代码读取ip_list.txt中的ip 1.1.1.1,存入变量line然后打印出来:

if [ true == false ]; then # Example
ip="1.1.1.1"
grep -r $ip ip_list.txt | while read -r line ; do
echo "Line is: $line"
done
fi

代码运行良好,但 vim 没有正确缩进此代码。当我这样做时,g=GG,您可以看到 done 语法应该排在 grep 语法下方,但它与 if 语句一起排在左侧。它会在 vim:

中像这样缩进
if [ true == false ]; then
    ip="1.1.1.1"
    grep -r $ip ip_list.txt | while read -r line ; do
    echo "Line is: $line"
done # Went to the left. Not lined up with grep
fi

即使我删除了 ; ,并让底部的 do 像这样:

if [ true == false ]; then # Example
ip="1.1.1.1"
grep -r $ip ip_list.txt | while read -r line
do
echo "Line is: $line"
done
fi

done 语法在 vim 代码编辑器中仍然没有正确缩进(现在如果我这样做 g=GG):

if [ true == false ]; then
        ip="1.1.1.1"
        grep -r $ip ip_list.txt | while read -r line
do
        echo "Line is: $line"
done # not lined up with grep syntax
fi

有什么方法可以编辑此代码,以便 vim 可以正确缩进它?

预期的输出应该是:

if [ true == false ]; then
    ip="1.1.1.1"
    grep -r $ip ip_list.txt | while read -r line ; do
        echo "Line is: $line"
    done
fi

或者应该是

if [ true == false ]; then
    ip="1.1.1.1"
    grep -r $ip ip_list.txt | while read -r line
    do
        echo "Line is: $line"
    done
fi

vim 的缩进正则表达式不够智能。如果您愿意,可以自己编辑语法文件:使用 :scriptnames 查看由 vim 加载的文件,查看 syntax/sh.vim 文件的完整路径。

一种更简单的方法是更改​​您的 bash 语法:

if [ true == false ]; then # Example
ip="1.1.1.1"
while read -r line; do
echo "Line is: $line"
done < <(grep -r $ip ip_list.txt )
fi

正确缩进到

if [ true == false ]; then # Example
  ip="1.1.1.1"
  while read -r line; do
    echo "Line is: $line"
  done < <(grep -r $ip ip_list.txt )
fi