Tự động hoàn thành trong Vim


257

Tóm lại, tôi đang tìm kiếm một công tác tính năng tự động hoàn cho các biên tập Vim. Tôi đã lập luận trước đó rằng Vim thay thế hoàn toàn IDE trong Linux và trong khi điều đó chắc chắn là đúng, nó thiếu một tính năng quan trọng: tự động hoàn thành.

Tôi biết về Ctrl+ N, hội nhập cởi mở Ctags , TagList , cppcompleteOmniCppComplete . Than ôi, không có cái nào trong số này phù hợp với mô tả của tôi về chế độ tự động hoàn thành:

  • Ctrl+N hoạt động độc đáo (chỉ) nếu bạn đã quên cách đánh vần classhoặc while. Ồ tốt
  • Ctags mang đến cho bạn sự thô sơ nhưng có nhiều nhược điểm.
  • Taglist chỉ là một trình bao bọc Ctags và như vậy, thừa hưởng hầu hết các nhược điểm của nó (mặc dù nó hoạt động tốt để liệt kê các khai báo).
  • cppcomplete đơn giản là không hoạt động như đã hứa và tôi không thể hiểu mình đã làm gì sai, hoặc nếu nó hoạt động chính xác thì đúng là hạn chế và các hạn chế là do thiết kế.
  • OmniCppComplete dường như có cùng các vấn đề như cppcomplete, tức là tự động hoàn thành không hoạt động đúng. Ngoài ra, tagstệp một lần nữa cần phải được cập nhật thủ công.

Tôi nhận thức được thực tế rằng các IDE hoàn toàn hiện đại, thậm chí không cung cấp khả năng hoàn thành mã C ++ tốt. Đó là lý do tại sao tôi đã chấp nhận sự thiếu hụt của Vim trong lĩnh vực này cho đến bây giờ. Nhưng tôi nghĩ rằng một mức độ cơ bản của việc hoàn thành mã không phải là quá nhiều để yêu cầu, và trên thực tế là cần thiết để sử dụng hiệu quả. Vì vậy, tôi đang tìm kiếm thứ gì đó có thể hoàn thành ít nhất những điều sau đây.

  • Nhận thức cú pháp . cppcomplete hứa hẹn (nhưng không cung cấp cho tôi), chính xác, hoàn thành tự động nhận biết phạm vi sau đây:

    variableName.abc
    variableName->abc
    typeName::abc
    

    Và thực sự, bất cứ điều gì khác là hoàn toàn vô dụng.

  • Cấu hình . Tôi cần xác định (dễ dàng) vị trí của các tệp nguồn và do đó tập lệnh lấy thông tin tự động hoàn tất từ ​​đó. Trong thực tế, tôi đã có một Makefile trong thư mục của mình, trong đó chỉ định các đường dẫn bao gồm bắt buộc. Eclipse có thể giải thích thông tin tìm thấy trong đó, tại sao không phải là tập lệnh Vim?

  • Up-to-dately . Ngay khi tôi thay đổi một cái gì đó trong tệp của mình, tôi muốn tự động hoàn thành phản ánh điều này. Tôi không muốn kích hoạt thủ công ctags(hoặc một cái gì đó có thể so sánh). Ngoài ra, các thay đổi sẽ tăng dần , tức là khi tôi chỉ thay đổi một tệp, việc phân tích lại toàn bộ cây thư mục (có thể rất lớn) là không thể chấp nhậnctags được.

Tôi có quên gì không? Hãy cập nhật.

Tôi cảm thấy thoải mái với khá nhiều cấu hình và / hoặc mày mò nhưng tôi không muốn lập trình một giải pháp từ đầu và tôi không giỏi gỡ lỗi các tập lệnh Vim.

Một lưu ý cuối cùng, tôi thực sự thích một cái gì đó tương tự cho Java và C # nhưng tôi đoán đó là quá nhiều hy vọng: ctagschỉ phân tích các tệp mã và cả Java và C # đều có các khung công tác được biên dịch sẵn rất lớn cần được lập chỉ mục. Thật không may, phát triển .NET mà không có IDE thậm chí còn giống PITA hơn C ++.


