줄 바꿈을 삽입하지 않고 vim 자동 완성 목록에서 항목을 선택하십시오.


22

vim의 다소 성가신 기능은 삽입 모드에 있고 자동 완성 (Ctrl-N)을하고 원하는 항목까지 화살표 키를 누른 다음 Enter 키를 누르면 항목을 삽입하지만 줄 바꿈을 삽입한다는 것입니다. 그런 다음 삭제해야합니다.

원치 않는 줄 바꿈을 추가하지 않고 자동 완성 목록에서 항목을 선택하는 방법이 있습니까?


1
이것은 나를 위해 작동하는 방법이 아닙니다 ... 무언가를 선택하고 Enter 키를 누르면 커서가 여전히 같은 줄에 있습니다.
goldilocks

답변:


37

사용중인 팝업 메뉴 상태에 따라 다릅니다 (참조 :help popupmenu-completion). 귀하의 질문에서 귀하가 상태 2에 있다는 것을 이해합니다 (완료를 찾기 위해 화살표 키를 눌렀으므로). 그러나 Enter상태 2 의 기본 동작은 줄 바꿈없이 완료를 삽입하는 것입니다. 설명하는 것은 일반적으로 상태 1의 동작입니다 ( Ctrl+ N/ Ctrl+ 를 사용할 때 P입니다).

모든 주에서 일관되게 작동하는 방법은 Ctrl+ 를 사용하는 것 Y입니다. 나는 Y가 "그렇습니다, 그 말을 받아들이십시오"라는 의미로 기억하고 싶습니다. geedoubleya의 답변에서와 같이 항목을 다시 매핑하지 않은 한 완성 된 단어 뒤에 나오는 텍스트를 입력하기 시작할 수도 있습니다.

같은 맥락에서 Ctrl+ E를 눌러 메뉴를 취소하고 텍스트를 호출하기 전과 같이 그대로 둘 수 있습니다. 다른 상황에서 Ctrl+ ECtrl+ 의 페어링에 익숙한 경우 Y(예 : 일반 모드에서 위 또는 아래로 스크롤하거나 삽입 모드에서 커서의 위 또는 아래에 문자를 삽입하는) 여기에서 기억하는 한 가지 방법입니다. 메뉴 나 그와 비슷한 것을 "종료"하는 것으로 생각할 수 있습니다.

자세한 내용 :help popupmenu-keys을 참조하십시오 .


2
아 하 맞아 드롭 다운을 열기 위해 Ctrl-N을 사용하고 있습니다. 방금 화살표 키를 사용하여 드롭 다운을 탐색했습니다. 화살표 키를 사용하여 드롭 다운을 열 수 있다는 것을 몰랐습니다.
Tyler Durden

기본 구성에서 화살표 키는 드롭 다운을 열 수 없습니다. 내가 언급 한 차이점은 메뉴가 열리면 메뉴를 탐색하는 것입니다.
echristopherson

어떤 이유로 <kbd> Ctrl </ kbd> + <kbd> Y </ kbd>로이 작업을 시도했을 때 원치 않는 행이 들여 쓰기되었습니다. 왜 그런 일이 일어날 지에 대한 생각이 있습니까?
mpacer

나는 그런 경험을 한 적이 없다. 아마도 들여 쓰기 설정이나 잊어 버린 플러그인 때문일 수 있습니다. Vim의 메일 링리스트 ( vim.org/maillist.php)에 물어볼 것 입니다.
echristopherson

6

개인적으로 나는 이것을 사용합니다 :

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

CtrlP 플러그인 을 사용하는 사람이라면 누구나이 매핑이 편리 할 것입니다.


3

나는 이것이 오래되었지만, 누군가가 빠르고 더러운 해결책을 원한다면 echristopherson의 대답이 유익하고 훌륭하기 때문에 geedoubleya의 대답에 대한 일종의 돼지 후원을 알고 있습니다.

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))

2

화살표 키를 사용하는 대신 j& k키를 사용하여 자동 완성 목록을 스크롤 할 수 있습니다 .

이렇게하면 스크롤 할 때 선택한 단어와 일치하도록 현재 줄이 변경됩니다.

따라서 대체 단어의 끝에서 커서가 여전히 삽입 모드에 있으므로 Enter를 누를 필요가 없습니다.

이것을 활성화하려면 이것을 .vimrc에 추가하십시오 (스택 오버 플로우에서 다른 사람들에게 감사합니다).

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

별도로 화살표 키를 사용하는 대신 Ctrl-n옵션을 통해 저주하는 옵션을 반복하고 ( Ctrl-p뒤로 이동) 현재 줄을 움직일 때 필요 Enter하거나 vim 키 매핑이 필요하지 않습니다 .


이 동작은 1) 삽입 모드에서 2) j와 k를 해석하여 삽입 모드에서 수행하지 않는 작업을 수행하기 때문에 약간 혼란 스러울 수 있습니다. 특히 메뉴 항목을 선택한 다음 j 또는 k로 시작하는 항목을 직접 따라갈 수 없습니다.
echristopherson

동의, 이것이 너무 긴 단계라면 다른 옵션을 제공 한 이유입니다. 개인적으로, 나는 화살표를 사용하기 위해 손을 움직이기보다는 혼란을 선호합니다.
geedoubleya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.