'전체보기'에 해당되는 글 126건

  1. 2011.04.25 원격으로 리눅스에 ssh 접속을 위한 openssh 설치
  2. 2011.03.31 VMware 로 설치된 리눅스에 다른 PC에서 원격 접속하기(포트 포워딩) 2
  3. 2010.07.12 아이튠즈에 대한 간단한 설명과 아이폰으로 음악 듣기 1
  4. 2010.07.11 아이폰 벨소리 제작법 1
  5. 2010.04.02 토렌트 사용법
  6. 2009.12.08 소스인사이트에서 탭을 space로 바꾸기
  7. 2009.12.07 소스인사이트 팁 총정리 4
  8. 2009.12.07 소스인사이트 팁5 : 오래된 창을 닫아주는 매크로
  9. 2009.12.07 소스인사이트 팁4 : 선택한 영역의 소스 비활성화 시키는 매크로
  10. 2009.12.07 소스인사이트 팁3 : if나 switch문의 뼈대를 작성해주는 매크로
2011. 4. 25. 16:27

원격으로 리눅스에 ssh 접속을 위한 openssh 설치

ssh 접속을 위한 openssh 설치

1. ssh가 설치되어 있는지 확인한다.
    # dpkg -l | grep ssh
 - 만약 설치되어 있지 않다면,
     # sudo apt-get openssh-server

2. ssh 셋팅
    /etc/ssh/sshd_config 에서 셋팅
    ex) 포트 변경시(22번이 기본 포트)
    - Port 22 를 다른 숫자로 바꿔준다.

3. sshd 재시작
    # /etc/init.d/ssh restart

4. 만약, 재시작이 안되고 아래와 같은 메세지가 뜬다면, 호스트 키를 재생성 해주어야한다.
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
 * Restarting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key

 - 아래와 같이 입력하여 키를 생성해준다.
    # ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 
    # ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

(enter passphrase 부분은 그냥 엔터로 넘기면 됩니다.)
2011. 3. 31. 13:38

VMware 로 설치된 리눅스에 다른 PC에서 원격 접속하기(포트 포워딩)

network 설정이 NAT로 설정된 VMware의 리눅스는 IP를 따로 준것이 아니기 때문에 다른 PC에서 원격으로 접속하려면 포트 포워딩을 해줄 필요가 있다.

1.     Vmware 내의 리눅스(guest os) windows(host pc) ip를 확인한다.

A.     리눅스 : ifconfig

B.      윈도우즈 : ipconfig

 

2.     네트워크 환경설정에서 VMware Network Adapter VMnet8 VMware Bridge Protocol이 체크되어 있는지 확인한다.


 

3.     VMware – Edit – Virtual Network Editor

A.     VMnet8 을 선택하고 NAT Settings를 클릭

 

4.     NAT Settings 에서 Add를 선택하여 guest OS IP를 입력

A.     호스트 포트는 충돌되지 않도록 1024 ~ 65535 사이의 포트를 선택한다.

B.      VMware 포트는 22를 입력

                         i.         (참고 : SSH서비스는 22, Telnet서비스는 23, Apache 등의 웹 서비스는 80)

          




5.     리눅스에서 xinetd telnetd을 설치한다.

A.     apt-get install xinetd

B.      apt-get install telnetd

 

6.     텔넷 사용을 위해 xinetd 데몬의 설정을 변경한다.

A.     /etc/xinetd.conf 파일을 열어 아래의 내용을 추가한다.

B.      service telnet
{
        disable         = no
        flag            = REUSE
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = telnetd
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID


7.     xinetd를 재시작한다.

A.     /etc/init.d/xinetd restart

 

8.     서비스가 정상적으로 동작하는지 확인한다.

A.     telnet localhost


9.     터미널 프로그램으로 접속한다.

A.     ) putty의 경우

B.      아래와 같이 입력


C.      한글이 깨지므로 translation에서 UTF-8을 선택


D.     open을 클릭하면 아래와 같이 연결된 화면을 볼 수 있다.



2010. 7. 12. 01:45

아이튠즈에 대한 간단한 설명과 아이폰으로 음악 듣기

