<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>먼가 좀 설렁설렁한</title>
	<link>http://jongsuknim.egloos.com</link>
	<description>프로그래밍을 해봅시다.
</description>
	<language>ko</language>
	<pubDate>Sun, 21 Dec 2008 03:15:57 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>먼가 좀 설렁설렁한</title>
		<url>http://md.egloos.com/img/samplelogo2.gif</url>
		<link>http://jongsuknim.egloos.com</link>
		<width>80</width>
		<height>80</height>
		<description>프로그래밍을 해봅시다.
</description>
	</image>
  	<item>
		<title><![CDATA[ 프로그래밍에서 가장 중요한것 ]]> </title>
		<link>http://jongsuknim.egloos.com/2160722</link>
		<guid>http://jongsuknim.egloos.com/2160722</guid>
		<description>
			<![CDATA[ 
  프로그래밍에서 가장 중요한것은 "얼마나 생각이 깔끔하고 잘 정의되어있는가.." 라고 생각한다.<br />
<br />
코딩은 이것을 컴퓨터로 돌리기 위한 수단이다.<br />
<br />
코딩이 익숙치 못하다면, 이것을 언어로 변경하는데 많은 시간이 걸린다.<br />
<br />
하지만, 코딩에 어느정도 익숙하다면 더이상 코딩이 (자기 실력향상을 위해) 의미가 있을까? <br />
<br />
어짜피 코딩에 실수가 없다면 자기 생각대로 돌아가기 마련이다. <br />
<br />
<br />
<br />
그렇기 때문에 실제 코딩을 하지 않으면서도, 그리고 컴퓨터와 무관한 책을 보면서도 프로그래밍 실력을<br />
<br />
향상 시킬 수 있다고 생각한다. <br />
<br />
<br />
<br />
lisp으로 프로그래밍을 하다보니,<br />
<br />
자신의 생각대로 프로그래밍을 맞추다 보니<br />
<br />
문득 이런 생각도 든다.<br />
<br />
<br />
			 ]]> 
		</description>

		<comments>http://jongsuknim.egloos.com/2160722#comments</comments>
		<pubDate>Sun, 21 Dec 2008 03:15:57 GMT</pubDate>
		<dc:creator>브루스팍</dc:creator>
	</item>
	<item>
		<title><![CDATA[ find-tag 기능 변경하기 (3 완결편) js-find-tag 만들고 emacs에 적용하기  ]]> </title>
		<link>http://jongsuknim.egloos.com/1775812</link>
		<guid>http://jongsuknim.egloos.com/1775812</guid>
		<description>
			<![CDATA[ 
  <br />
<font size="4">1. find-tag-default를 이용하여 js-find-tag-default 만들기</font><br />
<br />
find-tag-default 리턴값에 단어 시작위치를 같이 리턴하도록 변경한 것이 바로 js-find-tag-default입니다.<br />
리스트 형태로 묶어서 리턴합니다. <br />
<br />
아래와 같이 변경합니다.<br />
<br />
(defun js-find-tag-default ()<br />
&nbsp; (save-excursion <br />
&nbsp;&nbsp;&nbsp; (while (looking-at "\\sw\\|\\s_")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forward-char 1))<br />
&nbsp;&nbsp;&nbsp; (if (or (re-search-backward "\\sw\\|\\s_"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;(save-excursion (beginning-of-line) (point))<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; (re-search-forward "\\(\\sw\\|\\s_\\)+"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (save-excursion (end-of-line) (point))<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (goto-char (match-end 0))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list&nbsp;<span style="color: rgb(255, 102, 102);"> ; 추가된 부분. 리턴값은 단어와 단어 시작위치로 이루어진 리스트 형태입니다.</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (buffer-substring-no-properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (forward-sexp -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (looking-at "\\s'")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forward-char 1))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq b-point (point))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point)))&nbsp;<span style="color: rgb(255, 102, 102);"> ; 단어 </span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point)))<span style="color: rgb(255, 102, 102);"> ; 추가된 부분, 단어 시작위치 &nbsp;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nil)))<br />
<br />
<br />
<br />
<br />
<font size="4"><br />
2. js-find-tag 만들기<br />
</font><br />
js-find-tag는 find-tag-default-function에 등록될 함수 입니다. 즉, default tag를 찾기 위해 가장 먼저 호출되는 함수 입니다. <br />
<br />
내부에서 js-find-tag-default를 호출하여 단어와 시작 위치를 얻은다음, 단어 시작위치가 "::"인 경우에는 커서를 앞으로 이동시켜서 다시 js-find-tag를 호출합니다. <br />
<br />
(defun js-find-tag()<br />
&nbsp; (let* ((result (js-find-tag-default))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (word (car&nbsp; result))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (s-point (car (cdr result)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (s-string (buffer-substring-no-properties (- s-point 2) s-point)))<br />
&nbsp;&nbsp;&nbsp; (if (string= (substring mode-name 0 3) "C++") <span style="color: rgb(255, 102, 102);">;현재 버퍼가 c++-mode일때만 동작합니다. </span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond ((string= s-string "::") <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (save-excursion <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (goto-char (- s-point 3))<span style="color: rgb(255, 102, 102);"> ; 커서를 "::" 앞으로 이동시킵니다.</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (concat (js-find-tag) "::" word)))) <span style="color: rgb(255, 102, 102);">; 커서를 앞으로 이동시킨후 다시 js-find-tag를 호출합니다. </span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (t word)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (find-tag-default))))<br />
<br />
<br />
<br />
<br />
<font size="4">3. find-tag-default-function에 등록하기<br />
</font><br />
(setq find-tag-default-function #'js-find-tag)<br />
<br />
<br />
<br />
<font size="4"><br />
4. 자신의 emacs에서 동작되게 만들기<br />
<br />
</font>1. 위의 3함수를 하나의 파일에 넣고 이름을 정합니다. 여기선 js-find-tag.el이라고 하겠습니다. 마지막의 .el 을 붙여 주어야 합니다. <br />
<br />
2. js-find-tag.el을 적당한 디렉토리에 넣습니다. 여기선 ~/emacs.elisp에 넣었다고 하겠습니다.<br />
<br />
3. 자신의 .emacs파일을 열고, 적당한 위치에 (load "~/emacs.elisp/js-find-tag") 이와 같이 적어 줍니다.&nbsp; js-find-tag에 .el을 붙이지 않습니다. <br />
<br />
4. 끝.. 이제 c++-mode인 경우 자동적으로 적용됩니다. <br />
<br />
5. 이 프로그램이 제대로 동작하게 하기위해선 ctags를 통해서 tag를 생성시킬때 아래와 같은 옵션을 통해서 TAG파일을 생성해야 합니다.<br />
--extra=+q <br />
이 옵션을 줄 경우엔 className::memberFunction 형식으로 TAG파일이 생성됩니다. <br />
<span style="color: rgb(255, 102, 102);"><br />
</span><br />
<br />
<br />
<font size="4">5. 마무리 하며..<br />
</font><br />
정말 간단한 프로그램인데도 만만치 않군요.. <br />
<br />
그래도 글로 작성하니 뭔가 정리가 되는듯한.. ^^;;<br />
<br />
어쨋든 드뎌 첫 emacs 프로그램을 완성했습니다.&nbsp; ㅎㅎ .. 근데 함수 및 변수 이름이 좀 맘에 안드네요.. 참고로 js는 제 이니셜입니다. ㅋ <br />
<br />
find-tag를 워낙 많이 쓰다 보니 더 손대고 싶은 부분이 많은데, 앞으로도 계속 find-tag 관련해서 프로그램을 작성할 생각입니다. &nbsp;<br />
<br />
가장 힘든 단계는 지난듯 하니, 앞으론 좀 쉽게 할 수 있겠죠..ㅋ<br />
<br />
<br />
			 ]]> 
		</description>
		<category>Emacs Lisp</category>

		<comments>http://jongsuknim.egloos.com/1775812#comments</comments>
		<pubDate>Sat, 01 Mar 2008 06:52:17 GMT</pubDate>
		<dc:creator>브루스팍</dc:creator>
	</item>
	<item>
		<title><![CDATA[ find-tag 기능 변경하기 (2) find-tag-default 분석하기  ]]> </title>
		<link>http://jongsuknim.egloos.com/1775746</link>
		<guid>http://jongsuknim.egloos.com/1775746</guid>
		<description>
			<![CDATA[ 
  <font size="4">1. find-tag-default 소스를 봐야겠군요..</font><br />
<br />
find-tag-default는 현재 find-tag함수에서 default 값을 리턴할때 사용하는 함수입니다.&nbsp; 제가 불만을 가진 함수 이기도 하죠.. 어쨋든 이것이 하는 일은 버퍼의 커서가 위치한 단어를 읽어서 리턴하는 것입니다.<br />
<br />
제가 작성할 프로그램도 내부에서 find-tag-default와 비슷한 기능을 분명 필요로 할 것이기 때문에 먼저 find-tag-defaul를 분석해야 할 것 같습니다. <br />
<br />
<br />
제가 만든 프로그램은 아래와 같은 방식으로 동작하게 될 것입니다. <br />
<br />
b::add 라는 내용이 버퍼에 있습니다. 커서는 add에 위치하고 있습니다. 이때, find-tag-default를 수행하면 add를 리턴합니다. <br />
그리고 다시한번 검사를 하는 겁니다. 만약 add앞의 문자가 "::"라면, 커서를 b로 이동 시킨다음에 다시 find-tag-default를 호출하는 것입니다. <br />
그러면 b를 리턴할 것입니다. 이 둘을 "::"와 concat해서 리턴하는 것입니다. 그러면 b::add가 되겠죠.. <br />
<br />
여기서 find-tag-default는 string자체만 리턴하지 단어의 위치는 리턴하지 않기 때문에, 약간수정해서 단어, 단어의 시작 위치를 리턴하게 할 생각입니다. <br />
<br />
<br />
<br />
<font size="4">2. find-tag-default에서 쓰인 함수들 정리.<br />
<br />
</font>find-tag-default 함수의 소스는 '/usr/share/emacs-21.3/lisp/progmodes/etags.el' 의 768째 줄에 있었습니다. 참고하세요.<br />
<br />
(defun find-tag-default ()<br />
&nbsp; (save-excursion<br />
&nbsp;&nbsp;&nbsp; (while (looking-at "\\sw\\|\\s_")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forward-char 1))<br />
&nbsp;&nbsp;&nbsp; (if (or (re-search-backward "\\sw\\|\\s_"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;(save-excursion (beginning-of-line) (point))<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; (re-search-forward "\\(\\sw\\|\\s_\\)+"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (save-excursion (end-of-line) (point))<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t))<br />
&nbsp;&nbsp; &nbsp;(progn (goto-char (match-end 0))<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (buffer-substring-no-properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (forward-sexp -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (looking-at "\\s'")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forward-char 1))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point))))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nil)))<br />
<br />
save-excursion : save-excursion내에서 변경된 커서의 위치는 save-excursion을 빠져 나가면서 이전 커서의 위치로 복구 됩니다.<br />
<br />
looking-at :&nbsp; 커서 아래 위치한 text가 regexp를 만족하는지 여부를 리턴(t or nil) 합니다. <br />
<br />
forward-char : 커서를 앞으로 한칸 이동합니다. <br />
<br />
C-h f : 함수 description을 출력합니다. <br />
<br />
re-search-backward 의 함수 description을보면 아래와 같습니다.&nbsp; 함수 description을 보기위한 단축키는 C-h f입니다. <br />
(re-search-backward "regexp" optional limit-of-search what-to-do-if-search-fails repeat-count)<br />
:거꾸로 가면서 regexp 찾음.&nbsp; 두번째 인자부터는 옵셔널임(없어도 됨)<br />
어디까지 탐색할지 location 값 (2번째 인자), 찾으면 머할지 (3번째 인자). 반복횟수(4번째 인자)<br />
<br />
re-search-forward는 re-search-backward와 탐색 방향만 다름니다.<br />
<br />
정규식 문자에서 \\두개 붙은것은 \붙은것과 같은 의미입니다. 문자열에서 \는 특별한 의미로 사용되기 때문에 \\을 사용합니다. <br />
여기서 \sw 와 \s_가 나옵니다. 이것은 emacs의 syntax table의 syntax class와 관련이 있습니다. <br />
대충 \sw는 w(word constituent) syntax class에 속하냐 를 묻는것이고, \s_ 은 _(symbol constituent) syntax class에 속하는지 묻는것입니다. <br />
syntax table은 버퍼가 현재 어떤 mode에 있는지에 따라 틀립니다. <br />
\s_의 경우를 예를 들어 보겠습니다. <br />
c++인 경우는 문자 이외에 simbol을 형성할 수 있는게 오직 "_"밖에 없습니다. 하지만 lisp인 경우엔 ".?:-_"등 많죠.. <br />
그렇기 때문에 c++-mode인 경우와 emacs-lisp-mode인 경우 각각 다른 \s_를 적용할 수 있는 것입니다. <br />
<br />
예를 들면, a::add의 경우 c++-mode에서는 :문자가 \s_가 아니기 때문에 add만 리턴합니다. 하지만 emacs-lisp-mode인 경우,<br />
:문자가 \s_에 속하기 때문에 a::add를 리턴하게 됩니다. <br />
<br />
이것을 이용해도 쉽게 문제가 해결될 듯 합니다. 즉, c++의 syntax table의 \s_ syntax class에 : 문자를 추가 시킨다음 find-tag-default를 호출하고 값이 리턴되면 바로 syntax class에서 제거 하는 것이죠..<br />
하지만 이것은 의도하지 않은 동작을 할 우려가 있습니다. 즉, aaa::bbb 에서 aaa에 커서를 위치시키고 find-tag를 하는 경우엔 aaa class를 원했던 것인데, aaa::bbb가 리턴되기 때문에, bbb메소드로 찾아가겠지요.. <br />
<br />
<br />
point : 현재 커서 위치를 리턴합니다.<br />
<br />
<br />
(match-beginning 0)<br />
: 마지막에 행했던 regular expression search에서 찾았던 단어의 위치를 리턴합니다.<br />
만약 마지막에 찾았던 단어가&nbsp; abcd 라면, a위치를 리턴합니다.<br />
<br />
이것과 대조되는 것으로 (match-end 0)이 있는데, 위의 경우 d다음 위치를 리턴합니다. <br />
<br />
(buffer-substring start end) : start부터 end까지 버퍼에 있는것을 copy해서 리턴합니다.<br />
(buffer-substring-no-properties start end) : buffer-substring와 기본적으로 같지만, text속성은 copy하지 않고 text자체만 copy해서 리턴합니다.<br />
<br />
forward-sexp : sexp단위로 커서를 움직이는 함수.<br />
<br />
<br />
<br />
<font size="4">3. find-tag-default 분석</font><br />
<br />
이제 라인 단위로 분석해 봅시다. <br />
<br />
(defun find-tag-default ()<br />
&nbsp; (save-excursion&nbsp; <span style="color: rgb(255, 102, 102);">;find-tag-default를 수행하면서 변경한 cursor의 위치가 함수 사용이 끝나고 원래 위치로 복구됩니다.</span><br />
&nbsp;&nbsp;&nbsp; (while (looking-at "\\sw\\|\\s_")&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forward-char 1)) <span style="color: rgb(255, 102, 102);">; 현재 커서가 단어를 만족하는 동안 커서를 앞으로 전진 시킴니다.&nbsp; 즉, 결국 단어의 끝 다음 칸으로 가겠군요.</span><br />
&nbsp;&nbsp;&nbsp; (if (or (re-search-backward "\\sw\\|\\s_"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;(save-excursion (beginning-of-line) (point)) <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t) <span style="color: rgb(255, 102, 102);">; 커서 아래에 단어가 없을 경우 backward방향의 단어를사용, 위의 while문 덕분에 대부분 여기에 속합니다.</span><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; (re-search-forward "\\(\\sw\\|\\s_\\)+"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (save-excursion (end-of-line) (point))<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t)) <span style="color: rgb(255, 102, 102);">; 커서 아래에 단어가 없을 경우 forward 방향의 단어를 사용.</span><br />
&nbsp;&nbsp; &nbsp;(progn (goto-char (match-end 0))<span style="color: rgb(255, 102, 102);"> ; 그 단어의 끝으로 커서를 이동시킴</span><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (buffer-substring-no-properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point) <span style="color: rgb(255, 102, 102);">; 단어의 끝 위치</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (forward-sexp -1)<span style="color: rgb(255, 102, 102);"> ; 단어의 앞으로 커서 이동</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (looking-at "\\s'") <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forward-char 1))<span style="color: rgb(255, 102, 102);"> ; expression prefix는 무시. </span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (point))))<span style="color: rgb(255, 102, 102);"> ; expression prefix를 제외한 실제 단어의 앞위치</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nil)))<br />
<br />
<br />
이걸 어떤 식으로 수정할지 대충 보이는 군요.. 실제 단어의 앞위치를 단어와 같이 리턴해 주면 됩니다.&nbsp; 현재는 buffer-substring-no-properties를 통해서 단어만 리턴하고 있습니다. <br />
<br />
그럼 다음편에서는 실제로 프로그램을 작성해 보고 수행해 보겠습니다. <br />
<br />
			 ]]> 
		</description>
		<category>Emacs Lisp</category>

		<comments>http://jongsuknim.egloos.com/1775746#comments</comments>
		<pubDate>Sat, 01 Mar 2008 05:39:09 GMT</pubDate>
		<dc:creator>브루스팍</dc:creator>
	</item>
	<item>
		<title><![CDATA[ find-tag 기능 변경하기 (1) ]]> </title>
		<link>http://jongsuknim.egloos.com/1765630</link>
		<guid>http://jongsuknim.egloos.com/1765630</guid>
		<description>
			<![CDATA[ 
  <font style="font-weight: bold; text-decoration: underline;" size="4">1. find-tag 기능 대략적으로 설명</font><br />
<br />
<br />
emacs에는 find-tag라는 기능이 있습니다. <br />
<br />
vim에도 비슷한 기능이 있는데, 프로그램 소스를 읽을때 매우 편리합니다.<br />
<br />
c 언어 소스를 예를 들면,<br />
<br />
int tempFunc( Data a, Data b)<br />
{<br />
&nbsp;&nbsp; return temp2( a.num , b.num);<br />
}<br />
<br />
이런 소스가 있습니다.&nbsp; <br />
<br />
여기서 temp2가 어떤 행동을 하는지 보고 싶다면, 이 temp2가 define된 곳으로 찾아 가봐야 합니다. 그런데 소스의 어느 부분에 위치하고 있을거며, 또한 찾아 가본 이후에는 다시 기존의 위치로 돌아와야 합니다. 매우 귀찮습니다. 집중도 떨어지고..<br />
<br />
emacs에서는 temp2 부분에 커서를 위치시키고 M-x find-tag (또는 단축기 M-.)을 입력하면 자동으로 찾아줍니다.<br />
그리고 단축키 M-*를 입력하여 자동으로 기존의 위치로 돌아 올 수 있습니다. <br />
여기서 M-*은 Alt키를 입력하고 있는 상태에서 *를 입력하라는 뜻입니다. <br />
<br />
써보신 분들은 아실테지만 매우 편리합니다. <br />
<br />
여기서 필요로 하는게 TAGS라는 이름의 파일인데, ctags라는 이름의 프로그램에 -e옵션을 통해서 생성할 수 있습니다. <br />
emacs는 이러한 TAGS라는 파일을 통해 생성한 정보를 이용하여 동작합니다. <br />
<br />
<br />
<font style="font-weight: bold; text-decoration: underline;" size="4">2. find-tag의 2% 아쉬운 점</font><br />
<br />
find-tag는 매우 편리한 기능이지만, 약간 아쉬운 점이 있습니다. <br />
c++환경에서, 다른 클래스 내에 같은 이름의 메소드가 있을 경우, <br />
<br />
즉, <br />
<br />
class a{<br />
&nbsp;&nbsp;&nbsp; int add(int num1, int num2);<br />
}<br />
<br />
int a::add(int num1, int num2)<br />
{ return num1 + num2 ;}<br />
<br />
<br />
class b{<br />
&nbsp;&nbsp;&nbsp; int add(int num1, int num2);<br />
}<br />
<br />
int b::add(int num1, int num2)<br />
{ return num1 + num2 ;}<br />
<br />
<br />
이와 같은 경우에, b::add(1,2)를 호출하는 부분의 add부분에 커서를 위치 시키고, find-tag를 수행하면, a class의&nbsp; add를 찾아줍니다.&nbsp; 즉, 제가 원하는 것은 b class의 add였는데, a class의 add를 리턴해 주는 거죠..&nbsp;&nbsp; 이 소스를 수정하여 가장 처음에 int add; 라는 global 변수를 만들고 find-tag를 수행하면, b class의 add가 아닌 global 변수인 add에 위치하게 됩니다.&nbsp; (음.. 대충 어떤식으로 tag table내에서 검색하는지 알 것도 같습니다.)<br />
<br />
<br />
<font style="font-weight: bold; text-decoration: underline;" size="4"><br />
3. 제대로 된 위치로 움직이기</font><br />
<br />
find-tag 명령을 수행하고 직접 b::add를 입력해 주면 제대로 된 위치로 이동합니다. <br />
<br />
문제는 default로 읽어온 단어가 잘못된 것입니다.&nbsp; 먼저 default를 설명하면, find-tag명령을수행하고, 사용자가 특별한 단어를 입력하지 않으면, 현재 cursor에 위치한 단어를 통해 tag를 검색하는데, 이것이default입니다.&nbsp; b::add인 경우, default로 add를 선택하는 것이죠.. 근데 만약 default로 add를선택하지말고, b::add로 선택하면 문제가 해결 됩니다.<br />
<br />
<br />
<font style="font-weight: bold; text-decoration: underline;" size="4">4. 앞으로의 계획</font><br />
<br />
find-tag명령 수행후, default를 얻어오는 부분을 수정할 것입니다. 그래서 b::add인 경우에 default로 add가 아닌 b::add를 리턴하게 하면 앞으로 프로그래밍 생활이 좀 더 윤택해 질것 같습니다. <br />
<br />
이것을 위해 먼저 find-tag부분 분석을 해야 합니다. <br />
<br />
find-tag 함수 위치를 찾기 위해 디렉토리내 파일 내용을 grep으로 탐색하다가 아주 좋은 것을 발견했습니다. <br />
<br />
/usr/share/emacs/21.4/lisp 디렉토리 내에서 find-tag를 grep으로 탐색하였는데, 아래와 같은 내용이 검색되었습니다. <br />
<br />
파일명은 loaddefs.el 입니다. <br />
<br />
(defvar find-tag-default-function nil "\<br />
*A function of no arguments used by \\[find-tag] to pick a default tag.<br />
If nil, and the symbol that is the value of `major-mode'<br />
has a `find-tag-default-function' property (see `put'), that is used.<br />
Otherwise, `find-tag-default' is used.")<br />
<br />
<br />
즉, find-tag-default-function이라는 변수를 적당한 함수로 설정하면 원래 설정되어 있는find-tag-default 함수를 호출하지 않고, 사용자가 설정한 find-tag-default-fuction 함수를호출한다는 것입니다. <br />
<br />
그래서 간단한 실험을 해보았습니다. <br />
<br />
(setq find-tag-default-function <br />
&nbsp;&nbsp;&nbsp; (lambda() "js"))<br />
<br />
이와같이, 초기에 nil로 설정되어 있던 find-tag-default-function변수를, 무조건 "js"를 리턴하는 함수로 설정하였습니다. <br />
<br />
그런 다음 find-tag 명령어를 수행시켜보았습니다.<br />
<br />
결과는 예상대로,<br />
Find tag: (default js)<br />
이렇게 나왔습니다.&nbsp; 여기서 그냥 엔터를 치면 js를 tag table에서 찾게 됩니다. <br />
<br />
이젠 굳이 find-tag함수를 찾지 않아도 됩니다. 하핫<br />
더 simple하게 수정할 수 있겠군요.. ㅋ<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<br />
			 ]]> 
		</description>
		<category>Emacs Lisp</category>

		<comments>http://jongsuknim.egloos.com/1765630#comments</comments>
		<pubDate>Sun, 24 Feb 2008 06:16:31 GMT</pubDate>
		<dc:creator>브루스팍</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Emacs 스크립트 언어인 elisp을 습득할 겁니다. ]]> </title>
		<link>http://jongsuknim.egloos.com/1765558</link>
		<guid>http://jongsuknim.egloos.com/1765558</guid>
		<description>
			<![CDATA[ 
  어떤 책에서 보았는데, 자신이 주로 쓰는 에디터의 기능을 완벽하게 사용하고, (만약 존재한다면) 그 편집기의 스크립트 언어까지도 습득하라는 글이 있었습니다. <br />
<br />
제가 자주 쓰는 편집기는 emacs입니다.&nbsp; 원래 vim을 한 3년정도 쓰다가, 3년전 Eric Raymond의 Emacs 관한 글을 보고나서 emacs를 쓰기 시작했습니다.&nbsp; vim을 사용할때는 정말 내가 무슨 단축키를 쓰는지도 모를 정도로 익숙했었습니다.&nbsp; 그러한 상황에서 Ctrl을 눌러야 되는 emacs단축키에 익숙해 지는 까지는 무려 1년여의 시간이 걸렸습니다.&nbsp; 그 1년의 시간은 정말.. 크윽.. <br />
<br />
어쨋든 이제는 emacs의 단축키에는 익숙하지만, 아직도 잘 모르는 부분이 많고, 또한 emacs를 쓰다보면, 몇가지 아쉬운 기능들이 있습니다.&nbsp; 그래서 기존의 기능을 제 상황에 맞게끔 살짝 고치고 싶어서 elisp을 습득하고자 하는 것입니다. <br />
<br />
일단 elisp의 기본적인 지식은 아래의 글을 읽어 보시면 됩니다. <br />
<br />
http://www.gnu.org/software/emacs/emacs-lisp-intro/html_mono/emacs-lisp-intro.html<br />
<br />
저도 현재 윗글만 읽어본 상태구요.. (흠.. ) 실제로 원하는 기능을 구현해 보면서 블로그를 작성하고자 합니다. 그렇기 때문에 상당히 지저분할 수도 있고, 또 내용이 수시로 변경될 수도 있습니다. 횡설수설 할 수도 있고, 틀린내용을 올릴 수도 있습니다. <br />
<br />
혹시 블로그를 보시다 더 좋은 내용이나 아이디어, 또는 틀린내용이 있으면 조언해 주시면 감사하겠습니다. (복받으실 겁니다.. 분명)<br />
<br />
그럼 오늘부터 시작해 봅니다. <br />
<br />
<br />
<br />
			 ]]> 
		</description>
		<category>Emacs Lisp</category>

		<comments>http://jongsuknim.egloos.com/1765558#comments</comments>
		<pubDate>Sun, 24 Feb 2008 05:08:36 GMT</pubDate>
		<dc:creator>브루스팍</dc:creator>
	</item>
</channel>
</rss>
