[완료]vim 스크립트 프로그램 - 디렉토리 다루기

jeongheumjo의 이미지

제가 vim 스크립트를 좀 만져볼까 합니다.
하고자 하는 것은 ctag 와 cscope.out db 파일을 vim에 추가하는 것을 vim을 런치하는 디렉토리에 따라 달리 하고자 하는 것입니다.

현재 디렉토리가 $ACE_ROOT/ace 라면 {
    ctag 는 이런이런 것 cscope.out 은 이런이런 것 추가
} 아니라면 {
    ctag 는 저런저런 것 cscope.out 은 저런저런 것 추가
}

vim 스크립트 메뉴얼에서
http://vimdoc.sourceforge.net/htmldoc/eval.html#getcwd()
getcwd()라는 함수를 찾았습니다.

그런데 경험이 미천하여 스크립트로 완성하질 못하겠습니다.
우선 스트링 비교를어떻게 하는지 모르겠어요. strcmp() 라는 함수도 없고요...

제가 원하는 코드 블락을 어떻게 작성할 수 있을까요?

현재 디렉토리가 $ACE_ROOT/ace 라면

이 부분만 알면 될 것 같거든요..

지금 백창우씨의 책을 보고 있는데 그 책에는 스크립트 설명은 별로 없고 태그 DB가 .vimrc에 고정되게 되는 설명뿐이라 실제 여러 프로젝트를 사용하는 환경에서는 다른 프로젝트 소스를 볼 때 마다 .vimrc를 확인/수정해줘야 해서 좀 불편해서요... 스크립트에 그런 환경을 만들어두면 편할 것 같습니다.

감사합니다.

neocoin의 이미지

혹시 이런걸 말씀하시는 건가요?

 let $ACE_ROOT = "/"
 if ($ACE_ROOT . "Users") == getcwd()
   echo "yes in Users"
 else
   echo "yes no in Users"                                                                                
 endif

비교관련 사항은 도움말 "Write a Vim script" 에 보시면 conditions 보다보면 나와 있습니다.

:help script

jeongheumjo의 이미지

제가 설정하려던 바는 아래와 같았었습니다.
3가지 경우에 따라 다른 태그를 vim에 추가하고 싶었었죠.

 23 "1. $ACE_ROOT/ace
 24 "        ./tags 가 있으면, ./tags
 25 "        
 26 "2. $ACE_ROOT/someplace other than 1.
 27 "        ./tags 가 있으면, ./tags
 28 "        $ACE_ROOT/ace/tags
 29 "        
 30 "3. not under $ACE_ROOT
 31 "        ./tags 가 있으면, ./tags

아래와 같이 만들어보니까 잘 되는 것 같습니다.

 33 if filereadable("./tags")
 34         set tags=./tags
 35 endif
 36 if getcwd() =~ $ACE_ROOT
 37         if (getcwd() . "/") !~ ($ACE_ROOT . "/ace/")
 38                 if filereadable("./tags")
 39                         set tags=./tags,/home/user/ACE_wrappers/ace/tags
 40                 else
 41                         set tags=/home/user/ACE_wrappers/ace/tags
 42                 endif
 43         endif
 44 endif

언제나 친절하게 좋은 조언을 해주셔서 정말 감사드립니다.
알려주신 내용이 많은 도움이 되었습니다.
감사합니다. *^^*

neocoin의 이미지

혹시나 싶어서 팁하나 추가합니다.

:set tags=./tags;

저도 이거 사용이 좀 모호한데, 테스트 해보니 저게 최소 동작 조건이었습니다. 메뉴얼상 tags; 만 해도 될것 같은데 안되더군요. 아래 두문서 참고하면 됩니다.

* http://vim.runpaint.org/navigation/navigating-tags/
* http://vimdoc.sourceforge.net/htmldoc/editing.html#file-searching

이렇게 하시면 현재 위치에서 역으로 올라가면서 역순서대로 모든 tags 파일을 참조합니다. 저는 vim 파일에 진입할때 (정확히는 BufEnter) 해당 파일로 현재 디렉토리를 자동으로 변경하는 스크립트를 사용합니다.

"auto chdir dir
autocmd BufEnter * silent! lcd %:p:h:gs/ /\\ /

즉, 파일에 진입할때 늘 디렉토리가 변경될 수 있지요. 그래서 이렇게 상위로 올라가면서 모든 tags 를 참조하는 팁이 매우 유용합니다. (vim 최신 버전에는 autochdir 이라는 기능이 있기는 한데, 이게 특정 플러그인에서 잘못 동작하는 경우가 왕왕 있습니다.)

이걸 제가 몰랐을때는 이렇게 사용하곤 했죠.

set tags=./tags,./../tags,./../../tags,./../../../tags,./../../../../tags

한 프로젝트 내에서 이동하면서 사용하기에 유용합니다.

그래서 저 경우에 저는 $ACE_ROOT/tags 를 두고 저 세팅해놓고 딱히 다른 세팅없이 돌아다닙니다.

jeongheumjo의 이미지


알려주신 방법을 적용했습니다.

 21 "========= ctags setting ========
 22 "파일에 진입할 때(BufEnter) 해당 파일로 현재 디렉토리를 자동으로 변경한다.
 23 "- from neocoin
 24 autocmd BufEnter * silent! lcd %:p:h:gs/ /\\/
 25 
 26 set tags=./tags;/.
 27 
 28 "이부분 별로 깔끔하지 않다. ctag 를 실행할 때 헤더파일만 include 하도록 만드는게 좋을 듯...
 29 if getcwd() =~ $ACE_ROOT
 30         if (getcwd() . "/") !~ ($ACE_ROOT . "/ace/")
 31                 set tags=./tags;/.,/home/user/ACE_wrappers/ace/tags
 32         endif
 33 endif

