· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Emacs Auto Completion Quick Note

À̸ƽº(Emacs) ÀÚµ¿¿Ï¼º ÃÊ°£´Ü »ç¿ë¹ý

¿ë¾îÀÇ ÀÏ°ü¼ºÀ» À§ÇØ
"ÀÎÅÚ¸®¼¾½º(intellisense)"´Â ¸®½ºÆ®¸¦ º¸¿©ÁÖ´Â ÀÚµ¿¿Ï¼ºÀ» ÀǹÌÇÏ°í
"½Éº¼¿Ï¼º(symbol completion)"Àº ¸®½ºÆ®¸¦ ¾È º¸¿©ÁÖ´Â ÀÚµ¿¿Ï¼ºÀ» ÀǹÌÇÏ´Â °ÍÀ¸·Î ÇÏ°Ú½À´Ï´Ù.

±×¸®°í Emacs¿¡´Â ÀÚµ¿¿Ï¼ºÀ̶ó°í ÀÏÄþîÁö´Â auto completion, smart completion, intellisense µîµî
Á¾·ù°¡ ³Ê¹« ¸¹±â ¶§¹®¿¡ cedet ÆÐÅ°Áö¿¡ ÀÖ´Â semanticÀ» Áß½ÉÀ¸·Î ¼³¸íÇÕ´Ï´Ù.

Emacs¿¡¼­ ÀÚµ¿¿Ï¼ºÀº ¼³Á¤µµ ¾à°£ ±î´Ù·Ó°í ¸Ç óÀ½ ÀÚµ¿¿Ï¼ºÀÌ µÉ ¶§´Â ij½¬ ÆÄÀÏÀ» »ý¼ºÇØ¾ß µÇ¼­
¾à°£ ´À¸®±âµµ ÇÏÁö¸¸ ´Ù¾çÇÑ Á¾·ùÀÇ ÀÚµ¿¿Ï¼º ±â´ÉÀÌ ÀÖ°í »ç¿ëÀÚ ÃëÇâ¿¡ ¸Â°Ô ¼³Á¤ ÇÒ ¼ö À־ Á¤¸» °­·ÂÇÕ´Ï´Ù.
ÀÏ·Ê·Î VS¿¡¼­ MFC·Î ÇÁ·Î±×·¡¹ÖÀ» ¾î´À Á¤µµ ÇÏ´Ù º¸¸é ¸â¹öÇÔ¼ö °°Àº °ÍÀ» °ÅÀÇ ±â¾ï ÇÒ ¼ö Àֱ⠶§¹®¿¡
±× ºÐÀÌ ¿À¼Å¼­ Á¤¸» ½Å³»¸° ÄÚµù(?)À» ÇÒ ¶§´Â ¿ÀÈ÷·Á ÀÎÅÚ¸®¼¾½º ±â´ÉÀÌ °ÅÄ¡Àû°Å·Á¼­ ²¨³õ°í ÄÚµùÇÏ´Â °æ¿ìµµ ÀÖÀ¸½Ç °ÍÀÔ´Ï´Ù.
ÀÌ·² °æ¿ì¿¡µµ Emacs´Â ¾ÆÁÖ À¯¿¬ÇÑ ´ëó°¡ °¡´ÉÇÕ´Ï´Ù.

1. Áغñ

1) cedet ÆÐÅ°Áö ¼³Ä¡
http://cedet.sourceforge.net/
1.0pre4 ¹öÀü¿¡¼­´Â C++ namespace¸¦ ¾µ °æ¿ì ÀÚ½ÄŬ·¡½º¿¡¼­ ºÎ¸ðŬ·¡½º ¸â¹ö°¡ ÀÚµ¿¿Ï¼º¿¡ ¾È³ªÅ¸³ª¹Ç·Î cvs ¹öÀü »ç¿ëÇϼ¼¿ä.
cvs -d:pserver:anonymous@cedet.cvs.sourceforge.net:/cvsroot/cedet login
¾ÏÈ£ ¹°¾îº¸¸é ¿£ÅÍ
cvs -z3 -d:pserver:anonymous@cedet.cvs.sourceforge.net:/cvsroot/cedet co -P cedet
¼³Ä¡°æ·Î/INSTALL ÆÄÀÏÀ» Âü°íÇؼ­ ÄÄÆÄÀÏ ¹× .emacs¿¡ Ãß°¡Ç϶ó°í ÇÑ °Í Ãß°¡ÇØ ÁÝ´Ï´Ù.

Âü°í:
µ¥ºñ¾È lenny¿¡¼­´Â emacs-snapshot°ú ±âÁ¸ ÀúÀå¼ÒÀÇ cedet ÆÐÅ°Áö°¡ Ãæµ¹ÇϹǷΠÀúÀå¼Ò cedetÆÐÅ°Áö´Â Á¦°ÅÇÏ°í cvs ¹öÀü ¼öµ¿ ¼³Ä¡Çϼ¼¿ä.
(lenny°¡ stableÀÌ µÈ ÀÌÈķδ ¹ÌÈ®ÀÎ »óÅÂ)

