· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Emacs Gdb Etags Cscope

ÀÌ ±ÛÀº ÇÁ·Î±×·¡¸Ó ÀÔÀå¿¡¼­ Emacs, GDB, etags, cscope¸¦ ¾î¶»°Ô ÇÔ²² ¾µ ¼ö ÀÖ´Â Áö¿¡ ´ëÇÏ¿© ¼³¸íÇÕ´Ï´Ù. (Emacs¸¦ ¸ô¶óµµ »ó°ü¾ø½À´Ï´Ù.) ¶Ç, ¿ø¹®ÀÌ ÈĹèµéÀ» À§ÇØ ¾´ ±ÛÀ̶ó, ´Ù¼Ò ¹Ý¸», Çù¹Ú Åõ·Î µÇ¾î ÀÖÀ¸´Ï ÀÌ Á¡ ¾çÇØ ¹Ù¶ø´Ï´Ù. ([http]½Å¼º±¹)




1. Áغñ»çÇ×


ÀÏ´Ü Emacs´Â ¼³Ä¡µÇ¾î ÀÖ´Ù°í °¡Á¤ÇÑ´Ù -- Red Hat LinuxÀÇ °æ¿ì, binary´Â /usr/bin¿¡, data´Â /usr/share/emacs¿¡ ¼³Ä¡µÈ´Ù.

¾Æ·¡ µÎ sectionÀº ¸ðµÎ CapsLock ۸¦ Control Ű·Î ¾²±â À§ÇÑ °ÍÀÌ´Ù. (Emacs¸¦ ¾²±â À§ÇØ ¹Ýµå½Ã ÇØ¾ß ÇÔ) ¸¸¾à Happy Hacking Keyboard¸¦ ¾²°í ÀÖ´Ù¸é ÇÒ ÇÊ¿ä ¾øÀ½.

1.1. X Window System Key ¼³Á¤


¾î¶² ¸ñÀûÀ¸·Î Emacs¸¦ ¾²´øÁö »ó°ü¾øÀÌ ¹Ýµå½Ã ÇØ¾ß ÇÒ setting Áß Çϳª´Â keyboard ¼³Á¤ÀÌ´Ù. ÀÏ´Ü ¿©·¯ºÐÀÇ Å°º¸µå¿¡¼­ ¾ËÆÄºª 'A' key ¿ÞÂÊ¿¡ Àִ Ű¸¦ º¸±â ¹Ù¶õ´Ù. ÀÌ Å°°¡ 'Control' ۶ó¸é ÀÌ ´Ü°è¸¦ ³Ñ¾î°¡µµ »ó°ü¾ø´Ù.

¿©·¯ºÐÀÌ ¾²°í ÀÖ´Â ´ëºÎºÐÀÇ Å°º¸µå´Â ÀÌ Å°°¡ 'CapsLock'ÀÏ °ÍÀÌ´Ù. ÀÌ °æ¿ì, ÀÌ Å°¸¦ 'Control' key·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. -- EmacsÀÇ ¸ðµç ´ÜÃàŰ´Â ¾ËÆÄºª 'A' key ¿ÞÂÊÀÇ Å°°¡ 'Control' key¶ó°í °¡Á¤ÇÑ ´ÙÀ½ ¸¸µé¾î Áø °ÍÀÌ´Ù. µû¶ó¼­ 'Control'ÀÌ ´Ù¸¥ °÷¿¡ À§Ä¡ÇÒ °æ¿ì, Ű ÀԷ¿¡ »ó´çÇÑ ¹«¸®°¡ µû¸£¸ç, Emacs°¡ ½È¾îÁö´Â °¡Àå Å« ÀÌÀ¯°¡ µÉ °ÍÀÌ´Ù.

xmodmap ÇÁ·Î±×·¥À» ½á¼­ ¿©·¯ºÐÀÇ key layoutÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. ÀÏ´Ü terminalÀ» Çϳª ¶ç¿î ÈÄ, xmodmapÀ» ½ÇÇàÇÏ¸é ´ÙÀ½°ú ºñ½ÁÇÑ Ãâ·ÂÀ» ¾òÀ» ¼ö ÀÖ´Ù:

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x6d)
mod1        Alt_L (0x40),  Meta_L (0x73),  Alt_R (0x71),  Meta_R (0x74)
mod2        Num_Lock (0x4d)
mod3
mod4        Meta_L (0x73),  Meta_R (0x74)
mod5
$ _
À§ÀÇ Ãâ·Â °á°ú´Â ¿©·¯ºÐÀÇ °á°ú¿Í ¾î´À Á¤µµ ´Ù¸¦ ¼ö ÀÖ´Ù´Â °Í¿¡ ÁÖÀÇÇϱ⠹ٶõ´Ù. ÀÏ´Ü °¡Àå Áß¿äÇÑ ¶óÀÎÀº "lock"À¸·Î ½ÃÀÛÇÏ´Â ¶óÀÎÀÌ´Ù:

lock        Caps_Lock (0x42)

À­ÁÙÀ» ¼³¸íÇϸé, "lock"Àº "CapsLock" ±â´ÉÀ» ÇÏ´Â °ÍÀ¸·Î, ÇöÀç keycode 42¹øÀÎ Caps_Lock key°¡ ±× ¿ªÇÒÀ» ÇÑ´Ù´Â °ÍÀÌ´Ù.

´ÙÀ½ ¸í·ÉÀ» ¼öÇàÇÏ¿©, Caps_LockÀ» "lock"¿¡¼­ »©¹ö¸®ÀÚ:
$ xmodmap -e "remove lock = Caps_Lock"
(°á°ú°¡ ±Ã±ÝÇÏ¸é ´Ù½Ã Çѹø ¾Æ¹«·± ÀÎÀÚ¾øÀÌ xmodmapÀ» ½ÇÇàÇÏ¸é µÈ´Ù.) ±× ´ÙÀ½, Caps_LockÀ» "control"¿¡ Ãß°¡ÇÏÀÚ:
$ xmodmap -e "add control = Caps_Lock"
ÀÌÁ¦ xmodmapÀ» ½ÇÇàÇϸé lock°ú control lineÀÌ ´ÙÀ½°ú °°À½À» ¾Ë ¼ö ÀÖ´Ù.

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

...
lock
control     Control_L (0x25),  Control_R (0x6d),  Caps_Lock (0x42)
...

$ _

ÀÌÁ¦, X Window´Â ¿©·¯ºÐÀÇ "CapsLock"۸¦ "control"·Î ÇØ¼®ÇÏ°Ô µÈ´Ù.

¸Å¹ø ÀÌ·± ½ÄÀ¸·Î ¹Ù²Ü ¼ö´Â ¾ø´Â ³ë¸©ÀÌ´Ù. µû¶ó¼­ À§ÀÇ °úÁ¤À» script¿¡ ±â·ÏÇß´Ù°¡ X°¡ ½ÃÀÛÇÒ ¶§¸¶´Ù ÀÚµ¿À¸·Î Àоî¿À°Ô ÇØ¾ß ÇÑ´Ù.

Red Hat °è¿­À̶ó¸é $HOME/.Xmodmap ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ ±â·ÏÇØ µÎ¸é µÈ´Ù.

  remove lock = Caps_Lock
  add control = Caps_Lock