재귀적으로 위로 올라가면서 tags 파일을 추가하는 것은 아주 적절한 것 같아요.
위의 제 설정에서 28번 라인 이하 부분은 아직 마음에 들지 않습니다. 라이브러리 내부 코드를 볼 수 있도록 해놓은 것인데 라이브러리를 사용한 다른 프로그램을 만들때는 라이브러리 내부 소스코드 전체 보다는 API의 헤더파일만 볼 수 있으면 될 것 같거든요. 이부분은 vim 스크립트가 아니라 아마도 tags 파일을 만들 때 라이브러리의 헤더파일 경로를 추가하는 식으로 해야하지 않을까... 싶습니다. 그렇게 되면 알려주신 간단한 부분만 남을 것 같습니다.
정말 감사합니다. ^^

neocoin의 이미지

헉... from neocoin 지우세요. 저도 필요해서 메일링 리스트에서 찾은겁니다.

jeongheumjo의 이미지

제 컴퓨터에서 사용하는 파일에서는 지울게요.... 여기 올린 글에서는 이제 편집이 불가능하게 되었네요.. kldp 게시판 시스템이 누군가 댓글을 단 글을 수정할 수가 없게 되는군요...
아이디가 사용되는 것에 예민하신 것 같은데 죄송합니다... 저는 출처를 남긴다는 생각에서 쓴 것이었거든요... 제 PC상에서는 지우겠습니다...

neocoin의 이미지

제 아이디어도 아니고 일반적인 건데요. 아이디를 남기는건 아예 이름 적어 놓습니다.

tags 관리는 정말 정답이 없죠. 저도 그냥 제가 필요한 용도의 플러그인을 만들어서 쓰고 있습니다. 다른 몇몇 플러그인 처럼 슈퍼 천재님이 '이렇게 하면 정말 좋다' 라고 이야기 해주면 좋겠다는 상상을 하곤 하죠.;;

jeongheumjo의 이미지

저도 그런 똑같은 생각해봤습니다.
매번 자질구레한 것들 확인해봐야 해서 ... 좀 불편했거든요.
표준 vimrc 파일 뭐 이런거요. vim 설치시 표준에 맞게 딱! 얼마나 좋을까요.. 어느 책에서 자주 쓰는 표현에 따르면 이런건 상상속에서나 있는 것이겠죠?

아, 최근까지 올리셨던 문서 vundle plugin 에 대한 글도 읽어보려고 벼르고 있습니다. 나중에 꼭 잘 읽어보겠습니다. 게으름,... 때문에 빨리 읽어지지가 않네요. 좋은 글 올려주셔서 항상 감사드립니다.

익명 사용자의 이미지

vim script를 배워두면 다른곳에 쓰이기는 하겠지만, 원하시는 것은 훨씬 더 간단하게 할 수 있습니다.

~/.vimrc 에다가 set exrc 라고 지정한 다음에, 원하는 프로젝트 디렉토리에 가서 .vimrc 파일을 만들어서
set tags=project/path/tags 라고 지정하면 해당 디렉토리에서 vim을 실행할 때마다 원하는 tags파일을 읽어드리게 됩니다.

프로젝트의 서브디렉토리가 있는 경우에는, 서브디렉토리에도 .vimrc를 만들어야 하는데, 저같은 경우는 find로 directory를 찾아서 프로젝트 root/.vimrc로 symbolic link를 만들어서 씁니다.

planetarium의 이미지

subdirectory마다 vimrc link가 하나씩 있는건가요... 뭐가 더 간단한 방법인지 잘 모르겠네요 ^^;
그럼 아예 tags 파일을 디렉토리마다 symlink 걸면 어떨까요?
아 경로가 달라져서 안되겠구나...

jeongheumjo의 이미지

새로운 방법을 알려주셔서 감사합니다.

저는 현재 위치에서 상위로 올라가면서 tags 파일을 찾아서 추가해주는 방식 (위 neocoin님이 알려주신..)을 일단 사용하려고 합니다. 그런데 이렇게 할 때는 라이브러리의 헤더파일을 tags 파일 만들 때 참고하도록 해야하고 이 방법을 찾는게 아직 숙제입니다.

제가 숙제를 해결하면 역시 이곳에 포스팅 하도록 하겠습니다.

감사합니다.

jeongheumjo의 이미지

제 숙제에 대해 좀 찾아봤는데 ctags 명령어의 옵션을 봐도 적절한걸 못찾았습니다.
일단 이렇게 생각합니다. 라이브러리는 태그를 두 개 만드는 겁니다. API의 헤더파일만의 태그 파일과 API의 헤더 파일을 제외한 나머지 부분의 태그파일

라이브러리 자체의 소스를 볼 때는 그 두개의 태그파일을 사용하고
응용프로그램 프로젝트에서는 응용프로그램 자신의 태그파일과 라이브러리의 API 헤더의 태그 파일

이렇게 사용하는 것입니다.

일단 이렇게 생각만 하고 있습니다. 스크립트만 붙잡고 있을 수는 없네요.

감사합니다. 이 쓰레드는 완료 처리 할게요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.