4
Đã lâu rồi kể từ khi bạn hỏi câu hỏi này, cuối cùng bạn đã tìm thấy một câu hỏi hay chưa? Tôi đang hỏi bởi vì tôi không thấy bất kỳ câu trả lời được chấp nhận. Cá nhân mặc dù tôi phải thừa nhận rằng tôi đã sử dụng tiền tố các biến / hàm của mình. Ví dụ, tất cả chúng bắt đầu bằng sh(có nghĩa là trong thư viện của tôi) và theo sau là chữ viết tắt của lớp tôi. Ví dụ shPcho Parserlớp học. Sau đó, tất cả những gì bạn cần làm là viết shPvà nhấn CTRL + p (hoặc CTRL + n nếu bạn muốn) và đưa các thành viên lớp từ lần sử dụng cuối cùng đến lần đầu tiên (hoặc lần đầu tiên kéo dài nếu CTRL + n)
Shahbaz

4
@Shahbaz Trên thực tế, tôi tin chắc rằng không có giải pháp nào đủ tốt vào lúc này. clang_completevề mặt kỹ thuật là âm thanh nhất nhưng chậm nghiêm trọng do thiếu bộ nhớ đệm kết quả và biên dịch một phần. Tôi phải thừa nhận rằng tôi đã không thử tất cả các câu trả lời vì một số yêu cầu thiết lập phức tạp, tốn thời gian. Bây giờ tôi sẽ nín thở để có một plugin có thể sử dụng được vì clang cuối cùng cũng cho phép các nhà phát triển xây dựng AST từ các nguồn C ++ (cho đến nay, không có trình phân tích cú pháp miễn phí tốt nào cho C ++).
Konrad Rudolph

2
Bạn đã thử clang_completegần đây? Nó có thể sử dụng libclangvới bộ nhớ đệm ngay bây giờ và do đó sẽ nhanh hơn.
Jan Larres

@Jan Cảm ơn thông tin. Khi tôi thử lần cuối, hỗ trợ libclang vẫn còn sơ sài. Tôi có lẽ nên thử lại khi tôi có thời gian.
Konrad Rudolph

(Lý do chỉnh sửa rollback: tên sản phẩm không có mã, chúng không thuộc về formatted like this.)
Konrad Rudolph

Câu trả lời:


171

Hãy dùng thử YouCompleteMe . Nó sử dụng Clang thông qua giao diện libclang, cung cấp hoàn thành ngữ nghĩa C / C ++ / Objective-C. Nó giống như clang_complete, nhưng về cơ bản nhanh hơn và phù hợp với mờ.

Ngoài các cách trên, YCM cũng cung cấp hoàn thành ngữ nghĩa cho C #, Python, Go, TypeScript, v.v. Nó cũng cung cấp hoàn thành dựa trên định danh, không có ngữ nghĩa cho các ngôn ngữ mà nó không có hỗ trợ ngữ nghĩa.


69
Trong thực tế, tôi sẽ chấp nhận giải pháp này. Cuối cùng là một plugin cung cấp. Tôi đã sử dụng nó trong vài ngày nay. Chỉ mất bốn năm để trả lời câu hỏi này. ;-)
Konrad Rudolph

5
công việc tuyệt vời với valloric YouCompletMe! chúc mừng
statquant

5
Quá tệ YouCompleteMe là một PITA hoàn chỉnh để cài đặt trên Windows :(
xx

2
@DrTwox Từ readme: "YCM không có hỗ trợ chính thức cho Windows , nhưng điều đó không có nghĩa là bạn không thể làm cho nó hoạt động ở đó. Xem trang wiki Hướng dẫn cài đặt Windows. Vui lòng thêm vào nó."
dùng456584

7
Bài đăng này nên đề cập rằng bạn là tác giả, vì đây là quảng cáo tự giới hạn (mặc dù tôi sẽ không tranh luận rằng nó trả lời câu hỏi, dù sao bạn cũng nên bao gồm từ chối trách nhiệm).
EntangledLoops

36

Ngoài ra còn có clang_complete sử dụng clangtrình biên dịch để cung cấp hoàn thành mã cho các dự án C ++. Có một câu hỏi khác với gợi ý khắc phục sự cố cho plugin này.

Plugin dường như hoạt động khá tốt miễn là dự án biên dịch, nhưng rất chậm đối với các dự án lớn (vì nó cố gắng biên dịch đầy đủ để tạo danh sách thẻ).


Các clang_completePlugin hoạt động độc đáo trên Cygwin và Windows. Không thể nói bất cứ điều gì về các dự án lớn bởi vì tôi không có bất kỳ. :)
Lumi