2) .emacs¿¡ ´ÙÀ½ Ãß°¡
;; ÇöÀç(2009³â 4¿ù 12ÀÏ) cvs ¹öÀü¿¡¼­´Â ¾Æ·¡°¡ ¾ø¾îµµ ÀÚµ¿¿Ï¼ºÀÌ µÇ¾úÀ½
;; (require 'semantic-ia) 
;; (global-semanticdb-minor-mode 1)

;; ij½¬ ÆÄÀÏ ¸¸µé¾î µÎ´Â °÷
;; ½Ã½ºÅÛ ¶óÀ̺귯¸®´Â °°Àº °æ¿ì °ÅÀÇ º¯°æµÉ ÀÏÀÌ ¾ø±â ¶§¹®¿¡
;; ÇÑ ¹ø ij½¬µÇ¸é ´ÙÀ½ ¹ø ÀÚµ¿¿Ï¼º¿¡¼­´Â ºü¸£°Ô »ç¿ë °¡´ÉÇÕ´Ï´Ù.
;; Æú´õ "~/.emacs.d/#semanticdb.cache#" ´Â Àû´çÈ÷ ¿øÇÏ´Â °ÍÀ¸·Î ²À ¸¸µé¾î ÁÖ¾î¾ß ÇÕ´Ï´Ù.
(setq semanticdb-default-save-directory "~/.emacs.d/#semanticdb.cache#")

;; ÀÚµ¿¿Ï¼º¿¡ ¾µ Çì´õ ÆÄÀÏ °æ·Î Àû´Â ¿¹
;; ÀÌ°ÍÀÌ ÀÖ¾î¾ß #include ÇÑ Çì´õÆÄÀÏÀÇ ³»¿ëµµ ÀÚµ¿¿Ï¼º¿¡ ³ªÅ¸³³´Ï´Ù.
(semantic-add-system-include "/usr/include/gtkmm-2.4/" 'c++-mode)

2. ÀÎÅÚ¸®¼¾½º (Intellisense)

2.1. Á¾·ù

emacs ÀÎÅÚ¸®¼¾½º¿¡´Â ¿©·¯ °¡Áö°¡ ÀÖ½À´Ï´Ù.
(cedet ¹öÀü¿¡ µû¶ó ¾Æ·¡ °¢ ÇÔ¼ö°¡ ÀÚµ¿¿Ï¼ºÀ» ÇÏ´Â ¸ð¾çÀÌ ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù.)

1) semantic-ia-complete-symbol-menu
semantic-ia-complete-symbol-menu.png
[PNG image (71.53 KB)]

2) semantic-ia-complete-symbol
semantic-ia-complete-symbol.png
[PNG image (81.94 KB)]

3) semantic-ia-complete-tip
semantic-ia-complete-tip.png
[PNG image (64.96 KB)]

4) senator-completion-menu-popup
senator-completion-menu-popup.png
[PNG image (70.08 KB)]

5) semantic-complete-self-insert ("." ÀÔ·ÂÇÏ°í "sho"±îÁö ÀÔ·ÂÈÄ tab ´©¸¥ »óÅÂ)
semantic-complete-self-insert.png
[PNG image (76.03 KB)]

6) semantic-complete-analyze-inline
semantic-complete-analyze-inline.png
[PNG image (77.94 KB)]

7) semantic-analyze-possible-completions
semantic-analyze-possible-completions.png
[PNG image (80.02 KB)]

8) global-semantic-idle-completions-mode ("sh" ÀÔ·ÂÇÏ°í ¾à1ÃÊ ±â´Ù¸° ÈÄ tab 2¹ø ´©¸¥ »óÅÂ)
global-semantic-idle-completions-mode.png
[PNG image (56.77 KB)]

2.2. Å°¹ÙÀεù ¿¹Á¦

