JNI library 참조 경로를 설정하고 싶다면..

java 실행시 argument 로

-Djava.library.path=/home/dasomoli/workspace/JNIOpenCVTest/bin

와 같이 써넣어 주시면 됩니다. 그러니까 이렇게요..

java -Djava.library.path=./ JNIOpenCVTest

저 자바 프로젝트에서 사용하는 library 파일은 .class 파일과 같은 경로에 들어가 있습니다. 그래서 “./” 로 준 것이죠!

이클립스라면 Run -> Open Run Dialog… 에서 해당 프로젝트의 Argument의 VM arguments: 에 위와 같이 써주시거나

혹은

프로젝트의 속성에서 Java Build Path 탭의 Libraries 아래의 JRE System Library 아래 항목중 Native library location: 에 경로를 추가해 주시면 됩니다.

Reference : eclipse와 gcc를 이용한 native 만들기(http://eahn.tistory.com/19)

JNI + Android

JNI 사용 구조는 다음 그림으로 요약할 수 있습니다.

Android에서 사용하는데 필요한 것은 5 단계에서 Cross Compiler로 컴파일 되어야 한다는 것입니다.

그리고 컴파일 된 결과가 “.DLL”이 아니라 “.so” 파일로 나온다는 거겠죠.

Cross Compiler는 http://www.codesourcery.com/gnu_toolchains/arm/download.html 에서 구할 수 있습니다.

그런데 gcc의 -shared 옵션으로 .so 파일을 만들고 실행해보면, 사용될 때 App가 죽어버립니다.

이는 precompiled-library에 관련된 문제로 보이는데, 이를 위해서 컴파일 단계의 ldscript를 수정해서 사용합니다.

http://honeypod.blogspot.com/2007/12/shared-library-hello-world-for-android.html 를 참고하면 다음과 같은 부분을 볼 수 있습니다.

Now, the default linker script need to be modified. The default
linker script is available at
$toolchains_home/arm-none-linux-gnueabi/lib/ldscripts/armelf_linux_eabi.xsc.
Copy it to the current directory. Comment out three lines and add one
line replacing the first commented out line.

/* . = ALIGN (CONSTANT (MAXPAGESIZE)) – ((CONSTANT (MAXPAGESIZE) – .) & (CONSTANT (MAXPAGESIZE) – 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); */
. = .; /* this line replaces the line above */

/* . = DATA_SEGMENT_RELRO_END (0, .); */

/* . = DATA_SEGMENT_END (.); */

$toolchains_home/arm-none-linux-gnueabi/lib/ldscripts/ 경로에 있는 armelf_linux_eabi.xsc 파일을 수정해야 한다는 이야기입니다.

수정한 파일을 사용해서 다음 명령으로 컴파일하면 실제 안드로이드에서 동작하는 라이브러리를 만들 수 있습니다.

arm-none-linux-gnueabi-gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -fpic -c <JNI 함수 구현소스>.c

arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o <library명>.so <Object파일>.o

그리고 emulator 실행 후 다음 명령으로 에뮬레이터에서 실행가능합니다.

adb push <라이브러리>.so /system/lib
adb install <JNI를 사용하는 Android APP>.apk

쓰라고 주는 툴을 못 쓸때..

정말 자괴감에 빠집니다… 으으으으………….

JNI라는 걸 좀 해보려고 javah 라는 header 파일 생성기를 좀 써보려고 노력중이었습니다.

근데 아무리 쓰여진데로

javah -classpath ../../android.jar;../bin/classes; org.apache.NativeAdd

를 쳐도 안되는 겁니다.

1. 경로명이 잘못됐나?
2. 경로명을 따옴표로 묶어주어야 하나?
2. 클래스 파일을 잘못 만들었나?
3. android.jar하고 뭔가 관련이 있나?
4. access 할 수 없다니.. 권한 문제인가..
5. 파일을 왜 못찾는다지?
……

결국 원인은 무엇인고 하니..

javah의 -verbose 옵션을 켰더니 다음과 같이 나오는군요.

dasomoli@dasomoli-ubuntu804:~/CallNative/src$ javah -classpath “../../android.jar;../bin/classes;” -verbose org.apache.NativeAdd
error: cannot access org.apache.NativeAdd
class file for org.apache.NativeAdd not found
javadoc: error – Class org.apache.NativeAdd not found.
[
Search Path:
/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/resources.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/rt.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/jsse.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/jce.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/charsets.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/classes/../../android.jar;../bin/classes;
]

Error: No classes were specified on the command line.  Try -help.

아시겠습니까?

네.. 그렇습니다. ‘;’ 대신 ‘:’를 써주어야 하는 겁니다.

이렇게 해주어야 되는 것이었습니다.

javah -classpath ../../android.jar:../bin/classes: org.apache.NativeAdd

그래서 결과는 다음과 같이 나옵니다.

dasomoli@dasomoli-ubuntu804:~/CallNative/src$ javah -classpath “../../android.jar:../bin/classes:” -verbose org.apache.NativeAdd
[ Search Path: /usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/resources.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/rt.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/jsse.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/jce.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/charsets.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/jre/classes/../../android.jar:../bin/classes: ]
[Creating file org_apache_NativeAdd.h]
[search path for source files: ../../android.jar,../bin/classes,.]
[search path for class files: /usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/resources.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/rt.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/sunrsasign.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/jsse.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/jce.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/charsets.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/classes,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/ext/dnsns.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/ext/sunpkcs11.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/ext/localedata.jar,/usr/lib/jvm/java-6-sun-1.6.0.06/jre/lib/ext/sunjce_provider.jar,../../android.jar,../bin/classes,.]
[loading ../bin/classes/org/apache/NativeAdd.class]
[loading java/lang/Object.class(java/lang:Object.class)]
[loading java/lang/Throwable.class(java/lang:Throwable.class)]
[loading java/lang/Class.class(java/lang:Class.class)]
[done in 717 ms]

이럴 때… 정말 자괴감에 빠집니다..ㅠㅠ

구글 Android SDK 셋팅(우분투 8.04 기준)

1. http://code.google.com/android 에서 Download the SDK 를 클릭

2. 라이센스 확인

3. Linux (i386) 용 zip 다운로드

4. 압축 해제.

4.1. 계정의 .profile 맨 마지막에 다음 내용을 추가하고 다시 로그인 << 여기 추가되었습니다.

PATH=”$HOME/android/tools:$PATH”
PATH=”$HOME/eclipse/tools:$PATH”

4.2. 압축해제한 디렉토리를 ~/android 로 symbolic link. << 여기 추가되었습니다.

5. JDK 설치(sudo apt-get install sun-java6-jdk)

6. http://code.google.com/android 의 Docs 를 눌러 Getting started / Installing the SDK

7. System and Software Requirements 의 Eclipse 를 눌러 Eclipse IDE for Java Developers를 다운로드

8. 홈폴더에서 압축해제.

[#M_* 바탕화면에서 실행하기 위해 $HOME/바탕화면/eclipse.desktop 생성|<<접기>>| [Desktop Entry]
Version=1.0
Exec=/home/dasomoli/eclipse/eclipse
Icon=/home/dasomoli/eclipse/icon.xpm
Name=Eclipse
GenericName=Development Tools
Comment=Eclipse
Encoding=UTF-8
Terminal=false
Type=Application
Categories=Application;Development;_M#]
9. Eclipse에서 WST 설치

10. Eclipse에서 https://dl-ssl.google.com/android/eclipse/ 를 추가하고 설치

11. Eclipse에서 Window/Preference 의 Android 의 SDK Location 을 아까 SDK의 압축 해제 디렉토리로 지정

12. 프로젝트 시작!

소 그리기 과제 중!

컴퓨터 그래픽스 두번째 과제!

소를 그리는 게 과제입니다. ㅋㅋ MFC를 연결하거나 뭐 그러시더니 그냥 WIN32 Console App로 짜오시라는군요-_-

그리다 보니 소가 삐죽삐죽하길래 뭐지! 했더니 예전에 제출한 선그리기 함수가 좀 잘못되어 있었습니다-_-
사용자 삽입 이미지
암튼 그리고나서! 마우스 이벤트로 카메라 위치도 바꿀 수 있도록 하고 나니 이리저리 빙글빙글 돌리면서 보는 것이 재밌네요. 흐흐..
사용자 삽입 이미지

OpenGL MFC Glut Tutorial Lesson1 + 상자 색 바꿔보기!

학교에서 컴퓨터 그래픽스 수업을 듣고 있습니다.

첫번째 과제는 GLUT를 이용한 선 그리기 + 삼각형 색 채우기 였는데요. 두번째 과제가 나올 듯 합니다.
Projection 관련 과제로 설명을 들었는데 교수님께서 연휴 때문인지 올리시질 않으시네요. 기한은 다가오는데….;;;

두 가지(Perspective/Orthogonal) Projection에 대해 구현해 가야 하므로 두 개를 내던가, 혹은 창 제어를 가능하게 해서 하나로 통합해서 내던가 둘 중 아무거나 선택해서 내면 될 거 같아서 교수님께서 언급하신 MFC로 제어하는 방법에 대해서 찾아보았는데요.
이 곳(http://www.kencocomputers.com/tutorials/)에 잘 설명되어 있네요^^

Lesson1을 따라해보다가 다이얼로그를 숨기지 않고 컨트롤들을 배치해서 값을 변경가능한가 테스트해보고 싶은 마음이 들어 박스의 색을 바꾸는 코드를 추가해서 한번 해 보았습니다.

일단 Lesson1을 따라해봅니다.
그리고 먼저 Play 버튼의 이벤트 핸들러 함수 내용 중 “this->ShowWindow(SW_HIDE)” 를 주석처리합니다.

void CGLUTLesson1Dlg::OnOK()
{
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);//set out options to RGB, double buffered and depth
    glutCreateWindow(“MFC Glut Lesson1”);//give the glut window a title
    // set glut callback functions
    glutDisplayFunc(display);//set our display callback
    glutReshapeFunc(resize);//set out resize callback
    //this->ShowWindow(SW_HIDE);// hide the mfc starter when the glut window opens
    glutMainLoop(); //start the glut main loop   

    CDialog::OnOK();
}

그리고 MFCOpenGL(원문에서는 MFCopenGL입니다.) 클래스에 float 형 변수 m_R, m_G, m_B를 추가해 줍니다.
이 값들을 다이얼로그에서 건드릴 것이므로 m_R, m_G, m_B 변수에 대한 Get/Set 함수를 추가하고, 세 개를 한꺼번에 바꾸는 SetColor 함수를 추가합니다. 그리고 m_R, m_G, m_B를 protected 속성으로 바꿉니다.

class MFCOpenGL 
{
public:
    …
    void SetColor(float r, float g, float b);

    void SetR(float r);
    void SetG(float g);
    void SetB(float b);

    float GetR();
    float GetG();
    float GetB();

protected:   
    float m_R;
    float m_G;
    float m_B;

};

뭐, 굳이 SetColor과 SetR/G/B, GetR/G/B 함수는 안써도 다 아시겠죠? ㅋㅋ

그리고 MFCOpenGL::display() 함수의 “glColor3f(1.0f, 0.0f, 0.0f);” 를 “glColor3f(m_R, m_G, m_B);”로 바꾸어 추가한 변수들로 그리도록 해줍니다.

void MFCOpenGL::display(void)
{
    glClearColor(0,0,0,0);//set the background color to black
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glColor3f(m_R, m_G, m_B); //set cube color
    glutWireCube(30); //use the premade glut function to draw a wire cube of size 30
    glutSwapBuffers();
}

원래 값이 각각 1.0f, 0.0f, 0.0f 였으므로 생성자에서 이 값들을 m_R, m_G, m_B 에 넣어주면 좋겠네요.

MFCOpenGL::MFCOpenGL()
{
    m_R    = 1.0f;
    m_G    = 0.0f;
    m_B    = 0.0f;
}

그리고나서 원래 다이얼로그에 에디트 창 3개를 추가하고 각각에 연결된 float형 변수(m_R/m_G/m_B)를 추가합니다. 또 각 변수들로 SetColor을 호출하고 다시 그려줄 버튼도 하나 추가해 줍니다.

사용자 삽입 이미지

창이 뜰 때 만들어질 창의 색 값이 써지면 좋겠군요. OnInitDialog 함수에서 GetR/G/B함수를 이용해서 얻어오죠~

BOOL CGLUTLesson1Dlg::OnInitDialog()
{
    …

    // TODO: Add extra initialization here
    m_R = gl.GetR();
    m_G = gl.GetG();
    m_B = gl.GetB();

    UpdateData(FALSE);
   
    return TRUE;  // return TRUE  unless you set the focus to a control
}

그리고, SetColor버튼을 눌렀을 때 SetColor 함수를 호출하면 될 것 같군요. 값을 얻어와서 호출한 후에 display함수를 호출해서 그려줍시다.

void CGLUTLesson1Dlg::OnButtonSetColor()
{
    UpdateData(TRUE);
   
    gl.SetColor(m_R, m_G, m_B);
   
    display();
   
}

어디 그럼 이제 띄워볼까요?

사용자 삽입 이미지
잘~ 되네요. 흐흐~

컴퓨터 그래픽스 두번째 과제가 나오면 이 걸 좀 이용해서 이런식으로 해서 내야겠습니다. 흐흐..

Xsupplicant 1.9.5(CVS) 소스 설치 on 우분투 8.04 beta

졸업작품 프로젝트로 xsupplicant 관련 작업을 하고 있습니다.
그를 위해서 리눅스 환경에서 xsupplicant 컴파일 작업이 필요해서 최신 버전을 CVS를 통해 받아와서 컴파일해보았습니다.
1.2.8 버전을 설치하려니 이것저것 건드려줘야 할 것들이 많아서 최신 버전을 빌드하는 것보다 더 힘들군요-_-
iwlib.h 를 찾을 수 없다는 에러부터.. linux/compiler.h 가 없다는 에러.. #define HEADER_KERNEL 을 지워줘야 한다는 이야기도 있고.. 아무튼 이래저래 삽질 중 최신버전 설치가 더 쉽게 되어 정리합니다.

설치는 우분투 8.04 beta를 VMWare 6.0.3 에서 설치한 후에 진행하였습니다.
회색배경은 직접 입력하는 부분이고, 노란배경은 화면 메시지 입니다.

1. 우분투 8.04 beta 설치

2. build-essential 설치
 – libc6-dev, libc-dev, gcc, g++, make, dpkg-dev

sudo apt-get install build-essential

3. CVS 설치

sudo apt-get install cvs

4. XSupplicant CVS 저장소 익명 로그인

cvs -d:pserver:anonymous@open1x.cvs.sourceforge.net:/cvsroot/open1x login
Logging in to :pserver:anonymous@open1x.cvs.sourceforge.net:2401/cvsroot/open1x
CVS password:
<ENTER>
cvs login: CVS password file /home/dasomoli/.cvspass does not exist – creating a new file

5. XSupplicant 소스를 CVS 에서 받아오기


cvs -z3 -d:pserver:anonymous@open1x.cvs.sourceforge.net:/cvsroot/open1x co -P xsupplicant

6. 받은 소스가 들어있는 디렉토리로 들어가기

cd xsupplicant

7. Autoconf 설치

sudo apt-get install autoconf

8. automake1.9 설치
 automake를 설치하면 1.10 버전이 설치되는데, 이 것으로 automake를 하면 되지 않더군요.

sudo apt-get install automake1.9

9. libssl-dev 설치

sudo apt-get install libssl-dev

10. libiw-dev 설치

sudo apt-get install libiw-dev

11. libxml2-dev 설치

sudo apt-get install libxml2-dev

11. configure와 make를 위해서..

automake –add-missing
autoreconf

12. configure

./configure –prefix=/usr

13. 컴파일

make

14. 설치

sudo make install

15. 설치 확인

xsupplicant
Starting XSupplicant v. 1.9.5.071009.080121
Found 0 other supplicants and wireless managers.
File /etc/xsupplicant.conf can’t be accessed
Tue Apr 15 00:25:17 2008 – File /etc/xsupplicant.conf can’t be opened.  Do you have rights to it?
Couldn’t read the configuration file.  Building defaults.

흐흐.. 이제 좀 건드려 볼 수 있겠군요.. 🙂

Ctags + T(ag)list

 졸업논문 세미나를 하면서 제가 맡았던 부분인 ctags + taglist 플러그인에 대한 발표자료를 거의 그대로 옮긴 것입니다. 형식을 보시면 아시겠지만 ppt를 그대로 옮겼어요. 말로 때웠던 부분들도 글로 써두고 싶지만 귀찮아진 관계로 나중에… -_-;;;;

Ctags 소개

    여러 Source 파일들의 index(tag)를 생성하는 프로그램
    함수, 변수, 클래스 멤버, 매크로 등을 indexing함.
    생성된 tag는 여러 Text editor에서 사용가능
    현재는 exuberant-ctags라는 별도 프로젝트로 분리되었음.
    공식 홈페이지 : http://ctags.sourceforge.net

Ctags 구하기

    Source 또는 패키지 다운로드
        http://ctags.sourceforge.net
            Source 압축파일
            Source RPM
            Fedora 7 binary RPM
            윈도우즈 용 Source와 Binary

Ctags를 쓰기 위한 준비

    소스 파일이 있는 디렉토리의 최상단에서 tag 생성 -> “tags” 파일이 생성됨.

ctags -R *

    VI 설정파일(.vimrc)에 tag를 찾기 위해 다음을 추가

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

VI + Ctags 사용 – :ts

    :ts <symbol> – <symbol>이 있는 위치를 선택하여 이동, Symbol 위에서 “g + ]” 해도 동일한 효과

:ts ctx

사용자 삽입 이미지   

VI + Ctags 사용 – :ta, ctrl-t, :tags

    :ta <symbol> – <symbol>을 찾아 이동, 소스파일의 찾을 symbol 위에서 ctrl-] 해도 됨
    :tags – 현재 tag 스택을 보여줌.

