Emacs Dynamic Abbrev Expansion에 관한 문의

승굴이의 이미지

안녕하세요?
신입 개발자인데 이맥스 정말 좋네요.
그런데 Dynamic Abbrev Expansion을 쓰면서 궁금한 점이 하나 생겼습니다.

현재 작성하고 있는 소스에서의 Dynamic Abbrev Expansion은 잘 되는데
기존에 이미 작성되어있는 소스를 참고하여 Dynamic Abbrev Expansion을 하려고 하면 안되네요.

가령 커널소스를 참고하여 자동완성 기능을 쓰려고 하는데
제 홈에다 main.c라는 파일을 만들어서 코딩을 하면
커널소스 자동완성 기능이 안됩니다.
억지로 cscope를 이용해서 커널 소스를 열면
그때부터 자동완성이 되기 시작하는데요.

현재 코딩하고 있는 소스를 제외한 이미 만들어진 소스를 참조하여
자동완성 기능을 쓰려면 어떻게 해야하는지요?

cinsk의 이미지

일단, dabbrev-expand (M-/)는 현재 버퍼 (또는 열려 있는 다른 버퍼)에 대해서만 동작합니다. 따라서 불러오지 않은 파일에 대해서 dynamic abbreviation을 할 수는 없습니다.

물론 emacs가 시작할 때, 강제로 원하는 파일들을 미리 버퍼로 불러오게 하면, 원하는 기능을 얻을 수 있긴 합니다. 하지만, 이 방법을 쓸 경우, 원하는 파일이 여러 개일 경우 (질문하신 것을 보니 /usr/src/linux의 모든 파일이 되겠군요), emacs 부팅 시간이 엄청? 느려지게 됩니다. 메모리도 많이 잡아 먹을테구요.

또 다른 방법으로, TAG 파일을 만들어 두고, 이 TAG 파일을 방문하면, 원하는 기능을 얻을 수 있습니다. TAG 파일은 symbol과 그 위치를 기록해 둔 파일이라, 원하는 dabbrev-expand 기능을 그대로 얻을 수 있을 뿐만 아니라, 위 방법보다 상대적으로 잡아먹는 시간이나 메모리 측면에서 훨씬 낫습니다.

원하는 파일이 /usr/src/linux 아래에 있는 모든 *.c, *.h, *.s, *.S라고 가정하고,

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

위와 같이 TAGS 파일을 만들어 둡니다.

그리고 .emacs에 아래 내용을 추가합니다:

(add-hook 'c-mode-hook 
          #'(lambda ()
             (let ((tagfile "/usr/src/linux/TAGS"))
               (and (file-readable-p tagfile)
                    (visit-tags-table tagfile t)))))

그러면 앞으로 열 모든 .c 또는 .h 파일에 대해서 /usr/src/linux/TAGS에 있는 모든 이름을 dabbrev-expand에서 쓸 수 있습니다. (만약 C++ 파일에 대해서도 동작하기를 원한다면 위 코드에서 c-mode-hook 대신 c++-mode-hook를 쓰면 됩니다.)

(주의: 이 방법은 상대적으로 오래된? emacs에서 동작하지 않을 수도 있습니다)

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

승굴이의 이미지

(require 'cc-mode)
(defun my-build-tab-stop-list (width)
  (let ((num-tab-stops (/ 80 width))
        (counter 1)
        (ls nil))
    (while (<= counter num-tab-stops)
      (setq ls (cons (* width counter) ls))
      (setq counter (1+ counter)))
    (set (make-local-variable 'tab-stop-list) (nreverse ls))))
(defun my-c-mode-common-hook ()
  (setq tab-width 8) ;; change this to taste, this is what K&R uses :)
  (my-build-tab-stop-list tab-width)
  (setq c-basic-offset tab-width))
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook
          #'(lambda ()
             (let ((tagfile "/usr/src/linux/TAGS"))
               (and (file-readable-p tagfile)
                    (visit-tags-table tagfile t)))))

웹에서 긁어온 .emacs 설정파일이라 비슷한 걸 찾다보니 c-mode-common-hook에 추가시켰습니다.

버전은 다음과 같습니다.

계속 여쭤봐서 죄송하네요...

Quote:

GNU Emacs 22.2.1 (i386-redhat-linux-gnu, GTK+ Version 2.12.9)
of 2008-05-24 on xenbuilder4.fedora.phx.redhat.com

"내가 기억하는 한, 나는 대부분의 시간을 늘 혼자서 보냈다.
그건 내가 비사교적이기 때문이 아니고, 예술가가 창조자로서 작업하기 위해 머리를 쓰기 바란다면
자아 규제 ― 바로 사회로부터 자신을 절단시키는 한 방식 ― 라는 것이 반드시 필요하기 때문이다.
관심의 대상이 될 만한 작품을 산출하고자 하는 예술가라면 누구나 사회 생활면에서 다소 뒤떨어진 존재가 될 수밖에 없다."
- 글렌굴드, 피아노 솔로 중에서


=== 시그너쳐 ===
"내가 기억하는 한, 나는 대부분의 시간을 늘 혼자서 보냈다.
그건 내가 비사교적이기 때문이 아니고, 예술가가 창조자로서 작업하기 위해 머리를 쓰기 바란다면
자아 규제 ― 바로 사회로부터 자신을 절단시키는 한 방식 ― 라는 것이 반드시 필요하기 때문이다.
관심의 대상이 될 만한 작품을 산출하고자 하는 예술가라면 누구나 사회 생활면에서 다소 뒤떨어진 존재가 될 수밖에 없다."
- 글렌굴드, 피아노 솔로 중에서

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.