아이튠즈를 어려워하시는 분들을 위해 씁니다.
=======================================================================================================

아이폰에 음악을 넣는 방법에는 두가지 방법이 있습니다.
(찾아보면 더 있겠지만 일반적으로...)

공식 프로그램인 아이튠즈를 이용하는 방법이 있고, 서드파티 프로그램인 SharePod을 이용하는 방법이 있습니다.

아이튠즈를 이용하면 공식 프로그램이기 때문에 음악/동영상/프로그램/사진 등등을 모두 관리할 수 있고, 컴퓨터에 잘 관리해준다면 아이폰에 동기화만 해주면 동일하게 적용된다는 장점이 있습니다. 단점은 여러 PC에 관리하기 어렵고 아이폰에 들어있는 음악을 가져오기 어려우며 윈도우용 아이튠즈는 무지 느리다는 단점이 있습니다.

SharePod을 이용하면 동기화 뭐 이런거 필요없이 그냥 넣고 뺄 수 있으며, 프로그램이 무척 가볍습니다. 단점은 음악/동영상/사진만 관리가능하다는 점과 아이폰에서 음악을 꺼내왔을 때 태그가 이상하게 될 수도 있다(왠만하면 제대로 가져오지만 간혹 못가져오는 경우도 생기긴합니다.)는 점이 있습니다.

저같은 경우에는 집에 있는 PC에는 아이튠즈로 아이폰과 동기화하고 다른 곳에서 음악/동영상/사진을 넣거나 꺼내야할 필요가 있을 때는 SharePod을 씁니다.

1. 아이튠즈 설치 및 음악 넣기

2. SharePod으로 음악 넣기


추가.

아이폰의 기본 음악재생 프로그램인 아이팟을 사용할 때 몇가지 팁을 알려드리겠습니다.
1. 음악이 재생 중일 때 흔들면 랜덤하게 다음곡이 재생됩니다.

2. 화면을 한번 터치하면 가사 정보가 있을 경우 가사가 보이고, 재생 스크롤바, 셔플재생, 반복재생을 선택할 수 있는 화면이 나옵니다.

3. 재생 스크롤바를 앞뒤로 움직일 때 세세한 시간 조작이 힘든데(음악/동영상 동일) 세세하게 조작하고 싶을 때는 스크롤바의 동그란 부분을 터치한 다음에 아래로 내리면 고속 스크러빙-1/2 속도 스크러빙-1/4-정밀 순으로 내리는 길이에 따라 바뀝니다. 이 상태로 좌우로 움직이면 더 세세한 조작이 가능합니다.

4. 아이폰을 옆으로 돌리시면 커버플로우(앨범사진으로 노래를 선택하는 화면) 화면이 나옵니다.

5. 아이팟이 background로 재생중일 때(즉, 아이팟 화면에서 홈버튼을 한번 눌러서 빠져나갔을 때)홈버튼을 두번 클릭하면 iOS 3.x 버전은 팝업이 뜨면서 아이팟에 대한 몇가지 조작을 할 수 있습니다. iOS 4.x의 경우에는 홈버튼을 두번 클릭하면 멀티태스킹을 위한 앱 목록이 뜨는데 왼쪽으로 스크롤 해보시면 아이팟에 대한 조작 메뉴가 나옵니다.

6. 화면이 잠긴 상태에서 아이팟을 조작하기 위해 락을 풀 필요는 없습니다. 화면이 잠긴 상태에서 홈버튼을 두번 눌러주시면 아이팟 메뉴가 나옵니다.
2010. 7. 11. 23:36

아이폰 벨소리 제작법

아직 아이폰의 벨소리를 마림바로 쓰고 있는 분들을 위해 썼습니다=ㅅ=
=======================================================================================================
아이튠즈에는 벨소리를 판매하고 있지만 자신이 원하는 음악의 일부분을 벨소리로 만들고 싶을 때가 있습니다.

이런 아이폰용 벨소리를 제작하는 방법에는 여러가지가 있습니다. 아이튠즈를 이용하는 방법이 있는데 간단하지만 fade-in, fade-out같은 설정을 하기 어렵다는 단점이 있습니다.

