vim에서 일치하는 중괄호 자동 생성

vim에서 일치하는 중괄호 자동 생성

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이 두 플러그인의 작업을 선택하고 완료 하려면 다음이 필요합니다.

  1. 당신이 상상하는 것보다 훨씬 더 발전했습니다.
  2. 나는 당신이 정말로 뭔가를 원하지 않는 것 같아요

다음 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

관련 정보