;; cedet semantic ÀÎÅÚ¸®¼¾½º Å°¹ÙÀεù ¿¹Á¦
(global-set-key [(control return)] 'semantic-ia-complete-symbol-menu)
(global-set-key [(control shift return)] 'semantic-ia-complete-tip)

(global-set-key [(control c)(control return)] 'semantic-complete-analyze-inline)

(global-set-key [(shift return)] 'semantic-analyze-possible-completions)
¿¹¸¦ µé¾î semantic-ia-complete-symbol-menu °°Àº °æ¿ì ÀÎÅÚ¸®¼¾½º¸¦ »ç¿ëÇÒ °÷¿¡¼­
C-RET ÇÏ°í C-n (¾Æ·¡), C-p (À§), C-f (¿À¸¥ÂÊ), C-b (¿ÞÂÊ) ·Î ¿òÁ÷ÀÌ°í RET·Î ¼±ÅÃÇÏ°í
C-g ·Î Ãë¼ÒÇÏ¸é µË´Ï´Ù. ´õ °£´ÜÇÏ°Ô Ctrl "°è¼Ó" ´©¸¥ »óÅ¿¡¼­ RET ÇÏ°í n,p,f,b ·Î À½Á÷ÀÌ°í g·Î Ãë¼ÒÇÏ´Â ¹æ¹ýµµ °¡´ÉÇÕ´Ï´Ù.

Âü°í»çÇ×À¸·Î MSÀ©µµ¿ì¿¡¼­´Â semantic-ia-complete-symbol-menu âÀÌ C-g ·Î »ç¶óÁöÁö ¾Ê´Âµ¥
ESC Å°³ª ÀÌ»óÇÏ°Ôµµ ¿ÞÂÊ Alt Å°¸¦ ´©¸£¸é »ç¶óÁý´Ï´Ù.

2.3. VS¿Í ºñ½ÁÇÏ°Ô ÀÎÅÚ¸®¼¾½º¸¦ "." "->" "::" ·Î »ç¿ëÇϱâ

VSó·³ "." "->" "::" ÀԷµǸé ÀÎÅÚ¸®¼¾½º°¡ µÇµµ·Ï »ç¿ëÇÏ·Á¸é ¸í½ÃÀûÀ¸·Î Å°¹ÙÀεùÀ» Çؼ­ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

cedet ȨÆäÀÌÁö¿¡ ³ª¿Â ³»¿ëÀ¸·Î Çϸé "." ´Â µÇ´Âµ¥ "->" "::" ´Â ¿øÇÏ´Â ´ë·Î ÀÛµ¿ÀÌ ¾ÈµÇ¼­ Äڵ带 ¾à°£ Ãß°¡Çؼ­ .emacs ÆÄÀÏ¿¡ ³Ö¾î¾ß ÇÕ´Ï´Ù.
Âü°í: http://cedet.sourceforge.net/intellisense.shtml
;; óÀ½ ºÎÅÍ . -> :: ±â´ÉÀ» »ç¿ëÇϽ÷Á¸é ¾Æ·¡ "nil" À» "t" ¹Ù²Ù¼¼¿ä. 
(defvar semantic-complete-self-insert-p nil)
(defun semantic-complete-self-insert-toggle-switch ()
  (interactive)
  (if semantic-complete-self-insert-p
      (progn (setq semantic-complete-self-insert-p nil)
	     (message "semantic-complete-self-insert off") )
    (progn (setq semantic-complete-self-insert-p t)
	   (message "semantic-complete-self-insert on") )  )   )


(defun semantic-complete-self-insert-for-dot-operator (arg)
  (interactive "p")
  (if semantic-complete-self-insert-p
      (call-interactively 'semantic-complete-self-insert)
    (self-insert-command arg) )  )

(defun semantic-complete-self-insert-for-arrow-operator (arg)
  (interactive "p")
  (if (and semantic-complete-self-insert-p
	   (string= "-" (char-to-string (char-before (point)) )  )   )
      (call-interactively 'semantic-complete-self-insert)
    (self-insert-command arg) )  )

(defun semantic-complete-self-insert-for-scope-operator (arg)
  (interactive "p")
  (if (and semantic-complete-self-insert-p
	   (string= ":" (char-to-string (char-before (point)) )  )   )
      (call-interactively 'semantic-complete-self-insert)
    (self-insert-command arg) )  )


(defun c++-mode-additional-semantic-keys ()
  "Key bindings to add to `c++-mode'."
  (define-key c++-mode-map [(control c)(control .)] 'semantic-complete-self-insert-toggle-switch)
  (define-key c++-mode-map "." 'semantic-complete-self-insert-for-dot-operator)
  (define-key c++-mode-map ">" 'semantic-complete-self-insert-for-arrow-operator)
  (define-key c++-mode-map ":" 'semantic-complete-self-insert-for-scope-operator)
  )

(add-hook 'c++-mode-hook 'c++-mode-additional-semantic-keys)

3. ½Éº¼¿Ï¼º(symbol completion)

3.1. Á¾·ù

½Éº¼¿Ï¼º¿¡µµ ÀÎÅÚ¸®¼¾½ºÃ³·³ ¿©·¯°¡Áö°¡ ÀÖ½À´Ï´Ù.

1) dabbrev-expand
emacs¿¡ ³»ÀåµÈ ±â´ÉÀÔ´Ï´Ù. ÇöÀç ¿­·Á ÀÖ´Â ¹öÆÛÀÇ ½Éº¼À» °¡Áö°í ÀÚµ¿¿Ï¼ºÀ» ÇÕ´Ï´Ù.
Á×, C-x C-b (list-buffers) Çؼ­ ³ª¿À´Â ¸®½ºÆ® Áß ÀÚ½ÅÀÌ ¸¸µç ¹öÆÛ°¡ ÇØ´çµË´Ï´Ù.
(Áö¿ªº¯¼ö¸¦ ½Éº¼¿Ï¼º ÇÒ ¶§ Á¤¸» ÆíÇÕ´Ï´Ù. ÇöÀç ¹öÆÛ °Ë»öÀ» Á¦ÀÏ ¸ÕÀúÇϱ⠶§¹®¿¡...)

2) hippie-expand
dabbrev-expand ó·³ emacs¿¡ ³»ÀåµÈ ±â´ÉÀÔ´Ï´Ù.
dabbrev-expand¿Í hippie-expand Áß ¼±È£ÇÏ´Â °ÍÀ» »ç¿ëÇϼ¼¿ä.
(senator-minor-mode ¸¦ off ÇÏ°í »ç¿ëÇϼ¼¿ä.)

3) senator-complete-symbol
cedet ÆÐÅ°Áö¸¦ »ç¿ëÇÏ¸é ±×³É »ç¿ë ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÎÅÚ¸®¼¾½ºÃ³·³ #include ¸¦ Æ÷ÇÔÇؼ­ ÀÚµ¿¿Ï¼ºÀ» ÇÕ´Ï´Ù.

4) complete-symbol
etags ·Î TAGS ÆÄÀÏÀ» ¸¸µé¾î ÁÖ¾îÁÖ°í visit-tags-table À» ÇØ¾ß »ç¿ë °¡´ÉÇÕ´Ï´Ù.

5) ebrowse-tags-complete-symbol
ebrowse ·Î BROWSE ÆÄÀ»À» ¸¸µé¾î ÁÖ°í BROWSE ÆÄÀÏÀ» ´Ù¸¥ ¹öÆÛ¿¡ ¿­¾î µÎ¾î¾ß »ç¿ë °¡´ÉÇÕ´Ï´Ù.
ebrowseÀÇ ±â´ÉÀÌ etags¿Í ºñ½ÁÇÏÁö¸¸ ebrowse°¡ C++¿¡ ´õ Àß ÃÖÀûÈ­µÇ¾î ÀÖ½À´Ï´Ù.([http]Âü°í¹®¼­)

3.2. Å°¹ÙÀεù ¿¹Á¦

;;;; ½Éº¼¿Ï¼º Å°¹ÙÀεù ¿¹Á¦

;; M-/ (dabbrev-expand) - emacs¿¡ ±âº» ¼³Á¤ µÇ¾î ÀÖÀ½

;;senator-complete-symbol ±âº» Å°¹ÙÀεùÀº C-c , TAB ÀÌ°í ¾Æ·¡´Â Ãß°¡ ÁöÁ¤ÇÑ °ÍÀÓ
(global-set-key [(meta return)] 'senator-complete-symbol)

(global-set-key [(meta shift return)] 'complete-symbol)

;; ebrowse-tags-complete-symbol ±âº» Å°¹ÙÀεùÀº C-c RET TAB ÀÌ°í ¾Æ·¡´Â Ãß°¡ ÁöÁ¤ÇÑ °ÍÀÓ
(global-set-key [(control meta return)] 'ebrowse-tags-complete-symbol)
¿¹¸¦ µé¾î senator-complete-symbol ¸¦ »ç¿ëÇÒ °÷¿¡¼­ M-RET ¸¦ ´©¸£¸é
»ç¿ë °¡´ÉÇÑ ½Éº¼ÀÌ ¿Ï¼ºÀÌ µÇ°í ´Ù½Ã M-RET´©¸£¸é ´Ù¸¥ ½Éº¼ÀÌ ¿Ï¼ºµÇ°í
ÀÌ·± ½ÄÀ¸·Î »ç¿ë °¡´ÉÇÑ ½Éº¼ÀÌ µ¹¾Æ°¡¸ç ¿Ï¼ºµÇ°Ô µË´Ï´Ù.

Meta(Alt)¸¦ "°è¼Ó" ´©¸¥ »óÅ¿¡¼­ RET¸¸ ´©¸£´Â ¹æ¹ýµµ °¡´ÉÇÕ´Ï´Ù.

4. ÀÎÅÚ¸®¼¾½º¿Í ½Éº¼¿Ï¼º Å×½ºÆ®

ÀÎÅÚ¸®¼¾½º´Â ¿øÇÏ´Â ¸ðµç °ÍÀ» ÀÚµ¿¿Ï¼º½Ãų ¼ö ÀÖÁö¸¸ ´À¸®±â ¶§¹®¿¡ ½Éº¼¿Ï¼ºÀ» ÀûÀýÈ÷ »ç¿ëÇϸé ÁÁÀºµ¥
½Éº¼¿Ï¼ºÀÇ Á¾·ù¿¡ µû¶ó ÀÚµ¿¿Ï¼ºÀÌ ¿øÇÏ´Â ´ë·Î ¾È µÇ´Â °æ¿ìµµ ÀÖ½À´Ï´Ù.
±ÍÂúÀ¸½Å ºÐÀº ¼ÓÆíÈ÷ ÀÎÅÚ¸®¼¾½º¸¸ »ç¿ëÇϼŵµ µË´Ï´Ù.

¾Æ·¡¿Í °°Àº Äڵ尡 ÀÖ°í etags¿Í ebrowse·Î TAGS¿Í BROWSE ÆÄÀÏÀ» ¸¸µé¾ú°í BROWSE ÆÄÀÏÀº ´Ù¸¥ ¹öÆÛ¿¡ ¿­¾î ³õ¾Ò´Ù °¡Á¤ÇÕ´Ï´Ù.
#include <iostream>

class Test
{
public:
    Test();
    virtual ~Test();

public:
    void TestClassPrint () = 0;
    void TestClassPrint2 () = 0;
};

void TestFunctionPrint()
{
    printf("hello emacs");
}

int main(int argc, char *argv[])
{
    int localvalue = 4;
    Test test;

    printf("print localvalue : %d", localvalue);

    _ <-- ¿©±â Ä¿¼­

    return 0;
}
Å×½ºÆ® 1)
À§ »óÅ¿¡¼­
"lo"±îÁö ŸÀÌÇÎ ÈÄ "localvalue"À» ¿Ï¼º ½ÃÅ°°íÀÚ Çϸé ÀÎÅÚ¸®¼¾½º´Â semantic-complete-self-insert¸¦ Á¦¿ÜÇÏ°í ÀüºÎ »ç¿ëÇÒ ¼ö ÀÖ°í
½Éº¼¿Ï¼ºÀº dabbrev-expand(hippie-expand)¿Í senator-complete-symbol¸¸ ¿Ï¼º ½Ãų ¼ö ÀÖ½À´Ï´Ù.
±× ÀÌÀ¯´Â TAGS¿Í EBROWSEÆÄÀÏÀ» ¿­¾î º¸¸é localvalue¶ó´Â °ÍÀÌ ¾ø°í Ŭ·¡½º¸í, ÇÔ¼ö, ¸â¹öÇÔ¼ö¸¸ ű׷Π¸¸µé¾îÁ®¼­ À־
complete-symbol, ebrowse-tags-complete-symbol´Â "localvalue"¸¦ ÀÚµ¿¿Ï¼º ½Ãų ¼ö ¾ø½À´Ï´Ù.

Å×½ºÆ® 2)
À§ »óÅ¿¡¼­ "test.Te"±îÁö ŸÀÌÇÎ ÈÄ "test.TestClassPrint"¸¦ ¿Ï¼º ½ÃÅ°°íÀÚ Çϸé ÀÎÅÚ¸®¼¾½º´Â ÀüºÎ »ç¿ëÇÒ ¼ö ÀÖ°í
½Éº¼¿Ï¼ºÀº senator-complete-symbol¿Í ebrowse-tags-complete-symbol ¸¸ ¿Ï¼º ½Ãų ¼ö ÀÖ½À´Ï´Ù.
C++ ÀÇ ¸â¹öÇÔ¼öÀ̱⠶§¹®¿¡ complete-symbol´Â ¿Ï¼º ½Ãų ¼ö ¾ø½À´Ï´Ù. TAGSÆÄÀÏÀ» ¿­¾î º¸¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù.

Âü°í:
find-file (C-x C-f)·Î BROWSE ÆÄÀÏÀ» ¿­¸é Ebrowse-Tree Mode ·Î µé¾î°¡±â ¶§¹®¿¡
³»¿ëÀ» º¸°í ½ÍÀ¸½Ã¸é M-x find-file-literally ¸¦ »ç¿ëÇϼ¼¿ä.

5. °¡»ó ½Ã³ª¶ó¿À

emacs¿¡´Â ÀÚµ¿¿Ï¼º Á¾·ù°¡ ³Ê¹« ¸¹±â ¶§¹®¿¡ °¡»ó ½Ã³ª¶ó¿À¸¦ Çϳª Àû¾î º¾´Ï´Ù.

¿ì¼± Áö¿ªº¯¼ö ÀÚµ¿¿Ï¼ºÀº M-/ (dabbrev-expand)¸¦ »ç¿ëÇÕ´Ï´Ù.
ÀÌ°ÍÀº ÇöÀç ¹öÆÛÀÇ ½Éº¼À» ¸ÕÀú °Ë»öÇÏ°í emacs¿¡ ³»ÀåµÇ¾î ÀÖ¾î °¡Àå ºü¸£±â ¶§¹®¿¡ ÃÖ»óÀÇ ¼±ÅÃÀ̶ó »ý°¢µË´Ï´Ù.

óÀ½ Á¢ÇÏ´Â ¶óÀ̺귯¸®°¡ ÀÖ´Ù °¡Á¤ÇÏ¸é ¸â¹öÇÔ¼ö °°Àº °ÍÀÌ Àͼ÷Áö ¾Ê±â ¶§¹®¿¡
semantic-complete-self-insert¿Í semantic-ia-complete-symbol-menu¸¦ Àû´çÈ÷ ¼¯¾î »ç¿ëÇÏ´Ù°¡
Á» Àͼ÷ÇØ Áö¸é ¸â¹öÇÔ¼ö¸íÀ» »ý°¢³ª´Âµ¥ ±îÁö ŸÀÌÇÎ ÈÄ semantic-complete-analyze-inline ¸¦ »ç¿ëÇÏ°í
»ý°¢ÀÌ ¾È ³ª´Â ¸Å°³º¯¼ö°¡ ÀÖÀ¸¸é semantic-analyze-possible-completions ¸¦ »ç¿ëÇÕ´Ï´Ù.

±×¸®°í ¶óÀ̺귯¸®°¡ ¿ÏÀüÈ÷ ´É¼÷ÇØÁ®¼­ ¿Ø¸¸ÇÑ ¸â¹öÇÔ¼ö°¡ ´Ù ±â¾ï³ª¸é
ÀÌÁ¦ ½Å³»¸° ÄÚµù(?)À» ÇÏ¸ç °£°£È÷ ½Éº¼¿Ï¼º(senator-complete-symbol)À» »ç¿ëÇÏ¸é µË´Ï´Ù.

ÀÚ½ÅÀÌ ¸¸µç Ŭ·¡½º °°Àº °æ¿ìµµ ¸â¹öÇÔ¼ö¸¦ °ÅÀÇ ±â¾ïÇÏ°í Àֱ⠶§¹®¿¡ ½Éº¼¿Ï¼º(senator-complete-symbol)À» »ç¿ëÇÏ¸é µË´Ï´Ù.

complete-symbol, ebrowse-tags-complete-symbol ´Â TAGS, BROWSE ÆÄÀÏÀ» µû·Î ¸í·É¾î¸¦ »ç¿ëÇؼ­
¸¸µé¾î¾ß ÇÏ´Â ºÎ´ãÀÌ Àֱ⠶§¹®¿¡ ¼Ò½ºÄÚµå ºÐ¼® °â ¼öÁ¤ ÇÒ ¶§ »ç¿ëÇϸé ÁÁ½À´Ï´Ù. (tag·Î ÁöÁ¤µÈ °÷À» ¿Ô´Ù °¬´Ù ÇÒ ¼ö ÀÖÀ¸¹Ç·Î...)

6. Yet Another Snippet (yasnippet)

ÀÎÅÚ¸®¼¾½º¿Í ½Éº¼¿Ï¼ºÀÌ¸é ¿Ïº®ÇÏÁö¸¸
yasnippet ±îÁö »ç¿ëÇϸé Á¤¸» ´õÇÒ ³ªÀ§ ¾ø°Ô µË´Ï´Ù.

yet another snippet extension for Emacs.
http://code.google.com/p/yasnippet/

"class" ŸÀÌÇÎ ÈÄ tab ´©¸£°í "Te"±îÁö ÀÔ·ÂÇÑ È­¸é
yasnippet.png
[PNG image (41.3 KB)]

ÁÖÀÇ»çÇ×:
yasnippet·Î ¿Ï¼ºµÈ ÄÚµå´Â indent°¡ space·Î »ðÀԵǰí indent levelÀÌ 4ÀÔ´Ï´Ù.
±×·¡¼­ ¼³Á¤ÀÌ ´Ù¸£½Å ºÐÀº Á¤·ÄÀ» ´Ù½Ã ÇØÁÖ¾î¾ß Çϴµ¥
°¡Àå °£´ÜÇÑ ÇØ°á ¹æ¹ýÀº .emacs¿¡ ¾Æ·¡¸¦ Ãß°¡ÇÏ´Â °ÍÀÔ´Ï´Ù.
(add-hook 'yas/after-exit-snippet-hook
          '(lambda ()
             (indent-region yas/snippet-beg
                            yas/snippet-end)))
(Ãâó: http://code.google.com/p/yasnippet/wiki/Tips)

Âü°í:
c¾ð¾î °°Àº °æ¿ì [http]msf-abbrev°¡ °¡ ´õ ÆíÇÒ ¼ö ÀÖ½À´Ï´Ù.

by »çÀÌÁ®:
msf-abbrev°¡ yasnippetº¸´Ù ´õ »¡¸® ³ª¿Â ¾à¾î(abbrevation or snippet) ¸ðµåÀÌ°í, ¿äÁò À¯ÇàÇÏ°í ÀÖ´Â °ÍÀº msf-abbrev°¡ ¾Æ´Ï¶ó yasnippetÀÔ´Ï´Ù.

7. ½Ç½Ã°£ ºÐ¼® (real-time analysis)

ÀÚµ¿¿Ï¼º¿¡ ¿¬°üµÈ emacsÀÇ °­·ÂÇÑ ±â´ÉÀ» Çϳª ¼Ò°³ÇÏ°Ú½À´Ï´Ù.

1) semantic-speedbar-analysis
semantic-speedbar-analysis.png
[PNG image (89.58 KB)]

2) ECB Analyse Buffer (ECB ¼³Ä¡ ÇÊ¿ä)
ecb-analyse-buffer.png
[PNG image (92.31 KB)]

Âü°í:
analyse-buffer ¹ÝÀÀÀÌ ´À¸®´Ù¸é
C-h v (M-x describe-variable)
ecb-analyse-buffer-sync-delay Âü°íÇϼż­ Àû´çÈ÷ ¹Ù²Ù¼¼¿ä.
Àú°°Àº °æ¿ì ÇÑ 0.7 Á¤µµÇÏ´Ï ÀûÀýÇß½À´Ï´Ù.

- ÇöÀç(2009³â 7¿ù 4ÀÏ) [http]Latest CVS-shapshot ¹öÀü¿¡¼­´Â ¾Æ·¡ ¹®Á¦ ÇØ°áµÇ¾ú½À´Ï´Ù.

¾Æ·¡ ¸Þ¼¼Áö°¡ ³ª¿À°í ECB Analyse Buffer °¡ ÀÛµ¿ ¾ÈµÈ´Ù¸é
eieio-default-superclass: Invalid slot name: "#<semantic-analyze-context context>", localvariables
Invalid slot name: "#<semantic-analyze-context context>", localvariables
ecb-analyse.el ÆÄÀÏ¿¡ ¾Æ·¡¸¦ Àû¿ëÇØ º¸¼¼¿ä.
***************
*** 270,276 ****
  
  (defmethod ecb-analyse-more-nodes ((context semantic-analyze-context))
    "Show a set of ecb-nodes specific to CONTEXT."
!   (let ((localvars (oref context localvariables)))
      (when localvars
        (ecb-analyse-add-nodes "Local Variables" "Local Variables" localvars
                               ecb-analyse-nodetype-localvars)))
--- 270,278 ----
  
  (defmethod ecb-analyse-more-nodes ((context semantic-analyze-context))
    "Show a set of ecb-nodes specific to CONTEXT."
!   (let* ((scope (oref context scope))
! 	 (localvars (when scope
! 		      (oref scope localvar))))
      (when localvars
        (ecb-analyse-add-nodes "Local Variables" "Local Variables" localvars
                               ecb-analyse-nodetype-localvars)))

8. ¹®Á¦ÇØ°á ¹× À̽´

8.1. ÀÎÅÚ¸®¼¾½º°¡ Àß ¾ÈµÉ ¶§

¾Æ·¡ ¿¡·¯°¡ ³ª¿À°í ÀÎÅÚ¸®¼¾½º°¡ Àß ¾ÈµÈ´Ù¸é
semantic-analyze-possible-completions-default:
Cannot find types for `"..."'
.emacs ÆÄÀÏ¿¡¼­ semantic-add-system-include ÇÔ¼ö·Î Çì´õÆÄÀÏ °æ·Î¸¦ Àß ¼³Á¤Çß´ÂÁö È®ÀÎÇÏ°í
C-x C-s (save-buffer)
M-x revert-buffer
ÀÌ·¸°Ô Çϼ¼¿ä.

Á» ´õ ÆíÇÏ°Ô »ç¿ëÇÏ·Á¸é ¾Æ·¡ »çÀÌÆ®¸¦ Âü°íÇؼ­
http://www.stokebloke.com/wordpress/2008/04/17/emacs-refresh-f5-key/

¾Æ·¡¸¦ .emacs ÆÄÀÏ¿¡ Ãß°¡Çϼ¼¿ä.
(defun refresh-file-after-save-buffer ()
  "refresh file after save buffer"
  (interactive)
  (save-buffer)
  (revert-buffer t t t) )

(global-set-key [(control c)(control R)] 'refresh-file-after-save-buffer)

8.2. semanticÀº "add-hook" ¿¡ ¹Î°¨ÇÏ´Ù?

¿¹1)
(add-hook 'c-mode-common-hook 'folding-mode)
folding-mode°¡ ·Îµå°¡ ¾È µÇ¾î À־ "folding-mode" °¡ void-function ÀÏ °æ¿ì ¾Æ·¡ ¿¡·¯°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù.
Wrong type argument: syntax-table-p,nil

¿¹2) choose-header-file-mode (http://han9kin.doesntexist.com/28) ÇÔ¼ö°°Àº °æ¿ì ¾Æ·¡Ã³·³ ¼öÁ¤ÇØ¾ß Á¤»ó ÀÛµ¿ÇÕ´Ï´Ù.
(defun choose-header-file-mode ()
  (if (and buffer-file-name (string= (file-name-extension buffer-file-name) "h"))
      (let ((filebase (file-name-sans-extension buffer-file-name)))
        (cond
         ((and (file-exists-p (concat filebase ".c")) 
	       (not (string= major-mode "c-mode")))
          (c-mode) )
         ((and (file-exists-p (concat filebase ".cpp"))
	       (not (string= major-mode "c++-mode")))
          (c++-mode) )
         ((and (file-exists-p (concat filebase ".cc"))
	       (not (string= major-mode "c++-mode")))
          (c++-mode) )
         ((and (file-exists-p (concat filebase ".m"))
	       (not (string= major-mode "objc-mode")))
          (objc-mode) )
         ((and (file-exists-p (concat filebase ".mm"))
	       (not (string= major-mode "objc-mode")))
          (objc-mode) )
         ((and t
	       (not (string= major-mode "c++-mode")))
          (c++-mode) )  )   )
    ) )

(add-hook 'c-mode-common-hook 'choose-header-file-mode)
±×·¸Áö ¾ÊÀ¸¸é ¾Æ·¡°°Àº ¿¡·¯°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù.
semantic-analyze-current-context: Wrong type argument: syntax-table-p, nil
eieio-generic-call: No method definition: semantic-analyze-type-constraint, (nil)

Âü°í:
find-file-hook¿¡ Ãß°¡ÇÑ ÇÔ¼ö°¡ Àß ÀÛµ¿ÀÌ ¾ÈµÇ¸é c-mode-common-hook, after-change-major-mode-hookÀ¸·Î ¿Å°Ü º¸°Å³ª
add-hook¿¡ ¿É¼Ç ¸Å°³º¯¼öµµ Á¶Á¤ÇØ º¸¼¼¿ä.
(add-hook 'xxxxx 'xxxxx t t)

8.3. ¸ÅÅ©·Î(#define) ¶§¹®¿¡ ÀÚµ¿¿Ï¼ºÀÌ ¾ÈµÉ ¶§

¿¹¸¦ µé¾î ¾Æ·¡ °°Àº mfc ÇÔ¼ö °°Àº °æ¿ì
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp() {...
AfxGetApp()->·Î ÀÚµ¿¿Ï¼ºÀ» ½ÃµµÇϸé CWinApp*ÇüÀÌ ¾Æ´Ï¶ó AFXAPIÇüÀ¸·Î ÀνÄÇؼ­ ÀÚµ¿¿Ï¼ºÀÌ ¾È µÇ´Âµ¥
¾Æ·¡¸¦ Ãß°¡Çؼ­ ¸ÅÅ©·Î¸¦ ¹«·ÂÈ­½ÃÅ°¸é Á¤»óÀûÀ¸·Î ÀÚµ¿¿Ï¼ºÀÌ µË´Ï´Ù.(ÀÌÀü¿¡ »ý¼ºµÈ ij½¬ ÆÄÀÏ »èÁ¦ ÇÊ¿ä)
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("_AFXWIN_INLINE" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("AFXAPI" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("AFX_CDECL" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("PASCAL" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("CALLBACK" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("__cdecl" . ""))
(add-to-list 'semantic-lex-c-preprocessor-symbol-map '("__stdcal" . ""))
mfc¿Ü¿¡µµ wxWidget µîµîÀÇ ¶óÀ̺귯¸®Ã³·³ ¸ÅÅ©·Î°¡ ¸¹Àº °æ¿ì È°¿ë °¡´ÉÇÕ´Ï´Ù.
Âü°í:
CEDET wxWidgets ÀÚµ¿¿Ï¼º

8.4. MS À©µµ¿ì¿¡¼­ cedet ÄÄÆÄÀÏ ¹®Á¦

MS À©µµ¿ì¿¡¼­ EmacsW32, msys µîµîÀÇ ¹öÀü Ư¼º ¶§¹®¿¡ cedet ÄÄÆÄÀÏÇÒ ¶§
¾Æ·¡¿Í °°Àº ¿¡·¯¸¦ ¸¸³¯ ¼ö Àִµ¥
Symbol's value as variable is void: outbuffer
Symbol's value as variable is void: filename
Cannot open load file: srecode-fields

Cannot open load file: eieio-load
Cannot open load file: semantic-load
Cannot open load file: srecode-load
Cannot open load file: ede-load
Cannot open load file: cogre-loaddefs
Cannot open load file: contrib-loaddefs
ÀÏ´Ü °ø½Ä GNU Emacs¸¦ »ç¿ëÇÏ°í
http://ftp.gnu.org/pub/gnu/emacs/

cedet-build.el ÆÄÀÏÀ» emacs·Î ÀÐ¾î µéÀÎ ÈÄ
M-x eval-buffer
M-x cedet-build-in-default-emacs
ÀÌ·±½ÄÀ¸·Î emacs ³»ºÎ¿¡¼­ ÄÄÆÄÀÏÇϼ¼¿ä.
ÄÄÆÄÀÏÇϴµ¥ ²Ï ½Ã°£ÀÌ ¿À·¡ °É¸³´Ï´Ù.
±×¸®°í "Done"À̶ó´Â ¹®±¸°¡ ³ª¿À´ÂÁö È®ÀÎÇϼ¼¿ä.(Âü°í ½º¼¦: [http]cedet-compile-in-mswin.png)

9. ¶Ç ´Ù¸¥ ÀÚµ¿¿Ï¼º

cedetÀÇ semanticÀº c,c++ ¾ð¾î´Â ¿Ïº®ÇÏ°Ô Áö¿øÇÏ´Â ¹Ý¸é¿¡ ´Ù¸¥ ¾ð¾î´Â ¹Ì¹ÌÇÑ ÆíÀÔ´Ï´Ù.
´Ù¸¥ Åø »ç¿ëµµ °í·ÁÇØ º¸¼¼¿ä.
Âü°í:
http://www.emacswiki.org/emacs/CategoryCompletion




4) HTML ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]emacs-tag-completion.png
Âü°í:
* http://www.emacswiki.org/emacs/NxhtmlMode
* http://kldp.org/node/104700
* ¶Ç ´Ù¸¥ ¹æ½ÄÀÎ [http]ZenCodingµµ ÃßõÇÕ´Ï´Ù.

5) JavaScript ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]emacs-javascript-completion.png

6) CSS ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]emacs-css-completion.png


8) Ruby ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]auto-complete-ruby.png
Âü°í:
* http://kldp.org/node/110632

9) Java ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]jde-complete.png
Âü°í:
* http://kldp.org/node/110967

10) Bash ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]sh-mode.png

11) Debian rules ÀÚµ¿¿Ï¼º ¿¹
Screenshot : [http]rules(makefile-mode).png


(!) primewizard 20081026

ID
Password
Join
You will soon meet a person who will play an important role in your life.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-11-25 09:37:32
Processing time 0.0032 sec