Làm thế nào tôi có thể hoàn thành mã mờ


27

Khi sử dụng ReSharper trong các biểu tượng Visual Studio có thể được tự động hoàn thành bằng cách sử dụng kết hợp mờ thay vì khớp tiền tố. Ví dụ nếu tôi đang tìm một hàm có tên DoSomethingAmazingtôi có thể viết DoSoAmvà nó sẽ cố gắng mở rộng truy vấn của tôi để phù hợp với tất cả các ký tự chứa Do, SoAmđâu đó trong tên của họ.

Một ví dụ khác có thể được tìm thấy trong gif dưới đây. Bạn có thể thấy một số mở rộng trong đó các chuỗi không có tiền tố được mở rộng thành biểu tượng chính xác. (Bỏ qua việc mở rộng đoạn trích như trong câu hỏi này, tôi chỉ quan tâm đến kết hợp mờ).Một gif hiển thị một số ví dụ về kết hợp mờ trong hành động

Một ví dụ khác có thể được nhìn thấy trong plugin YouCompleteMe cho Vim: Một gif hiển thị nhiều ví dụ về kết hợp mờ trong hành động trong vim

Tự động hoàn thànhChế độ công ty dường như có kết hợp tiền tố nhưng tôi không thể tìm cách kích hoạt kết hợp mờ.

Lý tưởng nhất là giải pháp bất khả tri về ngôn ngữ và áp dụng cho bất kỳ gói hoàn thành biểu tượng nào tôi đang sử dụng nhưng tôi cũng quan tâm đến các giải pháp dành riêng cho ngôn ngữ. Tôi đã xem Helm nhưng chưa tìm được cách áp dụng nó vào việc hoàn thành mã.

Tôi đã xem xét các lựa chọn thay thế như có một phím bấm để kích hoạt hoàn thành biểu tượng bằng cách sử dụng bộ đệm Helm nhưng tôi hy vọng có một cách để làm điều này bằng cách sử dụng hoàn thành kiểu cửa sổ bật lên.

Tôi cũng sẵn sàng thực hiện cấu hình thủ công trên cơ sở từng ngôn ngữ vì một số ngôn ngữ tách các ký hiệu bằng dấu gạch ngang trong khi các ngôn ngữ khác sử dụng dấu gạch dưới hoặc dấu gạch ngang mà tôi cho là sẽ ảnh hưởng đến cách thực hiện khớp.


Câu trả lời:


19

Chức năng hoàn thành dựng sẵn của Emacs cung cấp kết hợp mờ tương tự (tho theo mặc định, nó được sử dụng cho "do-so-am" thay vì "DoSoAm") và các phiên bản gần đây của chế độ công ty IIUC sử dụng điều này ít nhất trong một số trường hợp.

