Bảng làm cho thẻ hoàn thành


8

TLDR: Tôi đã có một tệp thẻ lớn tải nhiều lần mỗi phiên, khiến nó không sử dụng được. Không thể tìm thấy nguồn gốc của vấn đề hoặc làm thế nào để vô hiệu hóa nó - mục tiêu chính là chuyển sang các thẻ, nhưng hoàn thành sẽ rất tốt

Gần đây tôi đã đăng trên subreddit emacs và một người dùng khuyên tôi nên tham gia nhóm này vì nó cũng thân thiện với người mới.

Tôi đã sử dụng emacs như một C ++ IDE và tôi đang dần sửa chữa những thứ gây phiền nhiễu. Tôi chủ yếu sử dụng tập tin emacs.d của redguardtoo .

Tôi có một tệp thẻ là 225 MB (Thẻ 1.6M). Ý định của tôi cho thẻ không nhất thiết phải hoàn thành (sử dụng company), nhưng nhiều hơn để nhảy xung quanh mã nguồn. Tôi đang làm việc với một cơ sở mã không quen thuộc và thường cần xem các định nghĩa vĩ mô hoặc lớp.

Khi tôi bắt đầu nhập, vào những thời điểm ngẫu nhiên, tôi sẽ thấy một thông báo trong bộ thu nhỏ

Making tag completion table for [tag file]...0-100%

Sau đó, một hộp danh sách bật lên hiển thị với các tùy chọn tự động hoàn thành.

Vì tệp thẻ này quá lớn và có vẻ như việc tải thẻ không đồng bộ, nên nó đóng băng các emacs trong khoảng một phút. Điều này cũng xảy ra nhiều lần trong một phiên (với cùng một tệp và với các tệp khác trong cùng thư mục sử dụng cùng một tệp thẻ)!