Có vẻ như clang_complete sử dụng libclang đã lưu vào bộ đệm. Đây nên là câu trả lời được chấp nhận. Bạn đã thử clang_complete trên kernel Linux chưa? việc lập chỉ mục tốt nhất mà tôi đã thấy cho kernel là sử dụng CDT của Eclipse, nếu clang_complete có thể xử lý kernel thì nó có thể hoàn thành mọi thứ.
bảnh bao

clang_complete khá đơn giản là plugin Vim tốt nhất tôi sử dụng.
Cromulent

1
@Cromulent Ah, kiểm tra YouCompleteMe, nó tốt hơn nhiều.
Konrad Rudolph

@KonradRudolph Cảm ơn. Tôi sẽ kiểm tra.
Cromulent

7

theo yêu cầu, đây là nhận xét tôi đã đưa ra trước đó:

Có một cái nhìn tại đây:

liên kết này sẽ giúp bạn nếu bạn muốn sử dụng monodevelop trên MacOSX

Chúc may mắn và hạnh phúc mã hóa.


Liên kết OmniCompletion bị hỏng
dotoree

1
Tôi đề xuất github.com/nosami/OmniSharpServer với YouCompleteMe cho C #, như được đề xuất ở trên
rafee 16/12/13

6

Tôi vừa tìm thấy dự án Eclim được liên kết trong một câu hỏi khác . Điều này có vẻ khá hứa hẹn, ít nhất là cho tích hợp Java.


Bạn đã thử nó chưa? Có vẻ thú vị.
Pacane

@Pacane: không. Tôi đã không phải sử dụng Java trong nhiều tháng và không có thời gian rảnh để thử nghiệm.
Konrad Rudolph

1
Eclim dường như là một giải pháp tuyệt vời cho Java, mặc dù Eclipse vẫn là một con thú để tải ngay cả trong một thiết lập không đầu
Drupad Panchal

2
Đối với Java, bạn có thể sử dụng Vrapper . Tôi thấy rằng nó thường ổn với tự động hoàn thành tuyệt vời. Để chỉnh sửa văn bản nặng, thỉnh thoảng tôi có thể khởi chạy Vim thực như một công cụ bên ngoài.
kizzx2


2

là những gì bạn đang tìm kiếm một cái gì đó như intellisense?

insevim dường như để giải quyết vấn đề.

liên kết đến ảnh chụp màn hình ở đây


2
Đây sẽ là những gì tôi đang tìm kiếm, vâng. Thật không may, nó chỉ chạy trên Windows (Tôi đang sử dụng OS X). Ngoài ra, bản cập nhật cuối cùng dường như đã được thực hiện vào khoảng năm 2003. :-(
Konrad Rudolph

tốt, bạn có thể lấy mã nguồn :) nếu không, điều duy nhất tôi có thể nghĩ đến là omnicompletion .. hoặc xem cái này: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop cho công cụ .net ít nhất ..
Ric Tokyo

Ric, vui lòng cung cấp nhận xét của bạn dưới dạng hai câu trả lời riêng biệt, chúng là vô giá và tôi muốn tôn vinh chúng đúng cách! Điều đó nói rằng, MonoDevelop hiện tại không thể sử dụng được trong OS X và hiện tôi đang xem xét OmniCppComplete.
Konrad Rudolph

Lol đây chỉ là cửa sổ! :( Tại sao bạn nên muốn điều này trên windows nơi bạn có VS .. Tôi đang tìm giải pháp trên Linux.
Nils

Nils: Không phải ai cũng có quyền truy cập vào Visual Studio, cũng có rất nhiều người có kỹ năng vi mà họ muốn áp dụng trong môi trường Windows. Có một cổng để Linux, nhưng hiện tại nó đã ngừng hoạt động. Trong mọi trường hợp, bạn đang cố gắng để đạt được điều gì? bạn có chắc là bạn không chỉ cần các chức năng tự động hoàn thành mặc định? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/ khăn
Ric Tokyo

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.