Vim autoindent 在 20 行後停止在 bash 中縮進多行數組
鑑於此程式碼:
#!/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 中,括號用於將邏輯表達式括在變數賦值或
if
或while
語句中。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 腳本上按預期工作。