이 코드가 주어지면:
#!/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"
)
vim에서 실행 하면 gg=G
코드는 다음과 같습니다.
#!/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)로 테스트해봐도 비슷한 현상은 발생하지 않았습니다.
정보:
Wim 7.4.52
No.vimrc
답변1
이것={motion}
연산자는 다양한 설정( 'equalprg'
, 'indentexpr'
, 'lisp'
)으로 정의할 수 있지만 이러한 설정이 모두 해제되면 다음을 사용하는 것으로 대체됩니다.C 들여쓰기. 그것이 여기서 일어나고 있는 일입니다.
C 들여쓰기는 C 언어에 적용되며 주로 C 중괄호 { ... }
및 식별자(예 if
: else
, while
등)를 기반으로 결정됩니다.
이 중 많은 부분이 bash(및 기타 여러 언어)에 매우 친숙하므로 대부분의 경우 잘 작동합니다.
if
그러나 C 언어에서는 변수 할당이나 OR 문에서 while
논리식을 묶는 데 괄호가 사용됩니다 . Vim은 이러한 형식을 지정하고(따라서 일치하는 괄호 세트를 추적하려고 함) 얼마나 깊이 표시되는지에 대해 몇 가지 제한을 적용하려고 합니다.
C에서는 표현식에 괄호가 사용되며 이러한 표현식은 일반적으로 짧기 때문에 이를 추적할 수 있는 기본 제한은 20줄입니다.
[ 'cinoptions'
]는 많은 C 들여쓰기를 제어할 수 있으며 이를 제어할 수 있는 옵션이 있는 것으로 나타났습니다. 이것)N
대괄호 표현식의 행 제한을 조정하는 옵션을 사용할 수 있습니다.
예를 들어 100줄로 늘립니다.
:set cinoptions=)100
(또는 10개로 줄이려면 를 사용하세요 :set cinoptions=)10
.)
이것은 무슨 일이 일어나고 있는지 설명하고 유용한 해결 방법으로 바뀔 수 있는 빠른 해킹일 수 있습니다. 그러나 여기서 올바른 해결책은 다음을 설정하는 것입니다.'indentexpr'
작성 중인 언어에 적합합니다. (C 들여쓰기는 'indentexpr'
설정되지 않은 경우에만 적용됩니다.)
Vim은 실제로 쉘 스크립트 들여쓰기를 위한 플러그인을 제공합니다. 어쩌면 활성화하지 않았을 수도 있습니다. 귀하의 명령에 다음 명령이 포함되어 있는지 확인하십시오 .vimrc
.
filetype indent on
그런 다음 쉘 스크립트가 다음 유형으로 인식되는지 확인하십시오 sh
.
:set filetype?
filetype=sh
그렇지 않은 경우 설정합니다(왜 그런 일이 발생하지 않는지 자세히 조사해야 할 수도 있음).
:setf sh
'indentexpr'
설정되어 있는지 다시 확인할 수 있습니다 .
:set indentexpr?
indentexpr=GetShIndent()
이러한 설정을 활성화하면 =
쉘 스크립트가 예상대로 작동합니다.