· 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
Creditors have much better memories than debtors.


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.0162 sec