사용자 삽입 이미지

    Ctrl-t – tag 스택의 상위로(이전 위치로) 이동

taglist 소개 및 기능

    vim의 소스 코드 브라우저 플러그인
    Vim 창 안에서 함수, 클래스, 구조체, 열거형(enumeration),  매크로 정의 등을 보여줌
    Tag 창에서 tag를 선택하면, 해당 tag의 정의로 커서가 이동
    Ctags가 생성하는 tag 파일에 의존적
    공식 홈페이지 : http://vim-taglist.sourceforge.net/

Taglist 다운로드

    Sourceforge
        http://sourceforge.net/projects/vim-taglist/download

    VIM 공식 홈페이지의 스크립트
        http://vim.sourceforge.net/scripts/script.php?script_id=273

Taglist를 쓰기 위한 준비

    .vimrc 파일에 필수적으로 추가할 내용

filetype on

    .vimrc 파일에 선택적으로 추가할 내용

let Tlist_Ctags_Cmd=”/usr/bin/ctags“
let Tlist_Inc_Winwidth=0
let Tlist_Exit_OnlyWindow = 1
let Tlist_Auto_Open=1

    더 많은 정보는 매뉴얼(http://vim-taglist.sourceforge.net/manual.html) 참고

Taglist 화면(:TlistToggle)

사용자 삽입 이미지

Taglist 단축키

    <CR> – tag의 정의로 이동
    <SPACE> – tag 의 prototype을 표시
    u – tag 목록을 갱신
    x – tag list 창을 확대/축소
    + – 플딩 열기 (* – 모든 폴딩 열기)
    – – 폴딩 접기 (= – 모든 폴딩 접기)
    [[ 또는 <BACKSPACE> – 이전 파일의 시작위치로
    ]] 또는 <TAB> – 다음 파일의 시작위치로
    q – taglist 창 닫기
    <F1> – 도움말

DAEMON Tools Lite 4.11 한글 패치

pk5.dll
직접 만든 DAEMON Tools Lite 4.11 한국어 패치입니다.

이전 버전 중 어느 버전부터 옵션에 “Language”가 지원되었는지 알 수가 없어서 어느 버전에서부터 되는지는 알 수 없습니다.

설치법은 일반적으로 C:\Program Files\DAEMON Tools Lite\Lang 폴더에 해당 파일을 복사해 넣으시고 DAEMON Tools를 종료했다가 실행시키면 다음과 같이 “Option”/”Language” 에 “한국어” 가 나타납니다. 그럼 클릭해 주시면 되겠죠~
사용자 삽입 이미지
그럼 다음과 같이 메뉴들이 한글로 나타나는 것을 보실 수 있습니다^^
사용자 삽입 이미지
Pro 버전 것까지 번역해 놓으려다가 귀찮아서 해놓진 않았습니다. Lite 상에서 나타나는 것들은 다 한글로 나오길래 말이죠. ㅎㅎ

[#M_만든 과정은 여기를..|접기..| 처음에는 ResHack으로 ENU.DLL의 String Table의 스트링들을 바꿔치기 할 셈이었습니다. 근데 안쪽의 언어 설정을 수동으로 다 바꾸고 스트링들을 바꾸기엔 너무 귀찮더라구요;

그래서 Visual Studio 6로 ENU.DLL을 열어서 저장하려는 순간! 죽더군요-_-

Visual Studio 2005에서는 저장이 되는데.. DAEMON Tools 포럼에 가보니.. 공식 툴을 제공하더군요-_-..
사용자 삽입 이미지그렇게 만들었답니다. 포럼에 가보니 한국어 공식 번역자가 있던데.. 활동하고 계시진 않은가 봅니다._M#]

VI 실전에서 사용했던 테크닉 정리 by SWSSM 17기 구도훈

예전 수원 멤버십에서 신입회원 세미나 당시에 도훈이가 했던 내용인데 유용하게 정리된것 같아 blog에 따로 정리해 둡니다. 허락은 받지 않았습니다. 😛

SWSSM 17기 구도훈 2007.11.2 실전에 사용했던 테크닉 정리

1. 시작

이번 세미나에서는 vi를 다루려고 합니다. 기초적인 부분은 생략하기로 하고 코딩 시 유용한 것에 대해서 언급하려 합니다.
실제로 vi를 돌려서 어떻게 사용하는지 알아 볼 텐데 , 쓸만한 것은 체크를 해서 자기 것으로 만들었으면 좋겠습니다.

2. 화면 분할/이동, 버퍼이동

vi 고수처럼 보이게 만드는 화면 분할입니다.
모니터를 한 개 혹은 두 개 이상 쓰더라도, 가끔씩은 화면을 분할 할 필요가 있는 것 같습니다.
여기서는 윈도우를 어떻게 분할하는지 설명합니다.

윈도우 수직분할(vs)
윈도우 수평분할(sp)

윈도우 간 이동 CTRL-w + ( i, j, k,l)
윈도우 끄기 CTRL- q

윈도우 height 조정 CTRL – w – (+,-)
윈도우 width 조정 CTRL – w – (<,>)
윈도우 사이즈 같게 CTRL – w – =

다른 윈도우 화면에 놔두면서, 현 윈도우 최대한 크게 CTRL – w – |

버퍼 보기(ls)

해당 버퍼로 이동 예):1b
따라 해보기) 40vs .

