Vim 자동 들여쓰기가 20줄 이후 bash에서 여러 줄 배열 들여쓰기를 중지합니다.

Vim 자동 들여쓰기가 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"
)

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()

이러한 설정을 활성화하면 =쉘 스크립트가 예상대로 작동합니다.

관련 정보