Ví dụ: nếu bạn mở một elisp đệm sử dụng Emacs-24,4 và công ty-mode mới nhất, nếu bạn gõ (wi-sycông ty sẽ bật lên một trình đơn hiển thị hoàn thành window-system, window-system-for-displaywith-syntax-table.


2
Với company-modehỗ trợ Emacs 24.4 completion-styles, bài đăng này gợi ý một cài đặt có thể để dùng thử.
wasamasa

Sau khi cài đặt 24.4, tôi thấy rằng đây chính xác là thứ tôi đang tìm kiếm. Thật không may, nó có vẻ là ngôn ngữ cụ thể và sẽ yêu cầu thay đổi đối với phụ trợ của công ty để làm cho nó hoạt động cho các ngôn ngữ khác. Tuy nhiên, trong số các câu trả lời, đó là câu trả lời gần nhất mà tôi đã tìm thấy và hy vọng sẽ có nhiều thời gian hơn để áp dụng cho nhiều ngôn ngữ hơn. Cảm ơn!
Jake Woods

company-ycmdlà một phụ trợ khác hỗ trợ hoàn thành mờ.
Dmitry

9

Với company-mode, bạn có thể sử dụng C-sđể tìm kiếm từ các ứng cử viên có sẵn mà nó hiển thị. Truy vấn tìm kiếm được hiển thị trong modeline (tôi không thực sự dễ dàng nhận ra. Tôi đã gửi một vấn đề ở đây ).

Nếu bạn muốn sử dụng Helm để hoàn thành, hãy cân nhắc sử dụng helm-company hoặc ac-helm . Chưa thử ac-helm, nhưng với helm-company, bạn có thể liên kết trực tiếp nó với một khóa để thay thế giao diện chuẩn của company-complete.


Điều này gần với những gì tôi đang tìm kiếm. Tôi đã hy vọng hoàn thành mà không cần phải gọi phím bấm nhưng tôi thấy rằng việc sử dụng nó kết hợp với kết hợp tiền tố thể hiện một sự thay thế phù hợp. Cảm ơn!
Jake Woods

Nếu bạn sử dụng company-modeUI, bạn có thể nhấn C-sđể tìm kiếm một ứng cử viên từ danh sách các ứng cử viên có sẵn companyđược trình bày cho bạn.
Từ Đô

Đúng, tôi hiểu điều đó và giống như tôi đã nói trong phần bình luận ở trên, gần với những gì tôi đang tìm kiếm. Giải pháp lý tưởng (đối với tôi) sẽ không yêu cầu Cs và sẽ tìm kiếm các ứng cử viên nội tuyến trong cửa sổ bật lên khi tôi nhập. Nhưng phương pháp Cs chắc chắn rất thú vị và tôi dự định sẽ tích hợp nó vào quy trình làm việc của mình.
Jake Woods

Trong khi sử dụng công ty, tôi thấy C-M-slà cách tốt hơn C-s. Với meta, nó sẽ lọc các ứng cử viên thay vì chỉ tìm kiếm.
mẫu

@nanny thật tuyệt khi biết điều đó.
Từ Đô

5

Như đã đề cập trong một bình luận trước đó, ycmd hỗ trợ kết hợp mờ. Bạn có thể sử dụng nó thông qua company-ycmd. Được cấu hình đúng, bạn có thể hoàn thành ngôn ngữ cụ thể cũng như hoàn thành dựa trên định danh đơn giản trong một trải nghiệm khá liền mạch.


sẽ thật tuyệt khi thể hiện "đúng" nghĩa là gì ở đây.
Jason Hu

2

Có một số gói cung cấp hoàn thành mờ của loại này hoặc loại khác. Tôi tưởng tượng rằng Helm làm, ví dụ (kể từ khi bạn đề cập đến nó).

Nếu bạn sử dụng thư viện Icicles thì bạn có thể chọn (một cách nhanh chóng) trong số một số phương thức hoàn thành mờ - nhiều lựa chọn hơn tôi đã thấy được cung cấp ở nơi khác. (Bản thân tôi không phải là một fan hâm mộ của sự hoàn thành mờ nhạt, nhưng tôi cung cấp nó.)

Icicles hoàn thành (hoàn thành do đó mờ, nếu bạn chọn đó) áp dụng khá nhiều ở khắp mọi nơi, nhưng không có một toàn bộ rất nhiều Icicles cụ thể đang -completion tính năng. Đây trang của Icicles doc nói về ví dụ hoàn đệm văn.


Với Icicles , sử dụng ví dụ của Stefan về việc hoàn thành (wi-sytrong chế độ Emacs Lisp:

  1. Khi hoàn thành Icicles vanilla (những gì Emacs cung cấp, tôn trọng completion-styles), bạn sẽ có được những biểu tượng tương tự mà Stefan đề cập.

  2. Với phương thức hoàn thành biểu tượng mờ Icicles Swank (từ thư viện el-swank-fuzzy.el) làm phương thức hoàn thành TAB hiện tại, bạn sẽ có được các ứng cử viên hoàn thành này:

    hệ thống cửa sổ                
    với cú pháp-bảng
    cửa sổ-hệ thống để hiển thị
    widget-mã hóa-hệ thống hành động
    widget-icon-prompt-Internal
    widget-mã hóa-hệ thống-nhắc-giá trị
    với-swfy-struct
    widget-spec-doc
    với thời gian chờ
    trường chỉ định widget
    widget-spec-active
    nút chỉ định widget
    widget-spec-insert
    widget-spec-sample
    widget-spec-secret
    widget-spec-inactive
    window-safe-co ngót-p
    widget-type-copy
    thay đổi kích thước cửa sổ
    cửa sổ - thay đổi kích thước gốc-cửa sổ theo chiều dọc
    cửa sổ hiển thị
    cửa sổ - bộ đệm hiển thị
    cửa sổ - thay đổi kích thước-áp dụng-p
    cửa sổ thay đổi kích thước-áp dụng-tổng số
    widgetp-display-Hoàn thành
    window-redisplay-end-trigger
    với-hiển thị-bộ đệm-cửa sổ
    tiện ích hiển thị-giá trị-tạo
    widget-emacs-library-link-action
    widget-editable-list-entry-created
    widget-emacs-bình luận-liên kết-hành động

3 ứng cử viên đầu tiên, một lần nữa, là những người mà Stefan đề cập.

  1. Với việc hoàn thành kết hợp mờ đơn giản (thư viện fuzzy-match.el), ứng cử viên duy nhất là with-syntax-table.

  2. Với Icicles phân tán hoàn thành mờ , bạn có được tất cả các ứng cử viên mà Swank hoàn thành mờ cung cấp, cộng với sau:

    ange-ftp-chờ-không bận
    dired-vào-dir-với-symlinks
    ediff-select-window-setup-function-tự động
    ediff-make-wide-display
    ediff-toggle-wide-display
    ediff-window-display-p
    ediff-window-ok-for-display
    ediff-with-cú pháp-bảng
    find-new-buffer-file-code-system
    gnus-frame-hoặc-window-display-name
    cửa sổ trợ giúp-hiển thị-tin nhắn
    icicle-select-window-for-buffer-display
    hoàn nguyên-bộ đệm-với mã hóa-hệ thống
    set-w32-system-code-system
    set-window-display-bảng
    set-window-redisplay-end-trigger
    shell-write-history-on-exit
    chia cửa sổ hợp lý
    cây-widget - thư mục định vị
    w32-find-file-not-Found-set-buffer-file -oding-system
    w32-khởi tạo-cửa sổ-hệ thống
  1. Với việc hoàn thành chuỗi con mờ của Icicles Levenshtein (1) (khoảng cách Levenshtein là 1), bạn chỉ nhận được những hoàn thành sau:
    biểu tượng trợ giúp
    tin nhắn-kiểm tra-tin tức-cú pháp
    w32-khởi tạo-cửa sổ-hệ thống cửa sổ hệ thống
    cửa sổ-hệ thống để hiển thị
  1. Với khoảng cách Levenshtein là 2 thay vì 1, có hơn 300 ứng viên hoàn thành.

  2. Với việc hoàn thành Levenshtein (1 hoặc 2) nghiêm ngặt, không có ứng cử viên nào . Tương tự như vậy, đối với việc hoàn thành mờ của Icicles Jaro-Winkler .


1
Tôi đồng ý có một số API chồng chéo tiềm năng để hoàn thành mờ, nhưng việc hoàn tất mã thường yêu cầu kiểm tra thời gian chạy cụ thể được biên dịch hoặc kiểm tra. Như bạn tự nói, Icicles cung cấp rất ít về cách các tính năng hoàn tất mã, vì vậy nó dường như không liên quan đến câu hỏi trong tay.
2014

@dgtized: Chà, tôi không đồng ý. Bạn đã thử completion.elchưa (Tương tự, dabbrevhippie-expand- cả 3 đều được bao gồm trong GNU Emacs.) Những điều này khá hữu ích khi hoàn thành mã, mặc dù, như bạn đề xuất, chúng không có kiến thức về mã cụ thể. Bạn có thể ngạc nhiên về mức độ hữu ích của chúng (có hoặc không có kết hợp mờ). Và như thế này, bất kỳ hoàn thành cụ thể theo mã nào sử dụng bộ thu nhỏ để hoàn thành khi có nhiều ứng cử viên tự động hưởng lợi từ việc hoàn thành mờ của Icicles .
vẽ

2

nếu bạn sử dụng ivy, trong các bản cập nhật gần đây ivyhỗ trợ hoàn thành chức năng điểm trong lớp phủ. Ivy hỗ trợ kết hợp mờ với sự giúp đỡ của flx. Kiểm tra video này về cách thức hoạt động :)

Tất cả những gì bạn phải làm là, nhấn phím ràng buộc complete-symboltheo mặc định được ràng buộc C-M-ivà một lớp phủ sẽ bật lên và bạn sử dụng kết hợp mờ để có được ứng cử viên hoàn thành.

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.