Vim

Vim autoindent 在 20 行後停止在 bash 中縮進多行數組

  • August 3, 2019

鑑於此程式碼:

#!/bin/bash

_DATABASES=(
       "secretX"
       "secretmin"
       "secretcopyijui"
       "secretcroma"
       "secretdemo"
       "secretdicopy"
       "secretflashcolo"
       "secretmdat"
       "secretneton"
       "secretprintshar"
       "secretrealjet"
       "secretsolumax"
       "secretunicopia"
       "secretworddigit"
       "secretducao"
       "secrette"
       "secrette_app"
       "secretanopecanh"
       "secretx_ead"
       "secretx_site"
       "secretdroppy"
       "secret"
)

當我gg=G在 vim 上做時,程式碼是這樣的:

#!/bin/bash

_DATABASES=(
       "secretX"
       "secretmin"
       "secretcopyijui"
       "secretcroma"
       "secretdemo"
       "secretdicopy"
       "secretflashcolo"
       "secretmdat"
       "secretneton"
       "secretprintshar"
       "secretrealjet"
       "secretsolumax"
       "secretunicopia"
       "secretworddigit"
       "secretducao"
       "secrette"
       "secrette_app"
       "secretanopecanh"
       "secretx_ead"
       "secretx_site"
"secretdroppy"
"secret"
)

為什麼?

對於較小的數組,一切都可以正常執行,但是當它是一個包含 20 多個元素的數組時,就會發生這種情況……

用其他語言(JS、C++、PHP)測試,沒有發生類似的行為。

資訊:

維姆 7.4.52

不是 .vimrc

={motion}運算符可以由許多設置(, 'equalprg', 'indentexpr')定義'lisp',但是當所有這些都未設置時,它會回退到使用C 縮進。這就是這裡發生的事情。

C 縮進是為 C 語言設計的,主要是在 C 大括號{ ... }和標識符(如if, else,while等)上得到提示。

事實證明,這對於 bash(以及許多其他語言)來說非常熟悉,因此在很多情況下都可以很好地工作。

但是,在 C 中,括號用於將邏輯表達式括在變數賦值或ifwhile語句中。Vim 想要格式化這些(所以它想要跟踪匹配括號的集合),但它想要對它的外觀設置一些限制。

由於在 C 語言中,括號用於表達式並且通常很短,因此跟踪它們的預設限制是 20 行。

[ 'cinoptions'] 可以控制很多 C 縮進,事實證明它有一個選項來控制它。該)N選項可用於調整括號表達式的行限制。

例如,要將其提高到 100 行:

:set cinoptions=)100

(或者要將其減少到 10,請使用:set cinoptions=)10。)

這可以解釋正在發生的事情,它可能是一個快速破解,可以變成一個可用的解決方法……但這裡正確的解決方案是為'indentexpr'您正在編寫的語言進行適當的設置。(請記住,C 縮進僅在'indentexpr'未設置時才開始。)

Vim 實際上提供了一個縮進 shell 腳本的外掛,也許你只是沒有啟用它。確保你有這個命令在你的.vimrc

filetype indent on

然後確保您的 shell 腳本被辨識為 type sh

:set filetype?
filetype=sh

如果不是,請設置它(您可能需要深入研究為什麼沒有發生):

:setf sh

您可以仔細檢查'indentexpr'已設置:

:set indentexpr?
indentexpr=GetShIndent()

啟用這些設置後,=將在 shell 腳本上按預期工作。

引用自:https://unix.stackexchange.com/questions/533639