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

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

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

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

답변1

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

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

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

자세한 내용은 참조하세요 :help popupmenu-keys.

답변2

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

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>"))

답변4

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

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

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

이를 활성화하려면 .vimrc에 다음을 추가하세요(Stackoverflow의 다른 분들께 감사드립니다):

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

별도로 화살표 키를 사용하는 대신 Ctrl-n옵션을 통해 저주를 반복하고( Ctrl-p뒤로 이동) 이동하면서 현재 줄을 대체할 수 있으며 Entervim 키 매핑이 필요하지 않습니다.

관련 정보