Có plugin nào tự động hoàn thành cho vim không?


11

Có một plugin tự động hoàn thành cho vim? lựa chọn của tôi là gì đây?

Hiện tại tôi đang sử dụng AutoComplPop , nhưng nó có khả năng tích hợp kém với snipMate mà tôi sử dụng và làm chậm các tệp Ruby (thậm chí <100 dòng).

Tôi đã thấy một vài plugin khác, nhưng chúng đã chết ít nhất là hơn một năm. Vậy, có ý kiến ​​gì không?


1
ACP hoạt động rất tốt ở đây và tôi không có vấn đề gì với SnipMate. Có một cài đặt ( let g:acp_behaviorSnipmateLength=-1xem :help autocomplpop) bạn có nghĩa vụ phải thêm vào .vimrc của mình, bạn đã thêm nó chưa?
romainl

Câu trả lời:


15

Đây là một câu hỏi cũ, nhưng tôi cứ tiếp tục quay lại với nó với một tia hy vọng mờ dần, nghĩ rằng một ngày nào đó tôi sẽ tìm thấy sự kết hợp đúng đắn của các plugin để cho tôi tự động hoàn thành trong Vim. Việc tìm kiếm vẫn tiếp tục, nhưng đây là tất cả các nghiên cứu tôi đã thực hiện trong suốt nhiều năm.

Trước hết, bạn phải hiểu Vim là một trình soạn thảo văn bản, không phải là một trình soạn thảo mã. Trình chỉnh sửa mã, IDES, là các công cụ như bộ công cụ Jetbrains, Visual Studio Code, Eclipse, v.v.

Về cơ bản, Vim không thể "tự động hoàn thành" mã. Tự động hoàn tất yêu cầu xem xét mã nguồn của bạn và phân tích AST. Hãy xem xét rằng Vim không thể thực hiện các hoạt động không đồng bộ cho đến khi Vim 8 được phát hành vào năm 2016, do đó, việc cố gắng chạy bất kỳ loại phần mềm giới thiệu mã nào trong plugin Vim sẽ là một cơn ác mộng. Nó bị cuốn vào lịch sử của hệ sinh thái Vim không làm điều này. Và tất cả những người cố gắng làm điều này, như Tern For Vim, thực sự là những cơn ác mộng để sử dụng.

Điều tốt nhất mà một trình soạn thảo văn bản có thể làm là đoạn trích và hoàn thành các từ / dòng / vv mà nó biết. Nếu bạn đang tìm cách tự động hoàn tất mã, bạn nên sử dụng trình chỉnh sửa mã chứ không phải trình soạn thảo văn bản.

