vim에서 일치하는 중괄호를 자동으로 만드는 방법은 무엇입니까?
다음과 같이 작동해야 합니다. 여는 중괄호를 입력하면 닫는 중괄호가 자동으로 나타나고 커서가 가운데에 배치되어야 합니다. 중괄호 쌍을 벗어나려면 Ctrl-j조합을 사용하세요.
자동 버팀대 삽입을 제공하는 플러그인이 많이 있습니다. 그러나 그들은
- Ctrl-j중괄호 분리 쌍과 다른 키 조합을 사용하거나
- 간섭다기능 가위키바인딩.
다음은 예상대로 작동합니다.
:inoremap ( ()<Esc>:let leavechar=")"<CR>i
:imap <C-j> <Esc>:exec "normal f" . leavechar<CR>a
그러나 이러한 설정을 사용하면 UltiSnips 스니펫이 더 이상 작동하지 않습니다. 그래서 UltiSnips를 사용하여 닫는 중괄호를 삽입합니다.
inoremap ( (<C-R>=UltiSnips_Anon('($1)$0', '(')<CR>
이것은 거의 작동합니다. 일치하는 중괄호가 삽입되고 건너뛰기 닫는 중괄호를 사용할 수 있습니다 Ctrl-j. 그러나 이는 여는 중괄호 앞에 공백이 있는 경우에만 작동합니다.
main () // works, the closing parentheses is added
main( // fails without a space
내 솔루션에는 닫는 중괄호를 건너뛰기 위해 다른 키 바인딩이 필요하거나 여는 중괄호 앞에 공백이 필요합니다. 이 문제를 어떻게 해결하나요?
참고: 예제로 괄호를 사용하고 있습니다. 괄호, 중괄호, 대괄호 및 미만 기호와 함께 사용해야 하며 UltiSnips 플러그인을 방해하지 않습니다.
답변1
vim에서 일치하는 중괄호를 자동으로 만드는 방법은 무엇입니까?
보시다시피 이 문제는 간단하지 않습니다. 간단한 대답은 다음과 같습니다. 플러그인을 사용하세요.자동 종료또는스마트 입력. 순진하게 다시 매핑하면( [ .. 키를 사용하면 몇 줄의 극단적인 경우가 표시됩니다. 이것이 바로 이러한 플러그인이 만들어진 이유이며 플러그인이 종종 매우 복잡한 이유입니다(좋은 경우).
그래서 UltiSnips를 사용하여 닫는 중괄호를 삽입했습니다.
다음을 시도해 볼 수 있습니다(원래 제안과 다름).
inoremap ( ()<CR>=UltiSnips_Anon('$1)$0', ')')<CR>
UltiSnips는 일치에 (
포함되지 않고 그 안의 라인을 분할합니다 . main
이를 위해 조각 플러그인을 사용할 때의 문제점은 (보통) 중첩을 지원하지 않기 때문에 다음(중첩) 조각을 삽입할 때 점프 위치를 잊어버린다는 것입니다.
중괄호 쌍을 벗어나려면 Ctrl-j조합을 사용하세요.
Ctrl-jUltiSnips 또는 충돌하는 플러그인을 다시 매핑할 수 있습니다 . 문서에 매핑이 나열되지 않은 경우 :map/imap/nmap <key>
디스플레이 매핑을 사용할 수 있습니다. Ctrl-j이 두 플러그인의 작업을 선택하고 완료 하려면 다음이 필요합니다.
- 당신이 상상하는 것보다 훨씬 더 발전했습니다.
- 나는 당신이 정말로 뭔가를 원하지 않는 것 같아요
다음 bash 루프를 고려해보세요.
while (( ${arr1[i]} < ${arr2[i<CURSOR>]} )); do
[next_snippet_position_marker]
done
Ctrl-j이 경우 루프 몸체에 도달하려면 5번을 눌러야 합니다 . 닫는 중괄호를 사용하여 해당 중괄호를 벗어나면 커서가 실제로 이동하는 위치를 더 효과적으로 제어할 수 있습니다. 삽입된 쌍을 추적하고 Ctrl-j팝핑 및 이동에 사용하기 위해 스택을 구현할 수 있지만 스택에서 중괄호를 제거하지 않고 수동으로 제거하기 시작하면 문제가 발생합니다. 이제 중괄호 플러그인이 해결하려는 문제를 해결하기 시작합니다. 재발명하기 어려운 바퀴입니다.
Ctrl-j이를 확장하면 중괄호를 사용하여 원래 요청한 것을 얻을 수 있습니다.그리고파편. 일부 더미 값을 사용하여 프래그먼트 위치를 나타내고 이를 닫는 중괄호와 함께 스택에 푸시하고 Ctrl-j프래그먼트 또는 중괄호 처리에 해당하도록 동적으로 다시 매핑하는 경우. 그러나 어떤 마법이 일어나야 하는지 알아내기 위해 몇 가지 고급 경험적 방법을 구현해야 합니다. 왜냐하면 본질적으로 두 가지 문제를 동시에 해결하고 있기 때문입니다. 이 문제는 현재 조각 삽입 플러그인과 중괄호 일치 플러그인 제작자가 각각 해결하고 있습니다. , 그리고 이러한 문제를 다시 해결하세요.그들의편리함과 마법을 위한 솔루션.
이는 제어와 편의성의 문제로 귀결됩니다. 이 경우 컨트롤이 더 나은 결과를 가져올 것이라고 생각합니다. 즉, 이러한 문제와 관련 플러그인 및 키맵을 별도로 유지해야 함을 의미합니다. 여전히 편리함을 원한다면 가능하지만 어렵습니다.
답변2
자동 종료로 인해 약간의 지연이 추가되고 내 설정(Ultisnips 및 Supertab)에도 방해가 된다는 사실을 발견했지만 Eclipse CDT를 에뮬레이트하는 방식이 마음에 듭니다.
나는 사용한다경계 파트너탐색 및 들여쓰기에 도움이 되도록 다음 맵을 사용하여 동일한 결과를 얻으십시오.
imap <C-F> <C-G>g " To jump out brackets in same line.
inoremap <C-K> <ESC>ki<TAB> " To move and insert an indent on the line before the current cursor (assuming empty line)
저는 이렇게 사용합니다. 여는 부분을 삽입 { <CR><CR><C-K>
하고 들여쓰기된 안쪽 줄에 쓰기 시작합니다.
답변3
개인적으로 사용하고 있어요스마트 입력대괄호와 따옴표를 자동으로 삽입하는 데 사용됩니다. 예를 들어, 아무 곳이나 입력하면 커서가 중앙에 위치 {
합니다 . 브래킷 그룹을 {}
탈퇴하려면 를 삽입하면 됩니다 . {
}
}
그러나 이는 탭 및 괄호 외부 점프에 대한 요구 사항을 지원합니다. 또한 대괄호 사이에 새 키를 생성하지 않지만 어쨌든 추가 키가 필요합니다 <CR>
.
<C-J>
다음 줄로 이동하도록 매핑할 수 있습니다 .
:inoremap <C-J> <C-O>j
또는 다음 줄의 시작 부분으로 이동하려면 다음을 수행하세요.
:inoremap <C-J> <C-O>+
답변4
제 생각에는경계 파트너필요한 것을 수행하십시오.
대괄호나 따옴표를 자동으로 닫고 그 사이에 커서를 놓습니다. 삽입 모드에서 한 쌍의 대괄호를 벗어나려면 +를 수행할 수 있지만 Ctrl-g다음 항목에 추가하여 g다시 매핑 할 수 있습니다.Ctrl-jvimrc
% Jump out of a block of parentheses (uses delimitMate)
imap <C-j> <C-g>g