「タグ補完テーブルの作成」フリーズ/ブロック—無効にする方法


8

TLDR:セッションごとに複数回読み込まれる大きなタグファイルがあり、使用できません。問題の原因またはそれを無効にする方法を見つけることができません-主な目的はタグにジャンプすることですが、完了が良いでしょう

私は最近emacs subredditに投稿しましたが、初心者にも優しいため、このグループに参加することをユーザーが勧めています。

私はemacsをC ++ IDEとして使用しており、煩わしいものをゆっくりと修正しています。私は本質的にredguardtooのemacs.dファイルを使用しています

225MB(1.6Mタグ)のタグファイルがあります。このタグの目的は、必ずしも(を使用してcompany)完了することではなく、ソースコードをジャンプすることです。慣れていないコードベースを使用していて、マクロまたはクラスの定義を確認する必要があることがよくあります。

入力を開始すると、ランダムなタイミングで、ミニバッファーにメッセージが表示されます

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

次に、ポップアップリストボックスにオートコンプリートオプションが表示されます。

このタグファイルは非常に大きく、タグの読み込みが非同期ではないように見えるため、emacsが約1分間フリーズします。これは、セッションごとに複数回発生します(同じファイル、および同じタグファイルを使用する同じディレクトリ内の他のファイル)。


ご質問

  1. 完了のためにタグテーブルのロードを初期化しているものとそれを無効にする方法を誰かが知っていますか?emacs.dディレクトリで「タグの完成」のためにgrepを実行しましたが、何も見つかりませんでした(IIRCは、companyまたはauto-complete
  2. 完成はいいですが、タグの場所にジャンプする機能だけで解決します。これを取得する方法はありますか?
  3. このような問題に取り組むときの考え方は何ですか?次回はさらに自分でトラブルシューティングできるようにしたいと思います。

追加情報

有効なマイナーモード(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 等しい

(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
定義/参照にジャンプするには、ggtags / helm-gtagsでGNU Globalを使用できます。Linuxカーネルのような大規模プロジェクトで遅延なく作業することを保証します。私のC / C ++ガイドをご覧になることをお勧めします。コードナビゲーション(定義/参照へのジャンプ)、コード補完、コンパイル、デバッグのサポートについて説明しました。私はすでに遊ぶためのデモ構成を作成したので、何も構成せずに機能をウォークスルーするだけで済みます。
Tu Do

あなたのガイドは、私がemacs(特にC ++付き)を使い始めたガイドです!私たちの構築システムは非常に複雑で、#include "..."構築時までわからないさまざまな場所に住むことができます。したがって、ggtagsは多くのファイルのタグを生成することができません。現在、ビルドツールを使用make etagsすると、emacs互換のタグを生成できますが、make ggtags同等のものはありません。それで、私は今のところetagsで立ち往生しています。何か案は?
2014年

なるほど。状況はより複雑になりました。あなたは言及したggtagsタグを生成することはできませんが、プレーン使ったのgtagsプロジェクトのルートでコマンドラインに?これを試して、ggtagsをもう一度呼び出す必要があります。make ggtags実際のコマンドはgtags;であるため、存在すべきではありません。ggtagsそれを使用するEmacsのパッケージ名です。別のオプションは、ctagsを使用できることです。タグをggtags認識することもでき、ctags高速です。呼び出し時にctagsタグを生成できggtags-create-tagsctagsクライアントの使用を要求します。
Tu Do

とにかく、そのgtagsような詳細を知ることができなかった場合、組み込みetags(Emacsに付属)、またはctags(上記でリンクした)はそれを実行できるとは思いません。ggtagsプロジェクトルートではなく、現在のディレクトリでタグを作成するためにのみ使用すると思います。gtagsプロジェクトのルートでコマンドを実行するか、ggtags生成する場所を尋ねられたら、プロジェクトのルートに移動すれば問題ありません。
Tu Do

私はあなたの声明を検証しました(すべてのタグプログラムはツリーの下のプロジェクトルートからしか生成できません)。 make etagsすべての.hファイルが存在する場所を評価するとetagsを呼び出すため、機能します。
2014年

回答:


2

ユースケースとしては、まだ希望があります。を使用するためetagshelm-etags-selectHelm組み込みコマンドので使用できます。使用するには、次の手順に従ってください。

  • まず、コマンドを実行してTAGSファイルを生成します。
  • 次に、を使用find-tagしてEmacsにフィードします。TAGSファイルが大きすぎてEmacsが確認を求めてきたら、そのまま受け入れます。TAGSファイル全体がEmacsに読み込まれ、再読み込みは行われません。
  • 最後に、helm-etags-selectEmacsの任意のシンボルで実行します。プロジェクトに定義が1つしかない場合は、すぐにジャンプします。それ以外の場合は、選択できるHelmバッファーを表示します。

完了するために、大きなタグデータベースがあるので、Emacsがフリーズするので、使用しauto-completeたりcompanyポップアップしたりしたくないでしょう。その場合は、helm-companyを使用できます。これは、companyポップアップをHelmバッファーに置き換えます。あなたは単にあなたのc-mode-hookorに追加することができます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
うまくいきました!helmを使用してタグバックエンドを無効にすることで、会社のパフォーマンスが大幅に向上しました。ヘルムに関するあなたのガイドが私をido btwから切り替えました!
生意気な2014年

グレートはそれ:)を聞くために
火ドゥ

1
@Dmitryは、何千もの候補者がリストを必要とする場合に、Emacsをブロックします。
Tu Do

1
@TuDoそれは良い説明ではありません。非常に多くの候補をフェッチするのには時間がかかる場合がありますが、8000個のアイテムを表示しても(リストのナビゲートや検索など)は非常に簡単です。テストするために、より多くを返すプロジェクト/バックエンドの組み合わせがありません。
ドミトリー

1
更新:30000も素早い、ポップアップが開く前に発生する唯一の知覚可能な遅延。
ドミトリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.