그래서 아래의 두가지 방법을 추천합니다.
(만약 탈옥을 하셨다면 훨씬 더 간단한 방법으로 가능하나 순정 기준으로 설명하겠습니다.)

1. iRinger 프로그램을 이용하는 방법

2. 웹사이트를 이용하는 방법


이렇게 만들어진 벨소리를 아이튠즈의 보관함에 있는 벨소리에 드래그해서 넣고 동기화를 시켜주시면 아이폰에 벨소리가 저장됩니다.
(위의 iRinger 프로그램을 이용할때 마지막 단계인 Export Ringtone에서 Export to iTunes에 체크하셨다면 아이튠즈에 자동으로 등록되어 있을 겁니다.)

위와 같이 해주시고 위의 화면 우측 하단에 있는 적용버튼을 눌러 주시면 됩니다.
(동기화하지 않고 수동으로 하시려면 그냥 장비-벨소리에 드래그 해서 넣어주셔도 됩니다.)

마지막으로 저장된 벨소리로 변경하려면 아이폰의 설정-사운드-벨소리 로 들어가셔서 선택하시면 됩니다.
2010. 4. 2. 14:59

토렌트 사용법

1. utorrent 를 다운 받습니다.

http://www.utorrent.com/


클릭해서 다운로드

2. utorrent를 설치합니다.

3. 설치후 실행을 하면 설정 도우미가 뜨는데 디폴트로 하셔도 관계 없습니다.

4. 시드 파일을 구합니다.

시드파일은 *.torrent 의 확장자를 가지는 파일로서 파일을 가지고 있는 유저들의 정보를 가진 파일입니다.

국내 유명 토렌트 사이트가 몇개 있습니다.

투쉐어 : http://www.toshare.kr/ (현재 가입이 막혀있는 상태입니다.)
e토렌트 : http://etorrent.co.kr/
OK토렌트 : http://oktorrent.com/

5. 시드 파일을 드래그해서 토렌트 프로그램에 넣으면 아래와 같은 화면이 나옵니다.

(1) 저장할 곳을 설정해주고
(2) 만약 시드파일이 여러 파일을 포함하고 있다면 일부만 받을 수도 있습니다.
(3) 확인을 누릅니다.

6. 기다리면 배포와 피어가 점점 늘어납니다. 만약 한참 기다렸는데 배포와 피어가 없다면 그 시드는 더이상 공유하는 사람이 없을 가능성이 높습니다.
파일을 다 받은 후에도 다른 사람을 위해 시드를 유지해주는 매너를 지킵시다.


2009. 12. 8. 10:16

소스인사이트에서 탭을 space로 바꾸기

alt + t를 누름
1. Tab width를 4 로 설정
2. Expand tab을 enable로 설정
3. Auto Indent는 취향에 맡게 simple에 체크 둘다 해주는거...

tab --> space로 일괄 변경
1. 소스 전체 선택
2. alt+ e
3. special  --> tab --> space 누름

정해진 tab width만큼으로 모두 변경됨
2009. 12. 7. 17:41

소스인사이트 팁 총정리

출처 : http://andstudy.springnote.com/pages/3778703

0.개요

본 문서는 안드로이드 스터디 모임에서 소스 인사이트를 통해 소스 코드 드라이빙을 하는 데

필요한 기능을 정리한 것이다.

 

1.자주 쓰는 기능

 

1.1 프로젝트 내 특정 심볼을 검색할 때?

F7

 

1.2 심볼이 검색이 안되는 경우는?

프로젝트 전체 파일들에 대해 lookup reference 기능을 이용해서 찾는다.(grep 명령어와 비슷)

ctrl + /

 

1.3 특정 단어(심볼)을 하이라이트 해서 보고 싶을 때?

shift + F8

 

아래 그림은 'coldboot' 함수를 하이라이트 한 것임.

si2.jpg

 

2.소스인사이트 세팅

 

2.1 소스인사이트에서 ARM assembly language 추가하기

안드로이드 소스 중 일부는 arm 기반의 어셈블리 파일로 되어 있다.

