Chọn một mục trong danh sách tự động hoàn thành vim mà không cần ngắt dòng


22

Một tính năng khá khó chịu của vim là nếu bạn đang ở chế độ chèn và thực hiện tự động hoàn thành (Ctrl-N), hãy nhấn phím mũi tên xuống mục mong muốn và nhấn phím Enter, sau đó nó sẽ chèn mục đó nhưng cũng chèn một dòng mới mà bạn sau đó phải xóa.

Có cách nào để chọn một mục trong danh sách tự động hoàn thành mà không nhận thêm một dòng mới không mong muốn không?


1
Đây không phải là cách nó hoạt động với tôi ... Tôi chọn một cái gì đó, nhấn Enter và con trỏ vẫn ở trên cùng một dòng sau đó.
goldilocks

Câu trả lời:


37

Nó phụ thuộc vào trạng thái menu bật lên mà bạn đang ở (xem :help popupmenu-completion). Tôi hiểu từ câu hỏi của bạn rằng bạn đang ở trạng thái 2 (vì bạn đã nhấn các phím mũi tên để tìm sự hoàn thành). Tuy nhiên, hành vi mặc định cho Entertrạng thái 2 là chèn hoàn thành mà không có dòng mới; những gì bạn mô tả thường là hành vi của trạng thái 1 (đó là khi bạn sử dụng Ctrl+ N/ Ctrl+ P.)

Một cách hoạt động nhất quán ở tất cả các tiểu bang là sử dụng Ctrl+ Y. Tôi thích nhớ chữ Y là viết tắt của "có, chấp nhận từ đó". Cũng có thể bắt đầu nhập văn bản sẽ xuất hiện sau từ đã hoàn thành, trừ khi bạn đã ánh xạ lại những thứ như trong câu trả lời của geedoubleya.

Trong cùng một bối cảnh, bạn có thể nhấn Ctrl+ Eđể hủy menu và để lại văn bản của bạn như trước khi bạn gọi nó. Nếu bạn đã quen với các cặp Ctrl+ ECtrl+ Ytrong các bối cảnh khác (ví dụ: cuộn lên hoặc xuống trong chế độ bình thường hoặc để chèn ký tự bên dưới hoặc bên trên con trỏ ở chế độ chèn), đó là một cách để ghi nhớ ở đây. Tôi đoán bạn cũng có thể nghĩ nó là "thoát" menu hoặc tương tự.

Xem :help popupmenu-keysđể biết thêm.


2
Ah ha, điều đó có ý nghĩa. Tôi đã sử dụng Ctrl-N để mở trình đơn thả xuống. Tôi vừa mới sử dụng các phím mũi tên để điều hướng thả xuống. Tôi không biết bạn có thể sử dụng các phím mũi tên để mở trình đơn thả xuống.
Tyler Durden

Các phím mũi tên không thể mở trình đơn thả xuống, trong cấu hình mặc định. Sự khác biệt tôi đã đề cập là về việc điều hướng menu sau khi nó được mở.
echristopherson

Vì một số lý do khi tôi cố gắng làm điều này với <kbd> Ctrl </ kbd> + <kbd> Y </ kbd>, nó cũng thụt dòng, không mong muốn. Bất kỳ suy nghĩ về lý do tại sao điều đó sẽ xảy ra?
mpacer

Tôi chưa bao giờ gặp phải điều đó. Có lẽ đó là do một số cài đặt thụt lề hoặc một plugin bạn đã quên. Tôi sẽ hỏi trong danh sách gửi thư của Vim: vim.org/maillist.php .
echristopherson

6

Cá nhân tôi sử dụng cái này:

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

Bất cứ ai sử dụng plugin CtrlP đều có thể thấy ánh xạ này thuận tiện.


3

Tôi biết điều này đã cũ, nhưng loại heo con dựa vào câu trả lời của geedoubleya vì mặc dù câu trả lời của echristopherson là thông tin và tuyệt vời, nếu bất cứ ai muốn một giải pháp nhanh chóng và bẩn thỉu:

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

2

Thay thế cho việc sử dụng các phím mũi tên của bạn, hãy cho phép các phím j& của bạn kcuộn qua danh sách tự động hoàn thành.

Làm điều này thay đổi dòng hiện tại để phù hợp với từ đã chọn khi bạn cuộn.

Do đó, bạn không phải nhấn enter vì con trỏ vẫn ở chế độ chèn ở cuối từ được thay thế.

Để bật tính năng này, hãy thêm phần này vào .vimrc của bạn (Cảm ơn những người khác tại stackoverflow):

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

Một cách riêng biệt, thay vì sử dụng các phím mũi tên, bạn chỉ cần lặp lại thao tác Ctrl-nsẽ nguyền rủa thông qua các tùy chọn ( Ctrl-pđể đi ngược lại) và thay thế trên dòng hiện tại khi nó di chuyển, không cần Enteránh xạ khóa vim.


Hành vi này có thể hơi khó hiểu, vì nó là cả 1) trong chế độ chèn và 2) diễn giải j và k để làm những việc họ không làm trong chế độ chèn. Cụ thể, bạn không thể chọn một mục menu và sau đó theo dõi trực tiếp với một cái gì đó bắt đầu bằng j hoặc k.
echristopherson

Đồng ý, đó là lý do tại sao tôi cung cấp tùy chọn khác nếu đây là một bước quá xa. Cá nhân, tôi thích sự nhầm lẫn hơn là di chuyển bàn tay của tôi để sử dụng các mũi tên.
geedoubleya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.