vim을 사용하면서 가장 필요한 기능은 원하는 파일을 빨리 여는 것이다.


Source insight 를 사용하는 경우에는 project 에 파일들을 추가해 놓고 project 내의 파일들은 ctrl+o 의 기능을 활용하여 파일 목록에서 찾을 수 있다.


vim 에서 이와 비슷한 동작 아니 더 빠르고 쉽게 파일을 열 수 있도록 해주는 플러그인 들이 있다.


내가 정확히 원한는 기능은, 미리 파일 목록을 만들어 놓고 그 목록 중에서 파일이름으로 검색하여 해당 파일을 여는 일이다. (source-insight 를 사용하는 형태와 동일)


가장 먼저 사용해본 vim plugin은 ctrl-p ( https://github.com/kien/ctrlp.vim ) 이다.  vim script 로 만들어져 있으며 파일 검색시 fuzzy 알고리즘 이용 및 열려있는 파일중에서 찾기, history 에서 찾기 등이 같이  제공된다. 


난 주로 chromium 소스 분석을 위해 vim을 사용하는데 검색 대상의 파일 수가 30000~40000 개이다. ctrl-p 로 미리 listup 되어 있는 대상을 로드하여 text 로 filtering 하는 과정에서 지연이 발생하게 된다. (느린경우 약 1~2초 정도)


1년정도는 이것을 참고 사용하다가 최근 fzf ( https://github.com/junegunn/fzf.vim )  라는 툴을 접한 후 이 툴을 사용하여 ctrlp를 대체하기 시작하였다. go 언어로 작성된 터미널용 툴이며 vim 에 연결하여 사용하였을때 ctrlp 처럼 딜레이가 생기지 않는다.


fzf 에서도 기본적은 vim 플러그인을 제공하는데, 이것을 사용하더라도 매우 빠르게 동작한다.


다음 번에는 fzf 를 vim과 연동하여 사용하는 법에 대해서 소개해 보고자 한다.

AND

VIM 이야기 (1)

컴퓨터 2013. 6. 8. 00:31

그동안 사용하지 않던 블로그를 다시 글적 거려 본다. 제목을 VIM 이야기 (1) 로 시작한 것은 분명  VIM에 대해서 시리즈로 이어가겠다는 계획이다.

나는 Windows 환경에서 프로그래밍을 시작했다. 솔직히 코딩을 하는 시간 보다는 거대한 소스를 분석하는 시간이 더 많기 때문에 주로 Visual Studio 보다는 source insight  와 더 많은 시간을 보냈다. 그만큼 소스를 분석하는데 있어서 source insight의 역활은 절대적이었다.

source insight 의 기능을 VIM 에서 어떻게 사용할 수 있을지의 관점에 연재하고자 한다.

일단 오늘은 VIM의 기능은 아니지만, plugin을 쉽게 설치/삭제 하도록 도와 주는 vundle 을 소개 하도록 한다.

Vundle 은 Vim bundle 의 약자이며 Vim의 plugin manger 역활을 하는 plugin 이라 이해하면 된다.[1] 

Vundle plugin 설치

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

환경 설정

.vimrc에 아래 추가

set nocompatible " be iMproved filetype off " required! set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle' " My Bundles here: " " original repos on github Bundle 'ctrlp.vim' Bundle 'scrooloose/nerdtree' Bundle 'minibufexplorerpp' Bundle 'Tagbar' Bundle 'autoload_cscope.vim'

" ... filetype plugin indent on " required! " " Brief help " :BundleList - list configured bundles " :BundleInstall(!) - install(update) bundles " :BundleSearch(!) foo - search(or refresh cache first) for foo " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Bundle command are not allowed..

bundle 설치

:BundleInstall

왜 vundle 을 쓰는지

개발업무를 하다보면, 여러대의 PC를 사용하는 경우가 많다. 노트북, 서버, 집에 있는 컴퓨터 (집에서는 소스를 보면 안되겠지만 ㅜㅜ)...

이 분산되어 있는 환경을 동일하게 만들려면, VIM의 모든 plugin을 압축하여 다녀야 한다. (포터블 버전...) 

Vundle을 사용하면 plugin 설치가 아주 간편해 지며 (.vimrc 에 Bundle "플러그인명"을 추가하기만 하면됨) .vimrc만 공유가 된다면 여러 pc 환경에서 동일한 vim 환경을 사용 할 수 있다.

dropbox등을 활용하면 .vimrc 를 쉽게 분산된 환경에서 공유가 가능하여 plugin 관리가 아주 편해 진다. 자신이 개발한 vim 스크립트의 경우 github 를 이용하여 스크립트를 추가하고 github의 주소를 bundle로 등록하면 private 한 스크립트도 쉽게 관리가 가능해 진다.


앞으로의 계획

위 .vimrc는 실제 내가 사용중인 것은 아니지만, 사용중인 plugin의 일부를 적어 두었고 다음 포스트 부터는 이 플러그인을 어떻게 사용할지에 대해서 설명하고자 하려고 한다.

[1] https://github.com/gmarik/vundle#readme

AND

소스코드를 문법에 맞게 색을 입혀주는 멋진 스크립트이다. 내 블로그에 사용중인 버전은 3.0.83 버전이다.

syntaxhighlight 를 다운로드 받기 위해서는 http://alexgorbatchev.com/SyntaxHighlighter/download/ 사이트에 방문하여 받고, 압축파을을 해제 한다.

티스토리에 추가하기 위해서는 아래와 같이 HTML/CSS 편집으로 들어간다.


파일 업로드 탭을 선택후, 압축 해제한 파일중 styles 디렉토리와 scripts 디렉토리에 있는 모든 파일을 업로드 한다.
그 다음 HTML/CSS 편집 탭을 누른뒤, 위와 같이 <title> 아래 부분에 syntaxhighlight 에 필요한 소스를 추가해 준다.
<script type="text/javascript" src="./images/shCore.js"></script>
<script type="text/javascript" src="./images/shBrushAS3.js"></script>
<script type="text/javascript" src="./images/shBrushCpp.js"></script>
<script type="text/javascript" src="./images/shBrushCss.js"></script>
<script type="text/javascript" src="./images/shBrushDiff.js"></script>
<script type="text/javascript" src="./images/shBrushJava.js"></script>
<script type="text/javascript" src="./images/shBrushJScript.js"></script>
<script type="text/javascript" src="./images/shBrushPerl.js"></script>
<script type="text/javascript" src="./images/shBrushPhp.js"></script>
<script type="text/javascript" src="./images/shBrushPlain.js"></script>
<script type="text/javascript" src="./images/shBrushPython.js"></script>
<script type="text/javascript" src="./images/shBrushSql.js"></script>
<script type="text/javascript" src="./images/shBrushVb.js"></script>
<script type="text/javascript" src="./images/shBrushXml.js"></script>
<script type="text/javascript" src="./images/shLegacy.js"></script>
<link href="./images/shCore.css" rel="stylesheet" type="text/css">
<link href="./images/shThemeDefault.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
     SyntaxHighlighter.all()
     SyntaxHighlighter.config.stripBrs = true;
     SyntaxHighlighter.config.stripBrs = "blockquote";
</script>
설치한후 syntaxhighlight 를 사용하기 위해서는 아래과 같이 <blockquote> 태그를 이용하면 편하다. <pre> 태그를 이용하면 <br>태그가 마구 생겨남.ㅜ.ㅜ

<blockquote class="brush: 원하는문법">
코드
</blockquote>

문론 사용하려는 문법에 대한 shBrushxxx.js 파일이 위에 포함되어 있어야 한다. ( 위 예제는 내가 주로 사용하는 문법만 포함해 두었다. )티스토리에서 스킨을 변경하면 이전에 올려 놓았던 소스와, skin.html 수정본이 날라가기 때문에 새로 수정해줘야 한다.그때 사용하기 위해서 기록을 남겨 놓는다.
AND

 해당컴퓨터로 접속은 잘 되는데 보안정책부분에서 guest 허용이 되지 않아 접근이 되지 않는것 같습니다. 혹은 바이러스 때문에 보안정책이 손상되서 그럴수도 있구요.. 다음 방법을 참고해 보세요..

*** 만약 XP pro를 사용하신다면

1. [제어판]-->[사용자계정]-->[guest]가 사용함으로 되어 있는지 확인

2. 되어있다면 시작 → 설정 → 제어판 → 관리도구 → 로컬보안정책/로컬정책/사용자 권한 할당의 우측항목의 '네트워크에서 이 컴퓨터 액세스' 에 'Everyone' 혹은 guest를 추가합니다.

3. 재부팅 시킨 후 공유폴더에 접근하는지 확인해 보세요..


*** 만약 XP Home을 사용하신다면

1. [제어판]-->[사용자계정]-->[guest]가 사용함으로 되어 있는지 확인

2. 주변에 xp pro 사용하는 PC를 찾아 그 PC의 c:\windows\system32 폴더에 가셔서 secedit.exe 파일을 복사

3. 복사한 파일을 xp home의 c;\windows\system32 폴더안에 붙여넣기

4. 다음내용을 메모장에 복사하여 home_allowaccess.inf 파일로 만듬

[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[System Access]
EnableGuestAccount = 1
[System Log]
[Security Log]
[Application Log]
[Event Audit]
[Registry Values]
machine\system\currentcontrolset\control\lsa\restrictanonymoussam=4,1
machine\system\currentcontrolset\control\lsa\restrictanonymous=4,0
machine\system\currentcontrolset\control\lsa\forceguest=4,1
[Group Membership]
[Privilege Rights]
sedenynetworklogonright =
senetworklogonright = *S-1-1-0,*S-1-5-32-545,*S-1-5-32-547,*S-1-5-32-551,*S-1-5-32-544,*S-1-5-21-1390067357-789336058-1708537768-501
[Registry Keys]
[Profile Description]

5. 만든 inf 파일을 xp home의 c:\windows\system32 폴더안에 넣습니다.

6. xp home에서 명령프롬프트를 실행하셔서 c:\windows\system32로 이동

7. 다음 명령어를 입력하고 엔터
secedit /configure /cfg home_allowaccess.inf /db temp.db /verbose

8. 진행과정이 퍼센티지로 나타나면서 명령을 잘 수행했다는 메세지가 나오면
명령프롬프트 창을 닫고 PC 재부팅!!

9. 공유폴더에 접근하는지 확인해 보세요

성공하셨나요? 참고로 위의 방법은 보안정책값을 초기화하는 방법입니다
AND

Windows XP를 사용중인데, 테마를 xp에서 고전으로 변경하면 tray에 나오는 시계에 날자정보가 나오지 않고 마우스를 가져다 놔야 툴팁으로 날자가 표시되어 꽤 귀찮다.

사용자 삽입 이미지

Windows XP 기본 시계


이 시계를 입맛에 맞게 변경시키는 아주 작은 툴이 있어서 소개한다.
바로 TClock Light 라는 툴이다.




배포판에 소스까지 포함되어 있어 간단하게 오늘이 몇주차인지 표시하도록 수정해봤다.


사용자 삽입 이미지

몇주차인지 표시하려면 TClock 설정> 서식에 표시 형식 직접 입력을 선택하고, w 문자를 사용하면 몇 주차인지 표시하도록 했다. 아래 수정된 dll파일을 이용해야한다.


마지막으로 내가 설정한 세팅은 다음과 같다

사용자 삽입 이미지

AND

현재 로컬 PC에 모니위키를 사용중에있다. 위키에서 code syntax highlight를 하기 위해서는 VimProcessor 를 이용하면 쉽게 가능하다.

Vim 으로 Highlighting 을 위해서 아래 2가지를 추가해주면 가능하다.

1. Vim 설치
2. config.php 파일에 vim 경로 등록

$path="C:\Program Files\Vim\Vim70";


 

두가지를 확인하면 아래와 같은 문법을 사용하면 wiki에서 문법에 맞춰 색이 나온다.
{{{#!Vim c
void main(void)
{
   printf("Hello world");
}
}}}

위의 예제의 결과물
사용자 삽입 이미지


만약 화면 layout이 이상해 진다면 vim.php 파일의 아래부분을 다음과 같이 변경해주면 정상동작한다. (136 라인 )
$out=substr($out,$fpos+6,$tpos - $fpos - 6);

substr의 3번째 인자가 length 인데 end position으로 잘못 코딩되어 있었다.
AND

화면캡쳐용 프리웨어를 찾다가 아주 입맛에 딱 맛는 유틸리티를 찾았다.

일명 픽픽 (PicPick)

특징으로는 (사이트에 있는 내용)

각종 화면 캡쳐 기능(전체화면 캡쳐, 듀얼 모니터 캡쳐, 웹페이지 스크롤 캡쳐, 영역 지정 캡쳐, 컨트롤 인식 캡쳐, 내 마음대로 캡쳐 등)과 이미지 편집 및 효과, 레이어, 색상 추출, 팔레트, 눈금자, 각도기, 십자선, 화면 그리기 등 그래픽 작업에 필요한 모든 기능을 이 작은 프로그램 하나가 전부 제공합니다.
 
내 맘에 드는 기능은

1. 스크린 캡쳐 모드에서 마우스 동작이 가능하다는 점.
스크린 캡쳐버튼을 누른다음에 마우스 오른쪽 왼쪽 버튼이 해당프로그램에서 동작되며, 스크린 챕쳐키 (프린트 스크린) 를 통해서 화면 캡쳐가 이루어 진다.
특정 프로그램에서 팝업 메뉴나 서브메뉴등의 화면을 캡쳐할때 유용하다.

2. 캡쳐후에 간단한 이미지 편집이 된다는 점.
화면 캡쳐후 블로그등에 올릴때 개인정보는 살짝 가려서 올릴 수 있다.

3. 설치형 프로그램이 아닌 단일 실행파일이라는 점.
레지스트리 사용 없이 가볍게 사용 할수 있어서 좋다.

더 자세한 소개는 개발자 사이트를 참고 ^^

개발자 사이트 바로가기
AND


GOTAPI 사이트 바로가기

자바스크립트 레퍼런스를 찾다가 찾은 사이트이다.

자바스크립트 뿐아니라, HTML, CSS 에 대한 reference 도 충실하다.

웹 관련 개발자들에게 꼭 필요한 사이트 ^^
AND

Source Insight 를 사용하다보면, 나도 모르게 파일이 너무 많이 열려 있는 경우가 있다. 심지어는 50~60개 이상의 파일을 Open 한채로 소스 분석을 하는 경우게 허다하다.

파일 한개가 열릴때 마다 PC 리소스를 잡아 먹는다는 생각에 가끔 윈도우 리스트를 띄어서 모두 닫는 경우가 있다. 매크로를 사용하면 특정 Hot-Key 로 최근 몇개의 파일만 남겨두고 모두 Close 도 가능하다.

그것 외에도 파일을 새로운 창에 열때 10개 이상이 되면 가장 마지막에 봤던 소스파일 윈도우를 자동으로 close 하는 방법이 있다.

Source Insight 에서 제공하는 event handler 함수를 정의하면 된다. (event handler 를 사용하기 위해서는 Options > Preferences > General > Enable event handlers 를 check 해야 한다.)

10개 이상 열린 경우 마지막에 본 소스를 close 하는 event handler와 3개만 남겨놓고 모두 close 하는 macro를 소개한다.

event 로 시작하는 함수는 source Insight 에서 정의하는 event handler 이다. 특정 이벤트가 발생하면 수행되는 것이다.
DocumentOpen 이라는 이벤트 핸들러는 파일을 Open할때 불리는 핸들러다.

event DocumentOpen(sFile)
{
    nHoldWnd = 10
    winCnt = WndListCount()
    if (winCnt > nHoldWnd ) {
        hWnd = GetCurrentWnd()
        while(nHoldWnd--!=0) {
            hWnd = GetNextWnd(hWnd)
        }

        while (hWnd != 0) {
            hTmpWnd = GetNextWnd(hWnd)
            CloseWnd(hWnd)
            hWnd = hTmpWnd
        }
    }   
}



AND

CodeProject를 구경하다가 CxImage 라는 이미지 라이브러리를 보았다.
http://www.codeproject.com/bitmap/cximage.asp

해당링크의 소개를 간단히 요약하자면...

CxImage는 C++ 클래스이고, load, save, display, transform images 가 가능하다.
image library로는 OpenIL, FreeImage, PaintLib같은 좋은 라이브러리가 많이 있지만, 이들 라이브러리는 주로 platform independent 를 지향 하거나, C 로 만들어지는 등 사용상의 약간 불편함들이 있다.

CxImage 자체로는
BMP,GIF,ICO,TGA,PCX,WBMP,WMF 가 지원되고, 그외 JPEG, PNG, MNG, TIFF 등의 포멧들은 추가 라이브러리가 필요하다.

CxImage 배포형식이 full과 lite가 있는데 lite는 CxImage 소스만을 포함하고 있으며, full에는 다른 포멧이 요구하는 라이브러리가 (
jpeg, png, zlib, 등등) 포함되어 있다.

CxImage 는 image resource, file, memory 로 생성이 가능하다.
 
간단한게 이미지 디코딩해서 화면에 그리는 sample code


CxImage image((BYTE*)(wi->imageData),  wi->imageSize, CXIMAGE_FORMAT_UNKNOWN);
   if (!image.IsValid() ) {
    AfxMessageBox(image.GetLastError());
    return;
   }

   CRect rc;
   int x1,y1,w,h;
   GetClientRect(&rc);
   w = image.GetWidth();
   h = image.GetHeight();
   x1 = rc.Width() - w;
   y1 = rc.Height() - h;
   x1 = x1 > 0 ? x1 / 2 : 0;
   y1 = y1 > 0 ? y1 / 2 : 0;

   image.Stretch(pDC->GetSafeHdc(), CRect(x1,y1,x1 + w,y1 + h));

원래 생성자에 imagetype을 넣도록 되어 있는데 UNKNOWN으로 줬더니 자동으로 되는듯 보인다.

AND