¸¶Áö¸·À¸·Î Emacs¸¦ ½ÇÇà½ÃÄѼ­ keyboard settingÀ» È®ÀÎÇØ º¸¶ó. CapsLock key¸¦ ½á¼­ C-x C-c¸¦ ´­·¯ º¸ÀÚ. Emacs°¡ Á¾·áÇÏ°Ô µÇ¸é ¼º°øÀÌ´Ù.

¾ÕÀ¸·Î Control ۸¦ ´©¸¦ Çʿ䰡 ÀÖ´Ù¸é ²À CapsLock key¸¦ ½á¼­ ´©¸£±â ¹Ù¶õ´Ù.

Á» ´õ ÀÚ¼¼ÇÑ »çÇ×À» ¿øÇÑ´Ù¸é 2 xmodmap man page, 3 Consistent Keyboard ConfigurationÀ» Âü°íÇϱ⠹ٶõ´Ù.

1.2. Linux Console¿¡¼­ Key ¼³Á¤


À§ÀÇ xmodmapÀº X Window System¿¡¼­¸¸ ¾µ ¼ö ÀÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. µû¶ó¼­, X¸¦ ¶ç¿ì±â Àü¿¡´Â ¾µ ¼ö ¾ø´Ù. loadkeys/showkey/dumpkeys ÇÁ·Î±×·¥À» ¾²¸é ¸¶Âù°¡Áö·Î CapsLock key¸¦ Control ±â´ÉÀ¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù.

under construction

Á» ´õ ÀÚ¼¼ÇÑ »çÇ×À» ¿øÇÑ´Ù¸é 4 Linux Console HOWTO, 3 Consistent Keyboard ConfigurationÀ» Âü°íÇϱ⠹ٶõ´Ù.

  • Ãß°¡ : À©µµ¿ì¿¡¼­ ¿ø°Ý Á¢¼ÓÇÏ¿© »ç¿ëÇÏ½Ç °æ¿ì À§ÀÇ ¹æ¹ýÀ¸·Î CapsLock ۸¦ º¯°æÇϽǼö ¾ø½À´Ï´Ù. ÇØ°áÃ¥À¸·Î Àú´Â KeyTweakÀ̶ó´Â ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿´½À´Ï´Ù. Âü°íÇϽñ⠹ٶø´Ï´Ù. - soma815
  • Mac OS X »ç¿ëÀÚÀÇ °æ¿ì KeyRemap4MacBook ÆÐŰÁö + È®ÀåÆÐŰÁö(PCKeyboardHack)¸¦ ¼³Ä¡ÇϽøé CapsLock۸¦ ¿øÇϴ Ű·Î ¸®¸ÅÇÎ °¡´ÉÇÕ´Ï´Ù. - jcy0228

2. Learn Emacs keys


ÀÌÁ¦ Emacs¸¦ ¾²±â À§ÇÑ ±âº»ÀûÀÎ ¼³Á¤Àº ³¡³µ´Ù. ÀÌÁ¦ Emacs¸¦ ¾²±â À§ÇÑ ±âº»ÀûÀΠ۵éÀ» ¹è¿ö¾ß ÇÑ´Ù.

EmacsÀÇ °ÅÀÇ ¸ðµç ±â´ÉÀº control key³ª meta key·Î ½ÃÀÛÇÑ´Ù. ´ç¿¬È÷ control key·Î´Â ¿©·¯ºÐÀÌ ÈçÈ÷ ½á¿Ô´ø ¿ÞÂÊ control key, ¿À¸¥ÂÊ control key¸¦ Æ÷ÇÔÇϸç, Áö±Ý±îÁö ÀÛ¾÷Çß´ø °á°ú·Î CapsLock keyµµ Æ÷ÇÔÇÑ´Ù. (ÀÌ CapsLock key¸¦ control key·Î ¾µ °ÍÀ» °­·ÂÈ÷! ÃßõÇÑ´Ù.) Meta key´Â ÈçÈ÷ UNIX keyboard¿¡¼­ "<>"·Î Ç¥½ÃµÈ Ű, ¶Ç´Â ÀÏ¹Ý PC¿ë keyboard¶ó¸é, Alt۰¡ ´ë½Å »ç¿ëµÈ´Ù.

ÀÌ ±Û°ú Emacs ¸Å´º¾ó¿¡¼­ »ç¿ëÇϴ ǥ±â¹ýÀ¸·Î, "C-" Á¢µÎ¾î´Â control key¸¦ °°ÀÌ ´©¸£¶ó´Â ¶æÀ̸ç, "M-" Á¢µÎ¾î´Â meta key¸¦ °°ÀÌ ´©¸£¶ó´Â ¶æÀÌ´Ù. ¹°·Ð "C-M-"Àº control key¿Í meta key¸¦ µ¿½Ã¿¡ ´­·¯¾ß ÇÑ´Ù´Â ¶æÀÌ´Ù. ¶ÇÇÑ tab key³ª space bar, return key, escape key ±×¸®°í function key¸¦ ³ªÅ¸³¾ ¶§¿¡´Â °¢°¢ <TAB>, <SPC>, <RET>, <ESC>, <F1>µî°ú °°ÀÌ Ç¥½ÃÇÒ °ÍÀÌ´Ù. ¸î °¡Áö ¿¹¸¦ µé¸é ´ÙÀ½°ú °°´Ù:

Ű ÀÔ·Â ¼³¸í
C-x C-f control key¸¦ ´©¸¥ »óÅ¿¡¼­, `x'¸¦ ´©¸£°í (control key¸¦ ¶¼Áö ¾Ê°í) `f'¸¦ ´©¸¥´Ù.
C-x o control key¸¦ ´©¸¥ »óÅ¿¡¼­, `x'¸¦ ´©¸£°í (control key¸¦ ¶¼°í) `o'¸¦ ´©¸¥´Ù.
C-_ control key¸¦ ´©¸¥ »óÅ¿¡¼­ `_'(¹ØÁÙ)À» ´©¸¥´Ù. ´ë°³ÀÇ Å°º¸µå¿¡¼­ ¹ØÁÙÀº <SHIFT>¿Í '-' key¸¦ ´­·¯¾ß ÇϹǷÎ, °á±¹ ÀÌ Å°´Â control key¿Í shift key¸¦ ´©¸¥ »óÅ¿¡¼­ '-'¸¦ ´­·¯¾ß ÇÑ´Ù.
M-x compile<RET> meta key¸¦ ´©¸£°í `x'¸¦ ´©¸¥ ´ÙÀ½ (meta key¸¦ ¶¼°í) `compile'À» Ä¡°í <RET>À» ´©¸¥´Ù.

ÀÚ ÀÌÁ¦ ¿©±â±îÁö ¹è¿üÀ¸¸é, Emacs¸¦ ½ÇÇà½Ã۰í, "C-h t"¸¦ ´­·¯ tutorialÀ» ¿­°í Àо±â ¹Ù¶õ´Ù. À§ tutorialÀ» ÀÐÀ» ¶§, ¾Æ·¡ Ű ¸ñ·ÏÀº ¹Ýµå½Ã ¿Ü¿ö¼­ Àͼ÷ÇÏ°Ô ¾µ ÁÙ ¾Ë¾Æ¾ß Çϴ ŰµéÀ̹ǷΠ²À ¿Ü¿ö ¾²±â ¹Ù¶õ´Ù:

Ű ÀÔ·Â ¼³¸í
C-x C-c Emacs Á¾·á
C-v ´ÙÀ½ ÆäÀÌÁö
M-v ÀÌÀü ÆäÀÌÁö
C-l ÇöÀç ÁÙÀ» âÀÇ °¡¿îµ¥ ºÎºÐÀ¸·Î º¸¿©ÁÜ
C-p Ä¿¼­ up
C-n Ä¿¼­ down
C-f Ä¿¼­ right
C-b Ä¿¼­ left
C-a Ä¿¼­¸¦ ÁÙÀÇ ¸Ç óÀ½À¸·Î
C-e Ä¿¼­¸¦ ÁÙÀÇ ¸Ç ¸¶Áö¸·À¸·Î
M-f ´ÙÀ½ ´Ü¾î·Î
M-b ÀÌÀü ´Ü¾î·Î
C-d ÇÑ ±ÛÀÚ Áö¿ì±â
M-d ÇÑ ´Ü¾î Áö¿ì±â
C-k ÇöÀç Ä¿¼­ À§Ä¡¿¡¼­ ÁÙ ³¡±îÁö Áö¿ì±â
C-<SPC> ÇöÀç Ä¿¼­ À§Ä¡ ¸¶Å©(mark)Çϱâ
M-w ¸¶Å©¿¡¼­ ÇöÀç Ä¿¼­ À§Ä¡±îÁö ºí·° ÁöÁ¤(copy)
C-w ¸¶Å©¿¡¼­ ÇöÀç Ä¿¼­ À§Ä¡±îÁö Áö¿ì°í ºí·° ÁöÁ¤(cut)
C-y ºÙ¿© ³Ö±â(paste)
C-_ undo
C-g ¸í·É ÀÔ·Â Ãë¼Ò (undo ¾Æ´Ô)
C-x C-s ÆÄÀÏ ÀúÀåÇϱâ(save)
C-x C-w ´Ù¸¥ À̸§À¸·Î ÆÄÀÏ ÀúÀåÇϱâ(save as...)
C-x C-f ÆÄÀÏ ºÒ·¯¿À±â(load)
C-x k ¹öÆÛ Áö¿ì±â(kill)
C-x b ´ÙÀ½ ¹öÆÛ·Î Àüȯ
C-x C-b ¹öÆÛ ¸ñ·Ï º¸¿©ÁÖ±â
C-x 2 âÀ» µÎ°³·Î ³ª´©±â
C-x 1 ÇöÀç âÀ» Á¦¿ÜÇÑ ´Ù¸¥ ⠴ݱâ
C-x o ´Ù¸¥ âÀ¸·Î Ä¿¼­ À̵¿

´Ù½Ã Çѹø °­Á¶ÇÏÁö¸¸ À§ ۵éÀº ±âº»ÀûÀ¸·Î ¾²À̴ ŰµéÀ̹ǷΠ²À ¿Ü¿ö¼­ ´É¼÷ÇÏ°Ô ¾µ ¼ö ÀÖ°Ô µÇ¾î¾ß ÇÑ´Ù. TutorialÀ» ´Ù Àоú°í, À§ ۵éÀ» ¿Ü¿ü´Ù¸é ´ÙÀ½ ´Ü°è·Î ³Ñ¾î°¡±â ¹Ù¶õ´Ù.

ÇѰ¡Áö ´õ, ´Ù½Ã Çѹø °­Á¶ÇÏÁö¸¸, Emacs¿¡¼­´Â Űº¸µå ¾ËÆÄºª 'A' key ¿ÞÆí¿¡ À§Ä¡Çϰí Àִ Ű°¡ control key¶ó°í °¡Á¤ÇÏ°í ´ÜÃà۵éÀÌ µðÀÚÀεǾî ÀÖÀ¸¹Ç·Î, PC keyboard »ç¿ëÀÚ¶ó¸é, ¹Ýµå½Ã ¿©±â¿¡ À§Ä¡Çϰí ÀÖ´Â CapsLock key¸¦ control key·Î ¹Ù²Ù¾î ÀÛ¾÷Çϱ⠹ٶõ´Ù.

È¿°úÀûÀÎ Ä¿¼­ ¿òÁ÷ÀÓÀ» À§ÇØ ¼Õ°¡¶ôÀÇ ¹èÄ¡¸¦ ´ÙÀ½°ú °°ÀÌ ÇÏÀÚ:

  • ¿Þ¼Õ »õ³¢¼Õ°¡¶ôÀº control¿¡, (CapsLock ŰÀΰŠ¼³¸í ¾ÈÇØµµ µÇ°ÚÁö?)

  • ¿À¸¥¼Õ °ËÁö´Â 'N' key¿¡, (C-n)
  • ¿À¸¥¼Õ ¾àÁö´Â 'P' key¿¡, (C-p)
  • ¿À¸¥¼Õ ÁßÁö´Â 'K' key¿¡, (C-k)

±×¸®°í ¶§¿¡ µû¶ó¼­

  • ¿Þ¼Õ ÁßÁö´Â 'F' key ¶Ç´Â 'E' key¿¡, (C-e ¶Ç´Â C-f)
  • ¿Þ¼Õ °ËÁö´Â 'B' key ¶Ç´Â 'V' key¿¡, (C-b ¶Ç´Â C-v)
  • ¿Þ¼Õ ¾àÁö´Â 'E' key ¶Ç´Â 'A' key¿¡, (C-e ¶Ç´Â C-a)

Űº¸µå¿¡ µû¶ó ´Ù¸£Áö¸¸,

  • ¿Þ¼Õ ¾öÁö´Â Meta key¿¡,
  • ¿À¸¥¼Õ ¾öÁö´Â Spacebar¿¡

³õ°í ¾²±â ¹Ù¶õ´Ù. ¹°·Ð Ç×»ó ÀÌ·¸°Ô ¼Õ°¡¶ôÀ» À§Ä¡½Ã۶õ °ÍÀº ¾Æ´Ï´Ù. ´ÜÁö À§¿¡ ³ª¿Â ۸¦ ÀÔ·Â ÇÒ ¶§¿¡´Â ÁöÁ¤ÇÑ ¼Õ°¡¶ôÀ¸·Î ÀÔ·ÂÇÏ´Â °ÍÀÌ ÆíÇÒ °ÍÀÌ´Ù. Àͼ÷ÇÑ vi »ç¿ëÀÚµéÀº hjkl key°¡ È­»ìÇ¥º¸´Ù ´õ ÆíÇÏ´Ù°í ÇÏÁö¸¸, ¿ô±â´Â ¼Ò¸®! Emacs°¡ ÈξÀ ÆíÇÏ´Ù! ÀÔ ¾ÆÇÁ´Ù. ½á º¸¸é ¾Ë°ÚÁö..



3. Compiling and Debugging