Câu hỏi

  1. Có ai biết những gì đang khởi tạo việc tải bảng thẻ để hoàn thành và làm thế nào để vô hiệu hóa nó? Tôi đã thực hiện một grep trên thư mục emacs.d của mình để "Hoàn thành thẻ" và không tìm thấy gì (lưu ý, IIRC các thẻ tải có mặt bất kể sử dụng companyhayauto-complete
  2. Hoàn thành sẽ tốt, nhưng tôi sẽ giải quyết chỉ vì khả năng nhảy đến vị trí thẻ. Có cách nào để có được điều này?
  3. Những suy nghĩ cần làm khi tiếp cận vấn đề như thế này là gì? Tôi muốn có thể khắc phục sự cố thêm vào lần tới.

thông tin bổ sung

Đã bật chế độ nhỏ (Ch m)

Enabled minor modes: Abbrev Auto-Composition Auto-Compression
Auto-Encryption Blink-Cursor Column-Number Company Desktop-Save
Display-Time Electric-Indent Electric-Pair Evil Evil-Local
Evil-Matchit Evil-Surround Fic File-Name-Shadow Flyspell-Lazy
Font-Lock Ggtags Global-Auto-Revert Global-Company Global-Eldoc
Global-Evil-Matchit Global-Evil-Surround Global-Font-Lock Global-Linum
Global-Page-Break-Lines Global-Pointback Global-Undo-Tree Helm
Helm-Match-Plugin Helm-Occur-Match-Plugin Line-Number Linum Menu-Bar
Mouse-Wheel Override-Global Pointback Recentf Savehist Shell-Dirtrack
Subword Tooltip Undo-Tree Which-Function Window-Numbering Winner Yas
Yas-Global

package-activated-list bằng

(ace-jump-mode ag s dash anaconda-mode f dash s dash json-rpc auto-compile packed bbdb bookmark+ browse-kill-ring buffer-move clean-aindent-mode cmake-mode coffee-mode color-theme company cpputils-cmake crontab-mode csharp-mode diminish dired+ dired-details dropdown-list dsvn elnode kv db kv fakir kv dash noflet creole kv noflet s noflet dash web s dash emmet-mode erlang evil-args evil goto-chg undo-tree evil-search-highlight-persist exec-path-from-shell expand-region f dash s fakir kv dash noflet fancy-narrow flymake-coffee flymake-easy flymake-css flymake-easy flymake-haml flymake-easy flymake-jslint flymake-easy flymake-lua flymake-python-pyflakes flymake-easy flymake-ruby flymake-easy flymake-sass flymake-easy flymake-shell flymake-easy flyspell-lazy fringe-helper ggtags git-gutter git-timemachine gitconfig-mode gitignore-mode goto-chg haskell-mode helm-descbinds helm async helm-gtags helm async hl-sexp htmlize ibuffer-vc idomenu iedit json-mode json-snatcher json-reformat json-reformat json-rpc json-snatcher kv legalese less-css-mode lua-mode magit git-rebase-mode git-commit-mode markdown-mode maxframe mic-paren move-text multi-term mwe-log-commands noflet org-fstree packed page-break-lines paredit pointback pomodoro pretty-mode project-local-variables quack rainbow-delimiters regex-tool rinari jump inflections findr ruby-compilation inf-ruby inf-ruby robe inf-ruby ruby-compilation inf-ruby rvm sass-mode haml-mode scratch scss-mode session sr-speedbar string-edit dash switch-window tagedit dash s textile-mode undo-tree unfill w3m web s dash wgrep ws-butler yaml-mode yasnippet

1
Để chuyển sang định nghĩa / tham chiếu, bạn có thể sử dụng GNU Global với ggtags / helm-gtags. Đảm bảo hoạt động trên dự án lớn như nhân Linux mà không có bất kỳ sự chậm trễ nào. Bạn có thể muốn xem hướng dẫn C / C ++ của tôi . Tôi đã bao gồm điều hướng mã (chuyển đến định nghĩa / tham chiếu), hoàn thành mã, biên dịch và hỗ trợ gỡ lỗi. Tôi đã tạo một cấu hình demo để chơi với, vì vậy bạn chỉ cần xem qua các tính năng mà không cần cấu hình bất cứ thứ gì.
Từ Đô

Hướng dẫn của bạn là những người đã giúp tôi bắt đầu với emacs (đặc biệt là w / C ++)! Hệ thống xây dựng của chúng tôi rất phức tạp và #include "..."có thể sống ở nhiều nơi khác nhau mà không biết đến thời gian xây dựng. Vì vậy, ggtags sẽ không thể tạo thẻ cho nhiều tệp. Hiện tại, các công cụ xây dựng của chúng tôi cho phép chúng tôi make etagstạo các thẻ tương thích emacs, nhưng không có make ggtagstương đương. Vì vậy, bây giờ tôi đang bị mắc kẹt với etags. Có ý kiến ​​gì không?
táo tợn

Hmm tôi thấy. Tình hình bây giờ phức tạp hơn. Bạn đã đề cập ggtagskhông thể tạo thẻ, nhưng bạn đã sử dụng đơn giản gtagstrên dòng lệnh tại dự án gốc chưa? Bạn nên thử điều này và gọi lại ggtags. Không nên có make ggtagsbởi vì lệnh thực sự là gtags; ggtagschỉ là một tên gói của Emacs sử dụng nó. Một lựa chọn khác là bạn có thể sử dụng ctags ; ggtagscũng có thể nhận ra ctagscác thẻ và nó cũng nhanh. Bạn có thể tạo các thẻ ctags khi gọi ggtags-create-tagsvà nó yêu cầu sử dụng ctagsmáy khách.
Từ Đô

Dù sao, nếu gtagskhông thể biết về các chi tiết như vậy, tôi không nghĩ rằng tích hợp etags(đi kèm với Emacs) hoặc ctags(tôi đã liên kết ở trên) sẽ có thể làm điều đó. Tôi nghĩ bạn chỉ sử dụng ggtagsđể tạo thẻ tại thư mục hiện tại, không phải dự án root. Chạy lệnh gtagstại root dự án hoặc khi ggtagshỏi nơi tạo, điều hướng đến root dự án và bạn sẽ ổn.
Từ Đô

Tôi đã xác minh tuyên bố của bạn (tất cả các chương trình thẻ chỉ có thể tạo từ gốc dự án xuống cây). make etagshoạt động vì nó gọi etags một khi nó đánh giá nơi tất cả các .htệp sống.
táo tợn

Câu trả lời:


2

Đối với trường hợp sử dụng của bạn, vẫn còn hy vọng. Vì bạn sử dụng etags, nên nó có thể được sử dụng với helm-etags-selectlệnh Helm tích hợp. Để sử dụng nó, chỉ cần làm theo các bước này:

  • Đầu tiên, chạy lệnh để tạo tệp TAGS.
  • Thứ hai, sử dụng find-tagđể nuôi nó cho Emacs; nếu tệp TAGS quá lớn và Emacs yêu cầu bạn xác nhận, chỉ cần chấp nhận nó. Toàn bộ tệp TAGS của bạn sẽ được tải trong Emacs và không tải lại nữa.
  • Cuối cùng, chỉ cần thực hiện helm-etags-selecttrên bất kỳ biểu tượng nào trên Emacs của bạn. Nếu chỉ tồn tại một định nghĩa trong dự án của bạn, hãy nhảy ngay lập tức; mặt khác, hiển thị bộ đệm Helm để bạn lựa chọn.

Để hoàn thành, vì bạn có cơ sở dữ liệu thẻ lớn, bạn sẽ không muốn sử dụng auto-completehoặc companybật lên vì nó sẽ đóng băng Emacs của bạn. Trong trường hợp đó, bạn có thể sử dụng helm-company ; nó thay thế companycửa sổ bật lên với bộ đệm Helm. Bạn chỉ có thể thêm nó vào c-mode-hookhoặc c++-mode-hook:

(defun helm-company-setup ()
   (local-set-key (kbd "C-i") 'helm-company)
   (local-set-key (kbd "<tab>") 'helm-company))

(add-hook 'c-mode-hook 'helm-company-setup)
(add-hook 'c++-mode-hook 'helm-company-setup)

2
nó hoạt động tốt sử dụng helm và vô hiệu hóa các thẻ phụ trợ cho công ty cải thiện đáng kể hiệu suất. Hướng dẫn của bạn về helm đã chuyển tôi từ idt btw!
táo tợn

Thật tuyệt khi nghe điều đó :)
Tu Do

1
@Dmitry tốt khi bạn có hàng ngàn ứng cử viên cần liệt kê, sau đó nó chặn Emacs.
Từ Đô

1
@TuDo Đó không phải là một lời giải thích tốt. Trong khi tìm nạp rất nhiều ứng cử viên có thể mất một chút thời gian, việc hiển thị chúng (và điều hướng danh sách, tìm kiếm, v.v.) rất linh hoạt ngay cả với 8000 mục. Tôi chỉ không có kết hợp dự án / phụ trợ mà sẽ trả lại nhiều hơn, để kiểm tra.
Dmitry

1
Cập nhật: 30000 cũng rất linh hoạt, sự chậm trễ có thể nhận biết duy nhất xảy ra trước khi cửa sổ bật lên mở ra.
Dmitry
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.