2012-05-16 24 views
5

Tôi đã cố gắng lấy cấu hình Emacs để phát triển Java. Nó khá tốt - Tôi đã nhận được chế độ malabar làm việc và có GNU Global làm việc để duyệt thẻ. Một điều tôi không thể làm việc là nhận semanticdb để sử dụng gnu toàn cầu đúng cách. Không tìm thấy hàng nhập khẩu nào của tôi.Thiết lập Emacs 23.4, CEDET 1.1 và SemanticDB để sử dụng GNU Global trên Windows

Đầu tiên, đây là dự án đa mô-đun Maven với tất cả các nguồn được kiểm tra từ thư mục dự án gốc cấp cao nhất. Tất cả các dự án khác nằm dưới cái này trong cây thư mục. Có một cơ sở dữ liệu GTAGS duy nhất trong thư mục gốc này bao gồm mọi thứ.

Những điều mà làm việc:

  • M-x gtags-find-tag RET symbol RET hoạt động tốt, vì vậy cơ sở dữ liệu là tốt và toàn cầu có thể tìm thấy nó.
  • M-x cedet-gnu-global-version-check hoạt động và báo cáo rằng phiên bản của tôi là tốt.
  • M-x cedet-gnu-global-expand-filename làm việc
  • M-x semanticdb-find-test-translate-path cho thấy một "GNU Global Search Bảng" khi trong một bộ đệm Java
  • Tôi có thư mục nguồn JDK thiết lập như là một hệ thống bao gồm thư mục, Java nhập khẩu nên cốt lõi được phân tích cú pháp đúng.

java cấu hình của tôi là như sau (Cedet khởi là trước đó trong tập tin):

(add-local-load-path "malabar/lisp") 

(require 'malabar-mode) 
(setq malabar-groovy-lib-dir (concat emacs-local-site-lisp "malabar/lib")) 
(add-to-list 'auto-mode-alist '("\\.java\\'" . malabar-mode)) 

;; enable semanticdb support for gnu global 
(when (cedet-gnu-global-version-check t) 
    (semanticdb-enable-gnu-global-databases 'java-mode)) 

(add-hook 'java-mode-hook 
    (lambda() 
    (gtags-mode 1))) 

(add-hook 'java-mode-hook 'flymake-mode-on) 

(defun my-java-flymake-init() 
    (list "javac" (list (flymake-init-create-temp-buffer-copy 
        'flymake-create-temp-with-folder-structure)))) 

(add-to-list 'flymake-allowed-file-name-masks 
     '("\\.java$" my-java-flymake-init flymake-simple-cleanup)) 

(add-hook 'java-mode-hook 
     '(lambda() 
     (semantic-add-system-include (getenv "JAVA_HOME") 'java-mode))) 
+0

Vui lòng tìm vào [câu trả lời cho câu hỏi tương tự] tôi [1] - nó mô tả làm thế nào để sử dụng javap + Semantic [1]: http://stackoverflow.com/questions/4173737/how- to-include-standard-jdk-library-in-emacs-semantic/10510736 # 10510736 –

+1

Cảm ơn, nhưng tôi đã thấy điều đó và thiết lập điều đó. Vấn đề là Semantic không biết các tệp nguồn khác ở đâu. Vì nó nằm trong một submodule Maven lồng nhau nên các tệp nguồn sẽ nằm trong thư mục của một số dự án khác.Nếu tôi chưa xây dựng dự án đó, thậm chí sẽ không có bất kỳ tệp lớp nào cho javap để xử lý. Trong một số trường hợp, các tệp lớp nằm trong một cái lọ ở đâu đó trong kho lưu trữ maven cục bộ của tôi. Sử dụng cơ sở dữ liệu GNU Global ít nhất sẽ cho phép SemanticDB tìm và phân tích cú pháp các tệp không xác định từ các dự án mô-đun con khác bằng cách sử dụng cơ sở dữ liệu thẻ. – DuckPuppy

+0

Hãy thử phiên bản mới nhất của CEDET (từ bzr) - nó đã được mở rộng để làm việc với Maven, cộng với một số sửa lỗi liên quan đến Java, do đó bạn sẽ hoàn thành tên cho thư viện của bên thứ ba –

Trả lời

3

Câu trả lời có liên quan đến cách các dự án của bạn được thiết lập, và nếu bạn đang sử dụng EDE. EDE là Envornment phát triển Emacs (chơi trên IDE) và là cách CEDET theo dõi các tệp nào thuộc về dự án của bạn. Đó là giới hạn có liên quan đến cả hai hiệu suất (tìm kiếm ít thứ) và ngăn ngừa cấu hình từ một dự án chảy máu khác.

Thật không may, Maven chưa được hỗ trợ trong CEDET/EDE. Bạn có thể, tuy nhiên, chỉ cần gắn thẻ gốc của dự án của bạn, và tôi đoán ede-cpp-root (thường được sử dụng cho các dự án C++) có thể là đủ. Có lẽ chúng ta nên tạo một phiên bản java.

Dù sao, EDE có thể được cấu hình để sử dụng GNU Global để tìm tệp nhanh chóng (xem hướng dẫn cho hỗ trợ GNU Global với cả EDE và ngữ nghĩa) nhưng tệp GTAGS của bạn cần phải ở gốc dự án.

Nếu bạn đang ở trong dự án-1 và mong muốn chuyển đến tệp trong dự án-2 và GTAGS là gốc của dự án-1, thì nó sẽ không hoạt động. Bạn sẽ phải di chuyển tệp GTAGS và dự án EDE của bạn lên thư mục cha mẹ chung.

Trong thiết lập hiện tại của bạn, nếu mọi thứ đã nằm trong một thư mục chung với GTAGS thì có nhiều khả năng bạn chỉ cần thiết lập dự án EDE để treo tính năng tìm kiếm tệp GTAGS.

Có chủ đề trong kho lưu trữ danh sách gửi thư cedet-devel của một vài người đã có một số thành công trong việc này.

+0

Vì vậy, một dự án EDE sẽ là cần thiết cho SemanticDB để sử dụng cơ sở dữ liệu GNU Global? Tôi nghĩ việc bật hỗ trợ GNU Global cho SemanticDB sẽ đơn giản sử dụng chiến lược tìm kiếm GNU Global mặc định để tìm kiếm các tệp thẻ và sử dụng chúng. – DuckPuppy

+0

Nếu tệp nguồn của bạn nằm trong cùng thư mục với tệp GTAGS, tệp này có thể được sử dụng để tìm các thẻ khác. Nếu bạn muốn GTAGS được sử dụng để tìm vị trí của các tệp (như bao gồm các tệp) là một phần của EDE, không phải là SemanticDB. SemanticDB dựa vào EDE để tìm các tệp để chúng có thể được lập chỉ mục và tìm kiếm các biểu tượng. – Eric

+0

Tôi phải hỏi, sau đó - mục đích của semanticdb-enable-gnu-global-databases là gì? – DuckPuppy

Các vấn đề liên quan