3. mark 사용하기

현재 파일의 커서 위치에 마크를 해놓고 언제든지 다시 돌아올 수 있다.

마크된 리스트 보기 :marks
마크하는 방법 m{a-zA-Z}
해당 마크로 이동 ‘{a-zA-Z}

단 a-z 와 A-Z에는 차이가 있다.
‘a – ‘z 소문자는 현재파일안에서, ‘A – ‘Z 대문자는 파일들간에
A-Z 에 프로젝트에서 자주 사용하는 소스 파일을 맵핑 해놓고 바로 찾아갈 수 있다.

vi에서 특정 파일에 저장하는지 A-Z 마크내용은 vi를 재실행해도 볼수 있다.
아래의 내용을 .vimrc에 추가하면 현재 에디팅 되는 파일위치로 path가 자동 이동된다.
if(has(“autocmd”)

” Change to the directory the file in your current buffer is in
autocmd BufEnter * :cd %:p:h

endif ” has(“autocmd”)

4. 레코딩

vi를 사용하다 보면 단순 반복 작업을 할 때가 있습니다. 이때 레코딩 명령을 이요하면 유용합니다.
레코딩 시작과 끝은 q로 시작합니다

1. 레지스터에 레코딩 하는 법
명령 모드 상태에서 q 로 시작
q누르고 레지스터에 저장 가능(vi 레지스터에는 0-9a-zA-Z)
명령 모드 상태에서 q 로 끝

2. 레지스터에 저장된것 불러오는 방법
@누르고 저장된 레지스터입력
@@ 방금전 불러온 레지스터에서 불러오기

5. ctags와 같이 vi 활용하기

ctags에 여래개의 .c .h의 함수/변수/정의/선언 내용을 기록해놓고 vi에서 활용함.

따라해보세요 )
1. tags 파일 생성(c와 h파일에 해당)
ctags -R *.[ch]
2. vi가 tag파일 읽어올수 있도록 ~/.vimrc에 세팅
set tags=./tags,tags
set tags+=/usr/src/linux/tags
set tags+=../tags
set tags+=../../tags
set tags+=../../../tags
3. 사용하기
tags 파일 참조하여 함수/변수/정의/선언 위치로 이동 g], ctrl+]
돌아오기 ctrl + t
태그 스택 보기 – tag
4. 기타
cscope도 vi와 연동해서 사용합니다만 ctags랑 약간 차이가 있으니 한번 돌려보세요.