소스 인사이트의 기본 설정은 arm assembly에 대한 언어 정보가 추가되어 있지 않으므로

사용자가 별도로 추가해줘야 한다.

http://kaisyu.springnote.com/pages/1578764

 

2.2 소스인사이트 한글 주석 깨지는 걸 막는 매크로

인터넷 검색중 가장 깔끔한 방식인 듯 싶네요.

굳이 대화 상자 없이도 바로 입력 가능하게 하다니.. (정말 이 친구 아이디어 죽이네요 ^^)

출처 : http://blog.daum.net/bluebread

 

1. DoNoting() 이라는 macro를 만들어 추가한다. 진짜로 아무일도 하지 않는 걸로.
    macro DoNothing()
    {
    }
2. Option > Key Assignment 을 선택한다.
3. Macro: DoNothing 선택후에 Assign New Key를 누르고 다음의 키조합을 입력한다.
    Shift + 한/영 (황당한 조합이지만 먹힌다.)
4. 화면에 "shift+ " 로 표시되면 들어간 것이다.
5. 완료!!

이후로 아무 것도 해줄 필요가 없다.
그냥 메모장 쓰듯이 한글입력하면 된다. 쌍자음 그냥 입력해도 안 깨진다.

 

2.2 전체 file path를 보여주게끔 설정하기

소스 인사이트는 기본적으로 긴 파일 path를 ...으로 축약해서 보여준다.

소스 분석시 파일 경로를 제대로 아는 것은 매우 중요하다.

다음과 같은 설정으로 긴 파일 path를 정확하게 볼 수 있다.

 

si1.jpg

위의 그림과 같이 Trim long path names with ellipses 체크를 지우기.

 

2.3 떠 있는 창을 10개이내로 제한하기

http://www.ericstory.com/tag/Source%20Insight

 

 

3 단축키

1. Ctrl + = 또는 Ctrl + 왼쪽 마우스 버튼

=> 변수 및 함수에 커서를 위치시키고 이 키를 누르면 해당 선언문으로 이동 및 확인 할 수 있다.

 

2. Ctrl + 0

=> 우측 파일창으로 이동한다.

 

3. Alt + L

=> 좌측 함수창으로 이동한다.

 

4. F7 키

=> 프로젝트 전체에서 특정함수나 변수등을 찾기 위해 사용

 

5. F8 키

=> 현재 파일에서 특정함수나 변수등을 찾기 위해 사용

 

6. F5 키 (라인수 입력창)

=> 해당 라인으로 이동.

 

7. Alt + < or >

=> 이전/이후에 커서가 위치했던 곳으로 이동.

 

8. Ctrl + f, F3, F4

=> ctrl + f : 현재 파일 내에서 검색

   F3 : 이전 검색 부분 이동

   F4 : 다음 검색 부분 이동

 

9. Alt + 드래그

=> 블럭 단위로 선택.(라인 선택 아님)

 

10. Ctrl + L

=> 라인 번호 표시

 

11. Ctrl + M

=> bookmark

 

12. Ctrl + H

=> replace

 

Ctrl+W(or w): close the current file
Ctrl+Shift+W(or w) : close all the files
Ctrl+S(or s): save the current file
Ctrl+A(or a): save all the files
F3/F4: search backward/forward
Shift+F3/F4: search back/forward for the current word under cursor

 

Ctrl + =
해당심볼의 선언부로 이동한다. 사용함수,변수의 선언부로 이동시 편리

Ctrl + /
해당심볼로 프로젝트 전체범위로 검색

Shift + F9
검색결과에서 다음검색으로 이동한다.

Ctrl + ,
이전편집장소로 이동

F7
프로젝트 내 심볼 검색 및 이동

F8
파일 내 심볼 검색 및 이동

Shift + F8
파일심볼창 보이기/숨기기


2009. 12. 7. 16:58

소스인사이트 팁5 : 오래된 창을 닫아주는 매크로

이매크로는 아래의 코드중에 4라고 세팅된 수만큼의 코드윈도우를 제외하고 모두 닫아 버리는 기능을 합니다.