Đây là những lựa chọn của bạn, trong đó tôi đã thử tất cả:

  • Hai phím tắt hữu ích là Ctrl- n, sẽ tự động hoàn thành một từ chỉ dựa trên bộ đệm hiện tại bạn đã mở (không có nội dung mã) và Ctrl- xCtrl- lsẽ tự động hoàn thành một dòng mã đầy đủ nếu bạn muốn sao chép một dòng mã. Bạn có thể biết Ctrl- xCtrl- f, sẽ tự động hoàn thành một tên tệp bao gồm đường dẫn, liên quan đến hiện tại :pwd. Các mẫu động hoàn tất plugin có thể được nhẹ hữu ích nếu bạn không tìm kiếm với /\v.

  • Được xây dựng trong Vim " Omnicompletion " được kích hoạt bởi Ctrl- x, Ctrl- o(đó là những gì tác giả Vim muốn bạn nhập mỗi lần) cùng với một loạt các plugin cụ thể về ngôn ngữ , nếu chúng tồn tại. Bạn có thể :echo &omnifunctrong một tệp để xem nếu bạn đã cài đặt Omnicompletion bởi Vim trong tệp bạn chọn.

  • AutoComplPop để tự động mở menu Omnicompletion ở trên khi gõ.

  • SuperTab cho phép bạn nhấn Tabđể kích hoạt hoàn thành tích hợp sẵn của Vim.

  • NeoComplCache là hoàn thành từ khóa (không khác biệt với hoàn thành tích hợp sẵn của Vim không được chỉ định), .vimrcthiết lập phức tạp và NeoSnippet để hoàn thành đoạn trích.

  • Một sự kết hợp quái vật của exuberant-ctagsDoctorJS(một dự án Mozilla đã chết trong một năm), TagBarmột thứ được trồng tại nhà để trích xuất hoàn thành từ các tệp thẻ.

  • SnipMate , một plugin hoàn thành thẻ cơ bản, cùng với các đoạn mã và tự mình tìm ra cách thêm đoạn mã, vì nó hơi khó.

  • UltiSnips cùng với UltiSnips-Snippetskhác nhau hơn so với đoạn trên.

  • Tern for Vim , một thư viện đầy hứa hẹn thực hiện nội suy mã thực tế để tự động hoàn thành chính xác. Tuy nhiên, đó là lỗi, rất chậm, có rò rỉ bộ nhớ sẽ làm sập Vim và có thể là từ bỏ phần mềm.

  • YouCompleteMe , một kiểu hoàn thành mờ như bạn chạy một máy chủ ở chế độ nền, cùng với chức năng được phát triển tại nhà để hoàn thành đoạn trích.

  • Eclim - một nỗ lực cao cả để chạy một máy chủ Eclipse trong nền và nói với Vim về sự tự động hoàn thành mà nó hướng nội khi đang di chuyển. Nó hoạt động tốt như Tern.

  • Cuối cùng, Closetag hoặc delimitMate hoặc Tự động đóng hoặc một bananagram cây nhà lá vườn để tự động đóng cửa của thẻ và ngoặc tự động trên gõ.

Hầu như mọi plugin trong danh sách này sẽ xung đột với hầu hết các plugin khác trong danh sách này.

YouCompleteMe dường như là người dẫn đầu gói, nhưng tôi chưa bao giờ có thể làm cho nó hoạt động chính xác khi hoàn thành thẻ và việc hoàn thành mã hóa nội bộ của nó vẫn chưa chứng minh được sức mạnh.

Ý kiến ​​cá nhân của tôi là tình trạng hiện tại của thế giới tự động hoàn thành Vim đang ở trong tình trạng xấu. Đối với các dự án nhỏ, bạn có thể ổn khi sử dụng một trong các giải pháp trên. Nếu bạn đang xử lý một API đơn giản, bạn có thể giữ phần lớn trong đầu, việc hoàn thành không thâm nhập mã có thể sẽ ổn. Nếu bạn đang làm việc với một dự án lớn, hoặc cần lợi ích của an toàn kiểu trong khi lập trình, một IDE đầy đủ ( Eclipse , Visual Studio , WebStorm ) sẽ phù hợp với bạn hơn nhiều so với Vim.

Dĩ nhiên, nhược điểm của IDE là bạn sẽ không còn sức mạnh của Vim trong tay nữa. Tôi chưa sử dụng một IDE duy nhất có chế độ Vim chấp nhận được.

Vim có sự thiên vị ngôn ngữ vừa phải đối với các ngôn ngữ giống như C, và nếu không có kỳ vọng rằng bất kỳ tính năng cụ thể nào về ngôn ngữ sẽ được người dùng thêm vào dưới dạng bổ trợ. Thật không may, điều này đã dẫn đến một hệ sinh thái tự động hoàn thành. Một số tùy chọn là phong nha, nhưng không có gì là hoàn hảo, và hiếm khi có một nhà lãnh đạo đa số / thực hành tốt nhất.


6

Đây là một cái hay: YouCompleteMe

YouCompleteMe làm cho menu thả xuống xuất hiện tự động khi bạn nhập và nó hỗ trợ lựa chọn mờ, vì vậy nếu bạn có một mã định danh được gọi partition_findervà bạn nhập một cái gì đó như ptftrong khi chỉnh sửa tệp C ++, danh sách gợi ý thả xuống sẽ bao gồm cả hai printfpartition_findervì chúng chứa cùng một chữ cái theo thứ tự tương tự. Nếu bạn có một biến được gọi myBrain, bạn có thể gõ brnvà nó sẽ gợi ý điều đó. YouCompleteMe cũng ưu tiên các đề xuất dựa trên tần suất sử dụng trước đó.