³»°¡ Emacs¸¦ ¾Ö¿ëÇÏ´Â °¡Àå Å« ÀÌÀ¯´Â compiling/debuggingÀÌ ¾î¶² editorº¸´Ù °­·ÂÇϱ⠶§¹®ÀÌ´Ù. ¹«½¼ ¸»ÀÎÁö Àß ¸ð¸£°ÚÀ¸¸é µû¶óÇØº¸±â ¹Ù¶õ´Ù.

  • X¿¡¼­ terminalÀ» ¶ç¿î ´ÙÀ½ ´ÙÀ½ ¸í·ÉÀ» ½ÇÇàÇÑ´Ù:

 
 $ emacs hello.c & 

  • ±× ´ÙÀ½, °£´ÜÇÑ hello, world ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù, printf()ÀÇ ¸¶Áö¸·¿¡ ';'ÀÌ ºüÁø °ÍÀº ÀϺη¯ ÇÑ °ÍÀÌ´Ï ±×´ë·Î ÀÔ·ÂÇϱ⠹ٶõ´Ù:

  #include <stdio.h>

  int
  main(void)
  {
    printf("hello, world\n")
      return 0;
  }
  • ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§, µé¿©¾²±â¸¦ ÇÒ °æ¿ì, ¸ÛûÇÏ°Ô space¸¦ Ä¡Áö ¸»±â ¹Ù¶õ´Ù.