수천개의 소스를 탐색하고 돌아다니다 보면 자신도 모르게 많은 창을 띄우게 되는데 이중에 가장 최근에 보았던
창을 제외 하고 모두 닫아 버리는 센스 입니다.


/*
// Closes all but the most recently visited windows and files.
// Any dirty files are kept open.
*/
macro CloseOldWindows()
{
var hwnd
var cWnd

// This is the number of recent windows to keep open. You may change
// this constant to suit your needs.
var NumberOfWindowsToKeep; NumberOfWindowsToKeep = 4

hwnd = GetCurrentWnd()
cWnd = 0

// skip the most recently visited windows in the z-order
while (hwnd != hNil && cWnd < NumberOfWindowsToKeep)
{
cWnd = cWnd + 1
hwnd = GetNextWnd(hwnd)
}

// close the remaining windows
while (hwnd != hNil)
{
var hwndNext

hwndNext = GetNextWnd(hwnd)

// only close the window if the file is not edited
if (!IsBufDirty(GetWndBuf(hwnd)))
CloseWnd(hwnd)

hwnd = hwndNext
}

// close all files that are not visible in a window anymore
var cBuf
cBuf = BufListCount()
while (cBuf > 0)
{
var hbuf
cBuf = cBuf - 1
hbuf = BufListItem(cBuf)
if (GetWndHandle(hbuf) == hNil)
CloseBuf(hbuf)
}
}
2009. 12. 7. 16:56

소스인사이트 팁4 : 선택한 영역의 소스 비활성화 시키는 매크로

#if 0 ~ #endif로 
코드를 비활성 시키는 동작을 하게 합니다.

편집시 선택을 한부분에서 키동작으로 이매크로를 실행 시키면 그부분의 아래위가 #if 0 ~ #endif로
작성되어 코드를 비활성 시킵니다.


/*====================================================================
Create by sparrow
Unused Code Block
#if 0
unused code
#endif
====================================================================*/

macro UnUsedCodeBlock()
{
hbuf = GetCurrentBuf();
hwnd = GetCurrentWnd();

sel = GetWndSel(hwnd);

iLine = sel.lnFirst;
iLineEnd = sel.LnLast

InsBufLine(hbuf,iLine, "#if 0")
InsBufLine(hbuf,iLineEnd+2, "#endif")

}
2009. 12. 7. 16:53

소스인사이트 팁3 : if나 switch문의 뼈대를 작성해주는 매크로

아래의 매크로 역시 C++빌더 의 Ctrl + J 키를 흉내낸것입니다.
if 나 switch등의 자주 이용하는 키워드의 뼈대를 작성해주는 코드입니다.



/*====================================================================
Create by sparrow
Ctrl + J (C++Builder Code Generation function.
====================================================================*/



macro CodeCompletation()
{
hbuf = GetCurrentBuf()
ln = GetBufLnCur(hbuf)

line = GetBufLine(hbuf,ln)

DelBufLine(hbuf, ln)

if(strlen(line) <2)
{
return
}


cch = strlen(line)
ich = 0
space_cnt = 0
chTab = CharFromAscii(9)
szSpace = ""

while(ich <= cch)
{
ch = line[ich];
if (ch == " " || ch == chTab)
{
space_cnt = space_cnt + 1
}
else
{
szSpace = strmid(line,0,space_cnt)
line = strmid(line,space_cnt,strlen(line))
break
}
ich = ich + 1
}





if ( line == "if")
{
/* code completation if ~ else */


InsBufLine(hbuf, ln +0, "@szSpace@if( )")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@ ")
InsBufLine(hbuf, ln +3, "@szSpace@}")
InsBufLine(hbuf, ln +4, "@szSpace@else")
InsBufLine(hbuf, ln +5, "@szSpace@{")
InsBufLine(hbuf, ln +6, "@szSpace@ ")
InsBufLine(hbuf, ln +7, "@szSpace@}")
SetBufIns(hbuf,ln + 0,space_cnt + 3)
}
if (line == "ife")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "@szSpace@if( )")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@ ")
InsBufLine(hbuf, ln +3, "@szSpace@}")
InsBufLine(hbuf, ln +4, "@szSpace@else if( )")
InsBufLine(hbuf, ln +5, "@szSpace@{")
InsBufLine(hbuf, ln +6, "@szSpace@ ")
InsBufLine(hbuf, ln +7, "@szSpace@}")
InsBufLine(hbuf, ln +8, "@szSpace@else")
InsBufLine(hbuf, ln +9, "@szSpace@{")
InsBufLine(hbuf, ln +10, "@szSpace@ ")
InsBufLine(hbuf, ln +11, "@szSpace@}")