6. make 사용하기

컴파일 – :make
컴파일 결과보기:cw
!! 결과 창에서 에러 라인 선택하면 해당소스의 해당 라인으로 이동함.

90. 나머지 유용한것들

folding zf, zo
다음 괄호({},(),[])찾기 %
함수 프로토 타입 혹은 define내용을 한 줄로 보기 [i
현 파일 내에서 함수/변수/정의/선언 위치로 이동 gd,gD
현재 커서 밑에 있는 파일 에디트 – gf
이전 버퍼로 이동 ctrl-6
자동완성 ctrl + p
glibc 레퍼런스 – 함수위에서 2K(system call), 3K(standard library)
현재 라인에서 글자찾기 f(F) – 예를 들어 3을 찾는 다면 3f
대소문자 전환 u,U
정렬하기 -선택하고 sor(sor!)
현재커서위치에 있는 값 증가시키기 CTRL – A
아스키 코드 보는 방법 – ga
쉘 명령 사용 – 예제 !pwd
잠깐 쉘로 빠져 나오기 ctrl – z, 복귀는 fg
복사 붙이기 할때 사용해보세요. set paste
검색 시 대소문자 구분 무시 – set ignorecase

정말 모를 때는 help

99. 끝

추가 팁

마우스 스크롤이나 선택 복사를 하고 싶다면
:set mouse=a
특정 줄부터 줄까지 단어를 바꾸고 싶다면
:#,#s:/old/new/g
커서가 위치한 곳의 단어 찾기
Shift + 8
터미널에서 줄이 길어서 안보이면
:set wrap
Tab대신 space 사용
:set expandtab
Tab문자 간격
:set ts=8
Shif width
:set sw=8
한번에 다중 윈도우에 각각의 파일 열면서 시작하기
sp로? vim -o a b c
또는 vs로? vim -O a b c