Emacs´Â ¾Ë¾Æ¼­ µé¿©¾²±â¸¦ ÆÇ´ÜÇØ¼­ ºó Ä­À» ³Ö¾îÁØ´Ù. ¿¹¸¦ µé¾î

  {
  printf("hello, world")

¸¦ ¾´ ´ÙÀ½, printf°¡ ÀÖ´Â ÁÙ¿¡ Ä¿¼­¸¦ À§Ä¡½Ã۰í, tab key¸¦ ´­·¯º¸¶ó. Áß¿äÇÑ °ÍÀº Ä¿¼­°¡ ²À ¸Ç ¾Õ¿¡¸¸ ÀÖÀ» Çʿ䰡 ¾ø´Ù´Â °ÍÀÌ´Ù. Ä¿¼­°¡ ±× ÁÙÀÇ ¾îµð¿¡ ÀÖ´øÁö¿¡ »ó°ü¾øÀÌ tab key¸¦ ´©¸£¸é ¹Ù·Î µé¿©¾²±â¸¦ ¼öÇàÇÏ°Ô µÈ´Ù.

  • ´Ù ÀÛ¼ºÇßÀ¸¸é, ÀÌÁ¦ ÀúÀå(C-x C-s)ÇÏÀÚ.

  • ÀÌÁ¦ compileÇÒ ¶§´Ù. M-x compile <RET>À» Ä¡¸é compile ¸í·ÉÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ°Ô (emacs ¸Ç ¾Æ·¡ÀÇ mini buffer¿¡) ³ª¿À´Âµ¥ ±âº»ÀûÀ¸·Î "make -k "·Î µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. C-a C-k¸¦ ´­·¯ À̰ÍÀ» Áö¿ì°í, gcc hello.c <RET>¸¦ ÀÔ·ÂÇÏÀÚ.

  • ±×·¯¸é ÀÌÁ¦ Emacs âÀÌ µÎ°³·Î ³ª´µ¾îÁö°í, ¹Ý´ëÆí¿¡ compile °á°ú°¡ ³ª¿À°Ô µÈ´Ù. ¾Æ±î ¼Ò½º¸¦ ÀÔ·ÂÇÒ ¶§ ';'¸¦ ºü¶ß·ÈÀ¸¹Ç·Î ´ç¿¬È÷ error°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. C-x `¸¦ ÀÔ·ÂÇϸé Emacs°¡ ÀÚµ¿ÀûÀ¸·Î ù¹øÂ° ¿¡·¯°¡ ¹ß»ýÇÑ °÷À¸·Î Ä¿¼­¸¦ ¿Å°ÜÁØ´Ù. ¿¡·¯°¡ ¿©·¯ °³¶ó¸é C-x `¸¦ °è¼Ó ´­·¯ÁÖ¸é °è¼ÓÇØ¼­ ´ÙÀ½ ¿¡·¯°¡ ¹ß»ýÇÑ °÷À¸·Î Ä¿¼­¸¦ ¿Å°ÜÁØ´Ù. (ÁÖÀÇ: '°¡ ¾Æ´Ï¶ó `ÀÌ´Ù.)

  • ´Ù °íÃÆÀ¸¸é ´Ù½Ã M-x compile<RET>À¸·Î ÄÄÆÄÀÏÇÏÀÚ.

  • ÄÄÆÄÀÏÀÌ ³¡³µÀ¸¸é, C-x o·Î ÄÄÆÄÀÏÇÑ À©µµ¿ì·Î Ä¿¼­¸¦ ¿Å±ä ´ÙÀ½, M-x shell<RET>À» ½ÇÇàÇÏÀÚ. ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇϸé Á¦´ë·Î µ¿ÀÛÇÏ´Â ÇÁ·Î±×·¥À» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù:

  $ ./a.out
  hello, world
  $ _

4. Emacs Debugger Mode (gdb)


Emacs´Â ³»ºÎ¿¡ debugger(gdb)¸¦ ½ÇÇà½Ãų ¼ö ÀÖ´Â ´É·ÂÀÌ ÀÖ´Ù. ¿ø·¡ gdb´Â ¾ÆÁÖ °£´ÜÇÑ user interface¸¸À» °¡Áö°í À־ ¹Ù·Î ¾²±â¿¡´Â ¸Å¿ì ¹ø°Å·Ó´Ù. ±×·¯³ª emacs debugger mode·Î gdb¸¦ µ¹¸®¸é, ¸Å¿ì Æí¸®ÇÏ°Ô ¾µ ¼ö ÀÖ´Ù. ¸ÕÀú ¾Æ·¡ ÇÁ·Î±×·¥À» emacs·Î ÀÛ¼ºÇÏÀÚ.

ÁÖÀÇ: Áö±Ý±îÀÚ Âø½ÇÈ÷ µû¶ó¿Ô´Ù¸é, C-x C-f buggy.c<RET>À» ÀÔ·ÂÇØ¼­ »õ·Î buggy.c¸¦ ÆíÁýÇÏ¸é µÈ´Ù.

  #include <stdio.h>

  void swap(int *, int *);

  int
  main(void)
  {
    int i = 0;
    int j = 1;

    printf("i = %d, j = %d\n", i, j);
    swap(&i, &i);

    printf("i = %d, j = %d\n", i, j);
    return 0;
  }

  static void
  do_swap(int *lhs, int *rhs, int *tmp)
  {
    tmp = 0;
    *tmp = *lhs;
    *lhs = *rhs;
    *rhs = *tmp;
  }

  void
  swap(int *lhs, int *rhs)
  {
    int t;
    do_swap(lhs, rhs, &t);
  }

´Ù ÀÔ·ÂÇßÀ¸¸é C-x C-s¸¦ ´­·¯ ÀúÀåÇϰí, M-x compile<RET>À» ´­·¯ ÄÄÆÄÀÏ ¸í·ÉÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ°Ô µÇ¸é, C-a C-k¸¦ ´­·¯ ±âÁ¸ ÄÄÆÄÀÏ ¸í·ÉÀ» Áö¿ì°í, gcc -g buggy.c<RET>À» ÀÔ·ÂÇØ¼­ ÄÄÆÄÀÏÇÏÀÚ. "-g" ¿É¼ÇÀ» »©¸ÔÁö ¸¶!

±× ´ÙÀ½, ÄÄÆÄÀÏ °á°ú¸¦ º¸¿©Áִ âÀ¸·Î Ä¿¼­¸¦ ¿Å±ä ´ÙÀ½(c-x o), shellÀ» ¶ç¿ì°í(M-x shell<RET>) ½ÇÇàÇØº¸ÀÚ:

  $ ./a.out
  i = 0, j = 1
  Segmentation fault
  $ _

ÁÖÀÇÇÒ °ÍÀº, »óȲ¿¡ µû¶ó¼­ "Segmentation fault"·Î ³¡³ªÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¾Æ¹¸µç Á¤»óÀûÀ¸·Î ³¡³ªÁø ¾ÊÀ» °ÍÀÌ´Ù. ÀÌÁ¦ M-x gdb<RET>À» ´©¸¥ ´ÙÀ½ a.out<RET>À» ÀÔ·ÂÇÏÀÚ.

ÀÌÁ¦ Ä£¼÷ÇÑ (gdb) prompt¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. (¹Ù·Î ¾Õ¿¡¼­ a.out<RET> ´ë½Å ¹Ù·Î <RET>À» ´­·¯ gdb¸¦ ½ÇÇàÇß´Ù¸é, Áö±Ý file a.out<RET>À» ÀÔ·ÂÇÒ ¼öµµ ÀÖ´Ù.)

±× ´ÙÀ½ ¹Ù·Î run<RET>À» ½ÇÇàÇÏÀÚ.

  (gdb) run
  Starting program: /home/cinsk/src/a.out
  i = 0, j = 1

  Program received signal SIGSEGV, Segmentation fault.
  0x0804839e in do_swap ()
  (gdb) _

ÀÌ ¼ø°£ debugger mode ⠹ݴëÂÊ¿¡´Â do_swap() ÇÔ¼öÀÇ ³»¿ëÀÌ ³ª¿À°í, segment fault°¡ ÀϾ ¹Ù·Î ±× ÄÚµå ¾Õ¿¡´Â Á¶±×¸¶ÇÑ Ç¥½Ã(»ï°¢Çü)°¡ ³ª¿Ã °ÍÀÌ´Ù. ¹Ù·Î À̰ÍÀÌ Emacs debugger mode°¡ °¡Áø ±â´É Áß ÇϳªÀÓ. (¸¸¾à Äڵ尡 Ç¥½ÃµÇÁö ¾Ê´Â´Ù¸é ¾Æ±î ÄÄÆÄÀÏÇÒ ¶§ '-g' optionÀ» »©¸ÔÀº °æ¿ìÀ̹ǷΠ´Ù½Ã Çϱ⠹ٶõ´Ù.)

ÀÌÁ¦ bt<RET>À¸·Î ´ëÃæ ÇÁ·Î±×·¥ È帧ÀÌ ¾î¶»°Ô Èê·¯°¡´Â°¡ »ìÆìº¸ÀÚ.

  (gdb) bt
  #0  0x0804839e in do_swap ()
  #1  0x080483ce in swap ()
  #2  0x0804836c in main ()
  #3  0x420156a4 in __libc_start_main () from /lib/tls/libc.so.6
  (gdb) _

Àå´ãÇϰǴë, bugÀÇ 99%´Â ÀÌ backtrace(bt) ¸í·É ¸¸À¸·Îµµ ÃæºÐÈ÷ ÇØ°áÇÒ ¼ö ÀÖ´Ù. À§ÀÇ °á°ú¸¦ º¸¸é, ÀÏ´Ü ³×¹øÂ° ÁÙÀº ¹«½ÃÇϰí, (¼¼¹øÂ° ÁÙ) main()ÀÌ swap()À» ºÒ·¶°í swap()ÀÌ do_swap()À» ºÒ·¶´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. Áï, segment fault°¡ ³­ °÷ÀÌ ¹Ù·Î ÀÌ ±Ùó¶ó´Â °ÍÀ» ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù.

±×·¯¸é br do_swap<RET>À» ÀÔ·ÂÇØ¼­ do_swap()¿¡ breakpoint¸¦ °É°í run<RET>À» ÀÔ·ÂÇØ¼­ ´Ù½Ã ÇÑ ¹ø µ¹·Áº¸ÀÚ.

  (gdb) br do_swap
  Breakpoint 1 at 0x804838f: file buggy.c, line 21.
  (gdb) r
  The program being debugged has been started already.
  Start it from the beginning? (y or n) y
  Starting program: /home/cinsk/src/a.out
  i = 0, j = 1

  Breakpoint 1, do_swap (lhs=0xbfffeb24, rhs=0xbfffeb24, tmp=0xbfffeb04)
      at buggy.c:21
  (gdb) _

ÀÌÁ¦ n<RET>À» ÀÔ·ÂÇØ¼­ next ¸í·ÉÀ» ¼öÇàÇÏ¸é ¼Ò½º ÄÚµå ¿ÞÆí¿¡ ÄÚµåÀÇ È帧À» ³ªÅ¸³»´Â »ï°¢Çü Ç¥½Ã°¡ ´ÙÀ½ ÁÙÀ» °¡¸®Å°´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. n<RET> ´ë½Å C-c C-nÀ» ½á¼­ next ¸í·ÉÀ» ¼öÇàÇÒ ¼öµµ ÀÖ´Ù. ±×·³ step ¸í·É ´ÜÃàŰ´Â ¹«¾ùÀϱî? °õÀÌ ¾Æ´Ï¶ó¸é C-c C-sÀÎ °ÍÀ» ÁüÀÛÇÒ ¼ö ÀÖÀ»Å×´Ï ³Ñ¾î°£´Ù.

   {
     tmp = 0;
  >  *tmp = *lhs;
     *lhs = *rhs;
     *rhs = *tmp;
   }

¿©±â±îÁö ¿Ô°í, ¶Ç Emacsâ¿¡ º¸ÀÌ´Â ¼Ò½º¸¦ º¸¸é ¹Ù·Î ¹«¾ùÀÌ À߸øµÈ °ÍÀÎÁö ±Ý¹æ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. Àû¾îµµ C ¾ð¾î°¡ ¼­ÅøÁö ¾Ê´Â´Ù¸é. ±×·³ "tmp = 0"À» Áö¿ì°í, (ÇöÀç Ä¿¼­°¡ debugger mode â¿¡ À§Ä¡Çϰí ÀÖÀ»Å×´Ï, C-x o¸¦ ´­·¯¼­ ¼Ò½º°¡ ³ª¿ÍÀÖ´Â ¹Ý´ëÆí âÀ¸·Î Ä¿¼­¸¦ ¿Å±ä ´ÙÀ½, Ä¿¼­¸¦ "tmp = 0;" ÁÙ¿¡ À§Ä¡½Ã۰í C-a C-k C-k¸¦ ´­·¯¼­ ±× ÁÙÀ» Áö¿î´Ù.) C-x C-s¸¦ ´­·¯ ÀúÀåÇÑ´Ù. ±× ´ÙÀ½À¸·Î, ÄÄÆÄÀÏÇÑ ´ÙÀ½(M-x compile<RET><RET>), ¹Ý´ëÆí âÀ¸·Î ³Ñ¾î°¡¼­(C-x o), gdb ¹öÆÛ·Î ÀüȯÇÑ´Ù (C-x b<RET>).

»õ·Î ÄÄÆÄÀÏÇßÀ¸¹Ç·Î »õ·Î ÆÄÀÏÀ» Àоî¿Í¾ß ÇÑ´Ù. gdb prompt¿¡¼­ "file a.out<RET>"À» ÀÔ·ÂÇØ¼­ ´Ù½Ã ½ÇÇà ÆÄÀÏÀ» Àоî¿Â´Ù:

  (gdb) file a.out
  A program is being debugged already.  Kill it? (y or n) y

  Load new symbol table from "a.out"? (y or n) y
  Reading symbols from a.out...done.
  (gdb) _

±×¸®°í ´Ù½Ã run ½ÃÄѼ­(r <RET>), do_swapÀÇ ³»¿ëÀ» À¯½ÉÈ÷ ¹Ù¶óº¸±â ¹Ù¶õ´Ù.

  (gdb) r
  Starting program: /home/cinsk/src/a.out
  i = 0, j = 1

  Breakpoint 1, do_swap (lhs=0xbfffda34, rhs=0xbfffda34, tmp=0xbfffda14)
      at buggy.c:21
  (gdb) _

ÀÏ´Ü, do_swap()¿¡ Àü´ÞµÈ óÀ½ µÎ°³ÀÇ ÀÎÀÚ, lhs¿Í rhs°¡ °°Àº ÁÖ¼Ò¸¦ °¡¸®Å°°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. gdb print ¸í·É(p)À¸·Î ÀÚ¼¼È÷ ÀÎÀÚ °ªµéÀ» Á¶»çÇØº¸ÀÚ.

  (gdb) p *lhs
  $1 = 0
  (gdb) p *rhs
  $2 = 0
  (gdb) p lhs
  $3 = (int *) 0xbfffda34
  (gdb) p rhs
  $4 = (int *) 0xbfffda34
  (gdb) _

¹«¾ùÀÌ ¹®Á¦Àϱî? do_swap()À» ºÎ¸¥ ÇÔ¼ö°¡ ù¹øÂ° ÀÎÀÚ¿Í µÎ¹øÂ° ÀÎÀÚ¿¡ °°Àº ÁÖ¼Ò¸¦ ³Ñ°ÜÁØ °ÍÀÌ´Ù! ´Ù½Ã Çѹø backtrace ¸í·É(bt)À¸·Î call stackÀ» Á¶»çÇØº¸ÀÚ:

  (gdb) bt
  #0  do_swap (lhs=0xbfffda34, rhs=0xbfffda34, tmp=0xbfffda14) at buggy.c:21
  #1  0x080483c7 in swap (lhs=0xbfffda34, rhs=0xbfffda34) at buggy.c:30
  #2  0x0804836c in main () at buggy.c:12
  #3  0x420156a4 in __libc_start_main () from /lib/tls/libc.so.6
  (gdb) _

¾ÆÇÏ! À§¸¦ Àß »ìÇǸé buggy.cÀÇ 30¹øÂ° ÁÙ¿¡ ÀÖ´Â swap ÇÔ¼ö°¡ do_swap()À» ºÒ·¶´Âµ¥, ±× ¶§ do_swap()¿¡ Àü´ÞµÈ óÀ½ µÎ ÀÎÀÚ°¡ °°Àº ÁÖ¼Ò°ªÀ» ³Ñ°ÜÁá´Ù´Â °ÍÀ» È®½ÇÈ÷ ¾Ë ¼ö ÀÖ´Ù. ¸¶Âù°¡Áö·Î main()ÀÌ swap()À» ºÎ¸¦ ¶§ °°Àº ÁÖ¼Ò°ªÀ» ³Ñ°Ü ÁØ °Íµµ ¾Ë ¼ö ÀÖ´Ù.

ÀÌÁ¦ stack frameÀ» ÇÑ ´Ü°è ¿Ã¶ó°¡´Â up ¸í·É(up)À» ½ÇÇà½ÃŰÀÚ.

  (gdb) up
  #1  0x080483c7 in swap (lhs=0xbfffda34, rhs=0xbfffda34) at buggy.c:30
  (gdb) _

ÀÌ ¶§, ¼Ò½º â¿¡´Â Ä¿¼­°¡ swap() ÇÔ¼öÀÇ 30¹øÂ° ÁÙ·Î À̵¿ÇÑ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. (Emacs debugger modeÀÇ ¶Ç Çϳª ÁÁÀº ±â´É!)

swap()¿¡ º° ÀÌ»óÀÌ ¾øÀ¸¹Ç·Î ´Ù½Ã up ¸í·ÉÀ¸·Î ÇÑ ´Ü°è ¿Ã¶ó°¡ÀÚ.

  (gdb) up
  #2  0x0804836c in main () at buggy.c:12
  (gdb) _

ÀÌÁ¦ Ä¿¼­´Â main() ÇÔ¼ö¿¡¼­ swap()À» ºÎ¸¥ ÁÙ (12¹øÂ° ÁÙ)À» °¡¸®Å°°í ÀÖÀ» °ÍÀÌ´Ù. ÀÚ ¿©±â¼­ ¹ö±× ¹ß°ß!

  swap(&i, &i);
¸¦, ¾Æ·¡¿Í °°ÀÌ ¹Ù²Û´Ù:

  swap(&i, &j);
ÀÚ, ÀÌÁ¦ ´Ù½Ã ¹Ýº¹ ÀÛ¾÷¸¸ ³²¾Ò´Ù. ÀúÀåÇϰí(C-x C-s), ÄÄÆÄÀÏÇϰí(M-x compile), shellÀ» ¶ç¿ö¼­(M-x shell) ½ÇÇà ÆÄÀÏ ½ÇÇàÇØº¸°í, ÀÌ»óÀÌ ¾ø´Â°¡ È®ÀÎÇØº¸ÀÚ.

¿©±â±îÁö Emacs debugger mode¿¡¼­ gdb¸¦ ¾²´Â ¹ýÀ» ¾ÆÁÖ °£´ÜÈ÷ ÈÈ¾î º¸¾Ò´Ù. Á» ´õ ÀÚ¼¼ÇÑ ³»¿ëÀ» ¿øÇÑ´Ù¸é:

  • Emacs debugger mode â¿¡ Ä¿¼­¸¦ À§Ä¡½Ã۰í M-x describe-mode<RET>À» ÃÄ º¸±â ¹Ù¶õ´Ù. ±×·¯¸é ¹Ý´ëÆí â¿¡ Emacs debugger mode¿¡ °üÇÑ ¼³¸íÀÌ ³ª¿Ã °ÍÀÌ´Ù.

  • Emacs Info page¸¦ Âü°íÇ϶ó. Å͹̳ο¡¼­ "info emacs"¸¦ ÃÄ ³Ö°í, building->debugger Ç׸ñÀ» º¸¶ó. ¶Ç´Â Emacs¿¡¼­ M-x info¸¦ ½ÇÇà, emacs->building->debugger Ç׸ñÀ» ºÁµµ µÈ´Ù. (ÈÄÀÚ¸¦ ±ÇÀåÇÔ)

  • gdb info page¸¦ Âü°íÇ϶ó. À§¿Í ¸¶Âù°¡Áö·Î stand-alone programÀÎ info¸¦ ½áµµ µÇ°í, M-x info¸¦ ¾µ ¼öµµ ÀÖ´Ù.

5. etags

etags¿Í emacsÀÇ °ü°è´Â ctags¿Í viÀÇ °ü°è¶ó ÇÒ ¼ö ÀÖ´Ù. etags´Â ¿©·¯ ¾ð¾î ÆÄÀϵéÀ» Àоî tag tableÀ» ¸¸µé¾îÁÖ¸ç, emacs¿¡¼­ ÀÌ tag tableÀ» ¹ÙÅÁÀ¸·Î sourceµéÀ» ÀÚÀ¯·ÎÀÌ navigate ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ÁÖ¾îÁø ÇÔ¼ö À̸§À¸·Î ÇÔ¼öÀÇ Á¤ÀǸ¦ ã´Â´Ù´ÂÁö, º¯¼ö À̸§ÀÌ ¾²ÀÎ °÷À» ã´Â µîÀÇ ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù.

ÀÏ´Ü ¼Ò½º µð·ºÅ丮 ·çÆ®¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ¿©·¯ºÐÀÌ ÀÛ¾÷ ÁßÀÎ ¼Ò½º°¡ ÀÖ´Ù¸é ±× ¼Ò½º¸¦ ½á º¸±â¸¦ ±ÇÀåÇϰí, ±×·¸Áö ¾Ê´Ù¸é ÀϹÝÀûÀ¸·Î /usr/src/linux¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â Linux kernel source¸¦ ½á º¸ÀÚ. ¿©±â¼­´Â /usr/src/linux¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â Linux kernel source¸¦ °¡Áö°í ¿¹¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.

ÀÏ´Ü etags´Â ÀÛ¾÷ °á°ú¸¦ ÇöÀç µð·ºÅ丮¿¡ `TAGS'¶ó´Â ÆÄÀÏ·Î ±â·ÏÇÑ´Ù.

ÁÖÀÇ! ÀÌ ±ÛÀº /usr/src/linux¸¦ ´ë»óÀ¸·Î Çϱ⠶§¹®¿¡, ÀÏ¹Ý »ç¿ëÀÚ´Â ÀÌ µð·ºÅ丮¿¡ ¾²±â ±ÇÇÑÀÌ ¾øÀ» °ÍÀÌ´Ù. µû¶ó¼­ etag °ü·Ã ÀÛ¾÷À» ÇÏ·Á¸é root·Î ÀÛ¾÷ÇÏ´øÁö, ¾Æ´Ï¸é, ÇöÀç µð·ºÅ丮¸¦ ´Ù¸¥ °÷À¸·Î ¹Ù²Ù¾î¾ß ÇÒ °ÍÀÌ´Ù.

etags°¡ ¼Ò½º ÆÄÀÏÀ» ºÐ¼®ÇÒ ¶§ ÇöÀç µð·ºÅ丮¸¸ ´ë»óÀ¸·Î Çϱ⠶§¹®¿¡ °ÅÀÇ ¸ðµç °æ¿ì find ¸í·É°ú ÇÔ²² ¾´´Ù:

  $ pwd
  /home/cinsk/src
  $ find -H /usr/src/linux -name '*.[csSh]' | etags -

Áï find ¸í·ÉÀÌ /usr/src/linux¿¡ ÀÖ´Â *.c *.s *.S *.h¿¡ ´ëÇÑ ¸ñ·ÏÀ» etags¿¡ ÆÄÀÌÇÁ·Î ³Ñ±â¸é, etags´Â À̸¦ stdinÀ¸·Î ¹Þ¾Æ¼­, ÇöÀç µð·ºÅ丮¿¡ TAGS¶õ ÆÄÀÏ·Î (ÀÌ ¿¹¿¡¼­´Â /home/cinsk/src/TAGS) ±â·ÏÇÑ´Ù.

root »ç¿ëÀÚ¶ó¸é ´ÙÀ½°ú °°ÀÌ /usr/src/linux/TAGS·Î ±â·ÏÇÏ´Â °ÍÀÌ ´õ ÆíÇÒ °ÍÀÌ´Ù:

  # cd /usr/src/linux
  # find . -name '*.[csSh]' | etags -

ÀÌÁ¦ emacs¿¡¼­ ÇÑ ¼Ò½º ÆÄÀÏÀ» ºÒ·¯¿ÀÀÚ. C-x C-f·Î /usr/src/linux/include/linux/sched.h¸¦ ºÒ·¯¿ÀÀÚ.

±× ´ÙÀ½ ÀûÀýÇÑ ÇÔ¼ö À̸§À» Çϳª ã¾Æº¸ÀÚ (¿¹¸¦ µé¾î C-s sched_initÀ¸·Î sched_init() ÇÔ¼öÀÇ ¼±¾ðÀ» ãÀ» ¼ö ÀÖ´Ù).

Ä¿¼­¸¦ sched_init¿¡ À§Ä¡½Ã۰í, M-.¸¦ ´­·¯º¸ÀÚ. ±×·¯¸é mini-buffer¿¡ ´ÙÀ½°ú °°ÀÌ ¸Þ½ÃÁö°¡ º¸ÀδÙ:

  Find tag: (default sched_init) _

Áï ´Ù¸¥ À̸§À» ÀÌ °÷¿¡ ½á ³ÖÀ» ¼öµµ ÀÖ°í, ¹Ù·Î <RET>À» Ä¡¸é default °ªÀÎ `sched_init'À» ¾²°Ô µÈ´Ù.

¾ÆÁ÷ emacs¿¡°Ô tag tableÀÎ TAGS°¡ ¾îµð¿¡ ÀÖ´ÂÁö ¾Ë·ÁÁÖÁö ¾Ê¾ÒÀ¸¹Ç·Î emacs´Â tag tableÀÇ À§Ä¡¸¦ ¹¯°Ô µÈ´Ù. À̶§ ¾Æ±î TAGS°¡ ÀúÀåµÇ¾î ÀÖ´Â °÷À» ½á ÁÖ¸é, emacs´Â ÀÚµ¿À¸·Î sched_init() ÇÔ¼ö°¡ À§Ä¡ÇÑ °÷À» º¸¿©ÁØ´Ù.

¸¸¾à emacs°¡ º¸¿©ÁØ ¼Ò½º°¡ ¿øÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó¸é ´ÙÀ½ µÎ ¸í·ÉÀ¸·Î °°Àº À̸§À¸·Î °è¼Ó ãÀ» ¼ö ÀÖ´Ù:

Ű ÀÔ·Â ¼³¸í
C-u M-. ´ÙÀ½À¸·Î matchµÇ´Â tag¸¦ º¸¿©ÁØ´Ù.
C-u - M-. ÀÌÀü¿¡ ãÀº tag¸¦ º¸¿©ÁØ´Ù.

³ª´Â À§ÀÇ ´ÜÃà۸¦ º°·Î ÁÁ¾ÆÇÏÁö ¾Ê¾Æ¼­ ´ÙÀ½ ³× ÁÙÀ» $HOME/.emacs¿¡ ±â·ÏÇÏ¿©, "C-u M-.", "C-u - M-." ´ë½Å "M-]", "M-["À» ¾´´Ù:

  (fset 'find-next-tag "\C-u\256")        ; macro for C-u M-.
  (fset 'find-prev-tag "\C-u-\256")       ; macro for C-u - M-.
  (global-set-key "\M-]" 'find-next-tag)
  (global-set-key "\M-[" 'find-prev-tag)

tag¿¡ °üÇÑ Á» ´õ ÀÚ¼¼ÇÑ »çÇ×Àº emacs info ÆäÀÌÁöÀÇ Tags sectionÀ» º¸±â ¹Ù¶õ´Ù.

6. cscope

emacs/etagsµµ ²Ï ¾µ¸¸ÇÑ ¼Ò½º Ž»ö ±â´ÉÀ» Á¦°øÇÏÁö¸¸ emacs/cscope´Â ÇÑÃþ ´õ ¹ßÀüµÈ ¼Ò½º Ž»ö ±â´ÉÀ» Á¦°øÇÑ´Ù. emacs/etags°¡ emacsÀÇ built-in package Çü½ÄÀÎ ¹Ý¸é, cscope´Â º°µµÀÇ ÆÐŰÁö¸¦ ¼³Ä¡ÇØ¾ß ÇϹǷΠÁ¶±Ý ¹ø°Å·Ó´Ù.

ÀÏ´Ü cscopeÀÇ È¨ÆäÀÌÁö¿¡ °¡¼­ cscope¸¦ ¼³Ä¡ÇÏÀÚ -- http://cscope.sourceforge.net/

´ÙÀ½À¸·Î ¼³Ä¡ÇÏ´Â °úÁ¤À» ¾Æ·¡¿¡ º¸Àδ٠(¾Æ·¡¿¡¼­ X.Y´Â cscopeÀÇ ¹öÀü¿¡ µû¶ó ´Ù¸§, ÇöÀç 15.4).

  # tar -xvzf cscope-X.Y.tar.gz
  # cd cscope-X.Y
  # ./configure
  # make install

"make install"À» Çϱâ À§Çؼ­´Â root·Î ·Î±äÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½À¸·Î À§¿¡ À̾ ´ÙÀ½°ú °°Àº °úÁ¤µµ ÇÊ¿äÇÏ´Ù.

  # cd contrib
  # cd xcscope
  # cp cscope-indexer /usr/local/bin
  # cp xcscope.el /usr/share/emacs/site-lisp/

À§ °úÁ¤¿¡¼­ /usr/share/emacs/site-lisp/ÀÇ À§Ä¡´Â emacs°¡ ¼³Ä¡µÈ °÷¿¡ µû¶ó ´Ù¸£Áö¸¸, emacs -batch ¸í·ÉÀ» ¼öÇàÇØ¼­ ÈùÆ®¸¦ ¾òÀ» ¼ö ÀÖ´Ù:

  $ emacs -batch
  Loading /usr/share/emacs/site-lisp/site-start.d/aspell-init.el (source)...
  Loading /usr/share/emacs/site-lisp/site-start.d/lang.emacs.el (source)...
  Loading /usr/share/emacs/site-lisp/lang/lang-ko.el (source)...
  Loading /usr/share/emacs/site-lisp/site-start.d/po-mode-init.el (source)...
  $ _

Âü°í ÀÌ´Â system-wide ¼³Á¤ ¹æ¹ýÀ̸ç, root ±ÇÇÑÀ» ¾òÀ» ¼ö ¾ø´Ù¸é cscope¸¦ ¿©·¯ºÐÀÇ µð·ºÅ丮¿¡ ¼³Ä¡Çϰí (¾Æ±î ¼³Ä¡ÇÒ ¶§ "./configure --prefix=$HOME"À» ¾´´ÙµçÁö..), cscope-indexerµµ ¿©·¯ºÐÀÇ $PATH¿¡ µé¾î ÀÖ´Â °÷, ¿¹¸¦ µé¸é $HOME/bin¿¡ ¼³Ä¡Çϰí, ¸¶Áö¸·À¸·Î `xcscope.el'µµ emacs load path¿¡ Ãß°¡ÇØ¾ß ÇÑ´Ù; emacs load path¿¡ °üÇÑ °ÍÀº 1À» Âü°íÇϱ⠹ٶõ´Ù.

¸¶Áö¸·À¸·Î ¾Æ±î º¹»çÇÑ `xcscope.el'À» ¿­¾î¼­ Àо°í ¾î¶»°Ô $HOME/.emacs ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß ÇÏ´ÂÁö Àо°í Àû¿ëÇϱ⠹ٶõ´Ù.

¿©±â±îÁö ³¡³µ´Ù¸é emacs¸¦ ½ÇÇà½ÃŰÀÚ.

cscope°¡ Á¦´ë·Î µ¿ÀÛÇϱâ À§Çؼ­´Â cscope database¸¦ ¸¸µé¾î¾ß ÇÑ´Ù; emacs¿¡¼­ M-x cscope-index-file<RET>À» ÀÔ·ÂÇÏ°í ¿øÇÏ´Â µð·ºÅ丮(/usr/src/linux)¸¦ ÀÔ·ÂÇÑ´Ù. (Âü°í. /usr/src/linux´Â ²Ï Å« ¼Ò½ºÀ̹ǷΠ»ó´çÇÑ ½Ã°£ÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù.)

À§ ÀÛ¾÷ÀÌ ³¡³µ´Ù¸é /usr/src/linux/¿¡ cscope.out°ú cscope.files¶ó´Â ÆÄÀÏÀÌ ¸¸µé¾î Áú °ÍÀÌ´Ù.

ÀÌÁ¦ etags¸¦ ¹è¿ï¶§¿Í ¸¶Âù°¡Áö·Î /usr/src/linux/include/linux/sched.h¸¦ ¿­ÀÚ(C-x C-f). ´ÙÀ½À¸·Î sched_init¿¡ Ä¿¼­¸¦ À§Ä¡½Ã۰í "C-c s d"·Î ¿øÇÏ´Â Á¤ÀǸ¦ ãÀ» ¼ö ÀÖ´Ù (¾Æ·¡ ´ÜÃàŰ Âü°í).

  • Å͹̳Π¸ðµå°¡ ¾Æ´Ñ emacs¸¦ ¾²°í ÀÖ´Ù¸é ¼Ò½º ÆÄÀÏÀ» ÆíÁýÇÒ ¶§ ¸Þ´º¿¡ cscope ¸Þ´º°¡ ¶ß´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ¿©±â¼­ cscope °ü·Ã ¸í·ÉÀ» ½ÇÇàÇÒ ¼öµµ ÀÖ´Ù (´ÜÃà۸¦ ¿Ü¿ì´Â °ÍÀÌ ½È´Ù¸é..)

  • ±âº»ÀûÀ¸·Î ´ÙÀ½°ú °°Àº ´ÜÃà۵éÀÌ Á¦°øµÈ´Ù (ÀÚ¼¼ÇÑ °ÍÀº `xcscope.el'ÀÇ ÁÖ¼®À» ²À!!!! ÇÑ ¹ø Àо±â ¹Ù¶õ´Ù):

Ű ÀÔ·Â ¼³¸í
C-c s s Find symbol.
C-c s d Find global definition.
C-c s g Find global definition (alternate binding).
C-c s G Find global definition without prompting.
C-c s c Find functions calling a function.
C-c s C Find called functions (list functions called from a function).
C-c s t Find text string.
C-c s e Find egrep pattern.
C-c s f Find a file.
C-c s i Find files #including a file.

etags/cscope¸¦ Àß ¾²±â¸¸ Çϸé À¢¸¸ÇÑ source ºÐ¼®Àº ¹«³­È÷ ÇØ°áÇÒ ¼ö ÀÖÁö¸¸, Á» ´õ °­·ÂÇϰųª ÆíÁý ±â´É º¸´Ù source ºÐ¼® Àü¿ë ÅøÀ» ã°í ÀÖ´Ù¸é, ¾Æ·¡ ÅøÀ» ½á º¸±â ¹Ù¶õ´Ù:



ID
Password
Join
You will have good luck and overcome many hardships.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-12-28 16:32:57
Processing time 0.0154 sec