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