“Membuat tabel penyelesaian tag” Membeku / Memblokir - cara menonaktifkan

8

TLDR: Saya punya file tag besar yang memuat beberapa kali per sesi, membuatnya tidak dapat digunakan. Tidak dapat menemukan sumber masalah atau cara menonaktifkannya - tujuan utamanya adalah melompat ke tag, tetapi penyelesaiannya akan menyenangkan

Saya baru-baru ini diposting di subreddit emacs dan seorang pengguna merekomendasikan agar saya bergabung dengan grup ini karena juga ramah terhadap pemula.

Saya telah menggunakan emacs sebagai C ++ IDE, dan saya perlahan memperbaiki hal-hal yang mengganggu. Saya pada dasarnya menggunakan file emacs.d redguardtoo .

Saya memiliki file tag 225MB (Tag 1,6M). Maksud saya untuk tag belum tentu selesai (menggunakan company), tetapi lebih untuk melompat-lompat kode sumber. Saya bekerja dengan basis kode yang tidak dikenal dan sering perlu melihat definisi makro atau kelas.

Ketika saya mulai mengetik, secara acak, saya akan melihat pesan di minibuffer

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

Kemudian, kotak daftar sembulan muncul dengan opsi pelengkapan otomatis.

Karena file tag ini sangat besar, dan sepertinya tag tidak asinkron, pembekuan emacs sekitar satu menit. Ini juga terjadi beberapa kali per sesi (dengan file yang sama, dan dengan file lain di direktori yang sama yang menggunakan file tag yang sama)!


Pertanyaan

  1. Adakah yang tahu apa yang menginisialisasi pemuatan tabel tag untuk penyelesaian dan cara menonaktifkannya? Saya melakukan grep pada direktori emacs.d saya untuk "Membuat penyelesaian tag" dan tidak menemukan apa pun (perhatikan, IIRC tag pemuatan hadir terlepas dari menggunakan companyatauauto-complete
  2. Penyelesaian akan menyenangkan, tapi saya puas hanya dengan kemampuan untuk melompat ke lokasi tag. Apakah ada cara untuk mendapatkan ini?
  3. Apa pola pikir yang harus diambil ketika mendekati masalah seperti ini? Saya ingin dapat memecahkan masalah lebih lanjut pada waktu saya berikutnya.

informasi tambahan

Diaktifkan mode minor (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 adalah sama dengan

(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
cheezy
sumber
1
Untuk melompat ke definisi / referensi, Anda dapat menggunakan GNU Global dengan ggtags / helm-gtags. Jaminan untuk bekerja pada proyek besar seperti kernel Linux tanpa penundaan. Anda mungkin ingin melihat panduan C / C ++ saya . Saya membahas navigasi kode (lompat ke definisi / referensi), penyelesaian kode, kompilasi, dan dukungan debugging. Saya sudah membuat konfigurasi demo untuk bermain, jadi Anda hanya perlu menelusuri fitur tanpa mengkonfigurasi apa pun.
Tu Do
Panduan Anda adalah yang membuat saya mulai dengan emacs (terutama w / C ++)! Sistem build kami sangat rumit dan #include "..."dapat hidup di berbagai tempat yang tidak diketahui hingga waktu pembangunan. Jadi, ggtag tidak akan dapat menghasilkan tag untuk banyak file. Saat ini, alat bangun kami memungkinkan kami make etagsuntuk menghasilkan tag yang kompatibel dengan emacs, tetapi tidak ada yang make ggtagssetara. Jadi, saya terjebak dengan etag untuk saat ini. Ada ide?
cheezy
Hmm begitu. Situasinya lebih rumit sekarang. Anda sebutkan ggtagstidak dapat menghasilkan tag, tetapi apakah Anda menggunakan polos gtagspada baris perintah di root proyek? Anda harus mencoba ini dan meminta ggtag lagi. Seharusnya tidak ada make ggtagskarena perintah sebenarnya adalah gtags; ggtagshanyalah nama paket Emacs yang menggunakannya. Opsi lain adalah Anda bisa menggunakan ctag ; ggtagsjuga dapat mengenali ctagstag dan juga cepat. Anda dapat membuat tag ctag saat memohon ggtags-create-tagsdan meminta menggunakan ctagsklien.
Tu Do
Lagi pula, jika gtagstidak bisa tahu tentang detail seperti itu, saya tidak berpikir built-in etags(datang dengan Emacs), atau ctags(saya ditautkan di atas) akan dapat melakukannya. Saya pikir Anda hanya menggunakan ggtagsuntuk membuat tag pada direktori saat ini, bukan memproyeksikan root. Jalankan perintah gtagsdi root proyek, atau ketika ggtagsmenanyakan di mana menghasilkan, arahkan ke root proyek dan Anda akan baik-baik saja.
Tu Do
Saya memverifikasi pernyataan Anda (semua program tag hanya dapat menghasilkan dari root proyek ke bawah pohon). make etagsberfungsi karena ia memanggil etag setelah mengevaluasi tempat semua .hfile hidup.
cheezy

Jawaban:

2

Untuk kasus penggunaan Anda, masih ada harapan. Karena Anda menggunakannya etags, dapat digunakan dengan helm-etags-select, perintah bawaan Helm. Untuk menggunakannya, cukup ikuti langkah-langkah tesis ini:

  • Pertama, jalankan perintah untuk menghasilkan file TAGS.
  • Kedua, gunakan find-taguntuk memberi makan ke Emacs; jika file TAGS terlalu besar dan Emacs meminta Anda untuk mengonfirmasi, cukup terima saja. Seluruh file TAGS Anda akan dimuat di Emacs dan tidak ada lagi reload.
  • Akhirnya, jalankan helm-etags-selectsaja simbol apa pun pada Emacs Anda. Jika hanya ada satu definisi di proyek Anda, langsung lompat; jika tidak, tampilkan buffer Helm untuk Anda pilih.

Untuk penyelesaiannya, karena Anda memiliki database tag besar, Anda tidak ingin menggunakan auto-completeatau companypopup karena itu akan membekukan Emacs Anda. Dalam hal ini, Anda dapat menggunakan helm-perusahaan ; itu menggantikan companypopup dengan Helm buffer. Anda hanya dapat menambahkannya ke Anda c-mode-hookatau 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)
Tu Do
sumber
2
itu bekerja dengan baik! menggunakan helm dan menonaktifkan backend tag untuk perusahaan meningkatkan kinerja secara signifikan. Panduan Anda tentang helm mengubah saya dari ido btw!
cheezy
Senang mendengarnya :)
Tu Do
1
@Lakukan dengan baik ketika Anda memiliki ribuan kandidat yang perlu didaftar, lalu blokir Emacs.
Tu Do
1
@TuDo Itu bukan penjelasan yang bagus. Walaupun mengambil begitu banyak kandidat mungkin membutuhkan waktu, menampilkannya (dan menavigasi daftar, mencari, dll) sangat cepat bahkan dengan 8000 item. Saya hanya tidak memiliki kombinasi proyek / backend yang akan mengembalikan lebih banyak, untuk diuji.
Dmitry
1
Pembaruan: 30000 juga cepat, satu-satunya penundaan yang terlihat terjadi sebelum popup terbuka.
Dmitry