2013-08-14 16 views
6

Benim emacs c/C++ geliştirme kurulumunda cedet ve semantic ile deneyler yaptım ve küçük bir ayrıntı dışında onunla oldukça memnunum. Bir proje oluşturmak ve dosyaları içerir dizinleri ile birlikte Projemin kök dizini vermek ede-cpp-root-project kullanmakSemantic, cedet kaynak dosyaları ayrıştırmaya zorlamak nasıl

aşağıda gibi ikamet:

(ede-cpp-root-project "My Project" 
       :name "My Project" 
       :file "/path/to/rootdir/AFILE" 
       :include-path '( 
       "/include2" 
       "/include1" 
           ) 

       ) 

Bu beni kolayca semantic-ia-fast-jump ile fonksiyonların beyanlarına atlayabilmesidir ama beni bu fonksiyonların tanımlarına getirmiyor. Yani sadece başlık dosyaları ile uğraşmak ve tamamen kaynak dosyaları görmezden geliyor gibi görünüyor. İşlevin bildirgesine gidip semantic-analyze-proto-impl-toggle'u tetiklesem bile uygun bir uygulamanın bulunamadığını söyler.

İşlev dosyasının uygulanacağı kaynak dosyayı el ile açarsam ve sonra yalnızca anlamsal olarak ayrıştırılır ve yukarıda belirtilen işlevler çalışır.

Benim soru kısa elle bir dizin altındaki tüm kaynak dosyaları ayrıştırmayı zorlamak için başka bir yolu yoktur :spp-files argüman yoluyla ede-cpp-root-project onlara dahil olmak üzere manuel benim projenin kök dizinin altında bulunan tüm kaynak dosyaları açma veya nedir?

Teşekkürler!

cevap

7

Uzun zamandır bu problemi görmezden geldikten sonra elisp üzerinde kaliteli bir zaman harcamam gerektiğini ve bir çalışmayı anlamaya çalışmam gerektiğini düşündüm. Elisp'i sadece benim emacs ihtiyaçları için kullandığımdan, ihtiyacım olanı yapabildiğimden, en güzel elisp kodu değil. yinelemeli o buferr en Ziyaret dosya dizinindeki tüm c/C++ ilgili dosyaları taramak için bir tampon (my-semantic-parse-dir "path/to/dir/root/" ".*regex") veya M-x lk-parse-curdir-c basın:

(defvar c-files-regex ".*\\.\\(c\\|cpp\\|h\\|hpp\\)" 
    "A regular expression to match any c/c++ related files under a directory") 

(defun my-semantic-parse-dir (root regex) 
    " 
    This function is an attempt of mine to force semantic to 
    parse all source files under a root directory. Arguments: 
    -- root: The full path to the root directory 
    -- regex: A regular expression against which to match all files in the directory 
    " 
    (let (
     ;;make sure that root has a trailing slash and is a dir 
     (root (file-name-as-directory root)) 
     (files (directory-files root t)) 
     ) 
    ;; remove current dir and parent dir from list 
    (setq files (delete (format "%s." root) files)) 
    (setq files (delete (format "%s.." root) files)) 
    (while files 
     (setq file (pop files)) 
     (if (not(file-accessible-directory-p file)) 
      ;;if it's a file that matches the regex we seek 
      (progn (when (string-match-p regex file) 
       (save-excursion 
       (semanticdb-file-table-object file)) 
      )) 
      ;;else if it's a directory 
      (my-semantic-parse-dir file regex) 
    ) 
    ) 
) 
) 

(defun my-semantic-parse-current-dir (regex) 
    " 
    Parses all files under the current directory matching regex 
    " 
    (my-semantic-parse-dir (file-name-directory(buffer-file-name)) regex) 
) 

(defun lk-parse-curdir-c() 
    " 
    Parses all the c/c++ related files under the current directory 
    and inputs their data into semantic 
    " 
    (interactive) 
    (my-semantic-parse-current-dir c-files-regex) 
) 

(defun lk-parse-dir-c (dir) 
    "Prompts the user for a directory and parses all c/c++ related files 
    under the directory 
    " 
    (interactive (list (read-directory-name "Provide the directory to search in:"))) 
    (my-semantic-parse-dir (expand-file-name dir) c-files-regex) 
) 

(provide 'lk-file-search) 

kullanmak ya çağrı işlevi doğrudan şöyle belirleyin. Fonksiyonu çağırmanın alternatif ve belki de tercih edilen bir yolu, etkileşimli bir şekilde çağrıştırmaktır. Bu, etkileşimli olarak sizi bir dizinin ayrıştırılmasını isteyecektir.

Herhangi bir elisp gurunun daha iyi bir çözümü veya kodu geliştirmek için önerileri varsa bunları duymak isterim.

+0

bovinate' benim durumda nasıl yardımcı olabileceğini 'görmüyorum ve bu çözüm iyi görünüyor, ama emacs olmaz Etiketler veritabanını oturumlar arasında kaydedin. Bir şey mi eksik? – jarvisteve

+0

hey, bu garip. Onlar .emacs dizininin içinde .semanticdb adlı bir dizinde kaydedilmelidir. – Lefteris

+1

Dosya listemin çok uzun olduğu bir sorunla karşılaştım ve emacların durması ve görünüşte daha fazla ilerleme olmaması mümkün. Bir sonraki dizine geçmeden önce (semanticdb-save-all-db) bir çağrı ekleyerek çözüyorum. Bu şekilde önbellek sürekli güncellenir. Belki bu yardımcı olur. Normalde semantik, yalnızca emac çıkışından çıktığınızda kaydedilir. – RealityMonster

0

"bovinate" komutunu çalıştırmayı deneyin. Bu, Meta + X tuş bileşimiyle ve daha sonra "bovinate" yazarak ve "Enter" tuşuna basılarak yapılabilir. "Meta" tuşuna, pencerelerde "Alt" tuşu denir.

+0

hey cevap düşmesi zaman ayırdığınız için teşekkürler ama – Lefteris

1

Bunu son zamanlarda Python için uyguladım. Küçük değişiklikler ile C/C++ için kabul edilebilir. Ben de blogunuza rastladım Hey

(defvar python-extention-list (list "py")) 

(defun semanticdb-rescan-directory (pathname) 
    (dolist (file (cddr (directory-files pathname t))) 
    (if (file-directory-p file) 
     (semanticdb-rescan-directory file) 
     (when (member (file-name-extension file) python-extention-list) 
     (message "Parsing %s file." file) 
     (ignore-errors 
      (semanticdb-file-table-object file)))))) 

(defun semantic-python-rescan-includes() 
    (interactive) 
    (dolist (includes (semantic-python-get-system-include-path)) 
    (message "Parsing %s" includes) 
    (semanticdb-rescan-directory includes))) 
İlgili konular