vim에서 중첩된 들여쓰기를 수행하는 방법은 무엇입니까?

vim에서 중첩된 들여쓰기를 수행하는 방법은 무엇입니까?

iabbrevvim에서 "autocomplete" 절이 있는 if-fi 문을 만들고 싶습니다 if-fi.

 autocmd Filetype sh iabbrev if if<esc>ma<cr>ifi<esc>`ak

따라서 다음 if이 생성됩니다.

if
fi

맞습니다. fi절 끝에 입력할 필요가 없습니다. 그래서 계속할 수 있습니다. 예를 들어:

if pwd; then
    echo "bla bla"

fi

이제 아래에 echo다른 문을 중첩하고 싶지만 이번에는 입력하면 if다음이 생성됩니다.

if pwd; then
    echo "bla bla"

    if
fi
fi

두 번째(중첩된) if-fi는 들여쓰기를 중단합니다. 결말은 fi다음과 같아야합니다.

if pwd; then
    echo "bla bla"

    if
    fi
fi

그래서 두 번째 if-fi조항은포함첫 번째. 그러나 나는 이것을 달성하는 방법을 모르겠습니다. 나는 가지고있다

:set autoindent
:set smartindent

따라서 vim은 들여쓰기 수준을 기억하므로 <cr>단일 백스페이스 키를 사용하여 중첩에서 올바른 들여쓰기를 얻을 수 있습니다 if-fi. 하지만 이를 달성하기 위해 어떤 키 매핑을 수행해야 하는지 모르겠습니다. 그러면 vim에서 올바른 들여쓰기 수준을 생성 .vimrc하려면 어떤 키맵을 추가해야 합니까 ?iabbrev

답변1

나는 당신이 겪고 있는 정확한 문제를 재현하지 못하며 filetype=sh들여쓰기 플러그인을 활성화하면 내 문제와 일치하도록 다시 감염되는 것 같습니다 fi.if

<CR>하지만 일반 모드를 사용하여 다음 줄로 이동한 다음 an을 사용하여 부품을 i삽입하므로 약어에서 문제를 볼 수 있습니다 . fi우선, 다음 줄이 이미 비어 있다고 계산합니다. 그렇지 않으면 fi이미 있는 줄 앞에만 추가됩니다. 새 줄을 삽입해도 일반적으로 새 줄을 삽입하면 자동 들여쓰기가 실행되지 않기 때문에 문제가 발생할 수도 있습니다. ( <CR>삽입 모드를 사용하거나 일반 모드 o명령을 사용하십시오.) 예.

내 제안은 삽입 모드를 유지하고 <C-o>단일 일반 모드 명령을 실행하여 마커를 설정하고 해당 위치로 이동하는 것입니다. (바라보다:help i_CTRL-O.)

이 약어는 잘 작동합니다.

iabbrev if if<C-o>ma<CR>fi<C-o>`a

이는 삽입 모드에서 발생하므로 실제로 새 행을 삽입하고 일반적으로 <CR>새 행을 삽입하는 데 걸리는 시간을 존중합니다.autoindent

파일 형식별로 약어를 설정하려면 일반적으로 로컬 버퍼로 설정해야 하므로 다른 형식의 파일을 편집하는 다른 버퍼가 있는 경우 해당 파일에는 적용되지 않습니다. <buffer>명령에 수정자를 추가하면 됩니다 .

iabbrev <buffer> if if<C-o>ma<cr>fi<C-o>`a

autocmd FileTye sh원한다면 에 추가할 수 있습니다. 를 사용하는 경우 autocmd일반적으로 에 보관하려고 하므로 augroupvimrc 파일을 다시 가져오면 자동 명령을 반복하지 않고 파일 형식이 일치할 때마다 여러 번 실행합니다.

나는 보통 Vim ftplugin 메커니즘이 이 문제를 처리하도록 하는 것을 선호합니다. 이렇게 하려면 이라는 파일을 만들고 ~/.vim/after/ftplugin/sh.vim명령 iabbrev <buffer> ...을 직접 추가하면 됩니다. (해당 섹션을 추가하지 마세요 .) Vim은 이를 자동으로 처리 하며 , autocmd. sh이렇게 하면 특정 파일 형식에 대한 많은 규칙을 얻는 것이 훨씬 간단해집니다. 또한 모든 파일 형식별 규칙으로 vimrc를 오염시키지 않습니다. 마지막으로, 긴 줄을 탈출하기 위해 자동 명령과 매핑을 사용하는 것에 대해 걱정할 필요가 없습니다.

관련 정보