SetBufIns(hbuf,ln + 0,space_cnt + 3)
}

else if(line == "do")
{
/* code completation do ~ while */
InsBufLine(hbuf, ln +0, "@szSpace@do")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@ ")
InsBufLine(hbuf, ln +3, "@szSpace@}while( )")
SetBufIns(hbuf,ln + 3,space_cnt +7)

}
else if (line == "while")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "@szSpace@while( )")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@ ")
InsBufLine(hbuf, ln +3, "@szSpace@}")
SetBufIns(hbuf,ln + 0,space_cnt +6)

}
else if(line == "enum")
{
/* code completation enum ~ */
InsBufLine(hbuf, ln +0, "@szSpace@typedef enum")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@};")
SetBufIns(hbuf,ln + 2,space_cnt +1)

}
else if (line == "struct")
{
/* code completation struct ~ */
InsBufLine(hbuf, ln +0, "@szSpace@typedef struct")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@};")
SetBufIns(hbuf,ln + 2,space_cnt +1)

}
else if (line == "union")
{
/* code completation struct ~ */
InsBufLine(hbuf, ln +0, "@szSpace@union")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@};")
SetBufIns(hbuf,ln + 2,space_cnt +1)

}

else if(line == "switch")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "@szSpace@switch( )")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@ case : ;")
InsBufLine(hbuf, ln +3, "@szSpace@ break;")
InsBufLine(hbuf, ln +4, "@szSpace@ case : ;")
InsBufLine(hbuf, ln +5, "@szSpace@ break;")
InsBufLine(hbuf, ln +6, "@szSpace@ case : ;")
InsBufLine(hbuf, ln +7, "@szSpace@ break;")
InsBufLine(hbuf, ln +8, "@szSpace@ case : ;")
InsBufLine(hbuf, ln +9, "@szSpace@ break;")
InsBufLine(hbuf, ln +10, "@szSpace@ default: ;")
InsBufLine(hbuf, ln +11, "@szSpace@}")
SetBufIns(hbuf,ln + 0,space_cnt +7)

}
else if(line == "for")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "@szSpace@for( ; ; )")
InsBufLine(hbuf, ln +1, "@szSpace@{")
InsBufLine(hbuf, ln +2, "@szSpace@ ")
InsBufLine(hbuf, ln +3, "@szSpace@}")
SetBufIns(hbuf,ln + 0,space_cnt +4)

}
else if(line == "#ifdef")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "#ifdef")
InsBufLine(hbuf, ln +1, "")
InsBufLine(hbuf, ln +2, "#else ")
InsBufLine(hbuf, ln +3, "")
InsBufLine(hbuf, ln +4, "#endif /* */")
SetBufIns(hbuf,ln + 0,space_cnt +7)

}
else if(line == "#ifndef")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "#ifndef")
InsBufLine(hbuf, ln +1, "")
InsBufLine(hbuf, ln +2, "#else ")
InsBufLine(hbuf, ln +3, "")
InsBufLine(hbuf, ln +4, "#endif /* */")
SetBufIns(hbuf,ln + 0,space_cnt +8)

}
else if(line == "#if")
{
/* code completation if ~ else */
InsBufLine(hbuf, ln +0, "#if")
InsBufLine(hbuf, ln +1, "")
InsBufLine(hbuf, ln +2, "#else ")
InsBufLine(hbuf, ln +3, "")
InsBufLine(hbuf, ln +4, "#endif /* */")
SetBufIns(hbuf,ln + 0,space_cnt +4)

}


}