2

Tôi sử dụng neocomplcache với snipmate + snipmate snippets

let g:neocomplcache_snippets_dir='~/.vim/bundle/snipmate-snippets/snippets'

bạn có thể thấy vimrc của tôi


2

Tôi đang dùng thử necomplecache với neosnippet Tôi đoán nó sẽ có sự tích hợp tốt hơn vì cả hai đều được tác giả bởi cùng một người


1

Tôi tin rằng vim có một tích hợp được gọi là OmniComplete. Trong chế độ chèn sử dụng ctrl+x,ctrl+o.

Nếu không, bạn có thể hoàn thành từ khóa từ chế độ chèn với ctrl+n. Khi bạn gọi nó, nó sẽ cung cấp cho bạn danh sách thả xuống hiển thị các từ có thể tìm thấy trong tệp bạn đang chỉnh sửa, cũng như tìm thấy từ các tệp khác mà bạn đã mở. Tiếp tục nhấn ctrl+nđể xoay vòng qua các tùy chọn. Khi bạn đến từ bạn muốn, chỉ cần tiếp tục gõ như bình thường.

Nếu bạn không thể tìm thấy từ bạn muốn, ctrl+ncuối cùng sẽ thoát khỏi danh sách và bạn có thể tiếp tục nhập hoặc bạn có thể nhấn ESCvà sau đó bcwchuyển btừ bắt đầu của từ vi phạm và chuyển từ cthứ wtự bạn muốn.


Một trong những tích hợp của Vim dường như hút. Bất cứ khi nào tôi nhấn <cx> <co>, nó chỉ nói "Không tìm thấy mẫu". Tuy nhiên, nếu tôi nhấn <cn>, các phần hoàn thành sẽ xuất hiện trong danh sách thả xuống ngay bên dưới từ được gõ. Đó có phải là điều tương tự? Có cách nào để tự động hoàn thành thả xuống tự động xuất hiện mà không cần phải nhấn phím tắt không?
trusktr

Tôi không biết một plugin làm cho tự động hoàn thành bật lên mà không có tương tác, xin lỗi :(. <c-x><c-o>Chỉ hoạt động cho những thứ mà vim đã nói rõ ràng về cách hỗ trợ. Theo mặc định, tôi nghĩ rằng nó chỉ có thể làm một vài điều nhỏ và những thứ nhỏ nhặt giống như hoàn thành CSS, nhưng nếu bạn muốn một cái gì đó như Eclipse, có một vài plugin vim cố gắng cung cấp cho bạn.
Conrad.Dean

1
Tôi đã tìm thấy một plugin cho vim có tên YouCompleteMe, làm cho menu thả xuống tự động xuất hiện khi bạn nhập và nó hỗ trợ lựa chọn mờ, vì vậy nếu tôi có một mã định danh được gọi partition_findervà tôi gõ một cái gì đó như ptftrong khi chỉnh sửa tệp C ++, menu thả xuống sẽ gợi ý cả printfpartition_finderbởi vì chúng chứa các chữ cái giống nhau theo cùng một thứ tự. Nếu tôi có một biến được gọi myBrain, tôi có thể gõ brnvà nó sẽ xuất hiện. YouCompleteMe cũng ưu tiên các đề xuất dựa trên tần suất sử dụng trước đó. Kiểm tra nó ở đây: valloric.github.io/YouCompleteMe
trusktr

1

Tôi đã chọn một plugin mới SimpleAutoComplPop từ AutoComplPop ban đầu. Mặc dù, tôi không quen thuộc với ruby ​​hoặc snipMate, bạn có thể dùng thử và tôi rất vui khi nhận được một số phản hồi :)

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.