반응형

리눅스 커널의 구현 방식

→ 리눅스 커널은 구조체를 연결 리스트로 바꾸는 대신 구조체에 연결 리스트의 노드를 넣는 방식을 사용

 

 

연결 리스트 구조체

→ 연결 리스트 코드는 <linux.list.h>헤더 파일에 정의되며 자료 구조는 위에와 같다.

  • next 포인터는 리스트의 다음 노드를 가르킴

  • prev 포인터는이전 노드를 가르킴

 

이렇게 하면 fox 구조체의 list_head.next는 다음 항목을 가리키고, list_head.prev는 이전 항목을 가리키게 할 수 있다.

커널은 이런 연결리스트를 조작하는 함수를 제공한다.

반응형
반응형

파워쉘을 처음 설치하고 실행을 하게 되면 다음과 같은 오류가 발생합니다.

 


PS C:\Users\choi> .\gui.ps1
이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\choi\gui.ps1 파일을 로드할
 수 없습니다. 자세한 내용은 "get-help about_signing"을 참조하십시오.
위치 줄:1 문자:10
+ .\gui.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

이건 ... 권한 문제에서 발생하게 되며 다음과 같이 수행하게 되면 문제없이 실행이 가능합니다.

 

PS C:\Users\choi> Set-ExecutionPolicy Unrestricted

 

그렇게 하고 실행을 하게 되면 샘플로 만든 GUI 코드가 만들어지게 됩니다.

 

 

 

샘플로 만든 GUI 프로그램을 구동했습니다.

 

다음 시간 부터는 powershell에 대해서 알아보도록 하겠습니다.

 

 

반응형

'파워쉘 스크립트' 카테고리의 다른 글

파워쉘 소개 및 개요  (0) 2017.10.21
반응형

리눅스 커널 코드에서 사용 내장 자료 구조에 대해 소개 하도록 하겠습니다.

 

커널 개발자들은 해결책을 스스로 고안하기 보다는 이런 자료구조를 최대한 활용해야 합니다.

 

앞으로 다룰 자료구조는

  • 연결 리스트
  • 이진트리

연결리스트는

  • 리눅스 커널에서 가장 많이 사용하는 간단한 자료구조
  • 노드라고 부르는 가변적인 개수의 데이터를 저장하고 관리하는 기능을 제공
  • 동적으로 데이터를 생성해 리스트에 추가
  • 그러므로 컴파일 시접에 미리 개수를 알 수 없는 데이터 관리 가능
  • 데이터가 인접한 메모리 공간에 모여 있지 않으며
  • 따라서 , 데이터를 서로 연결시킬 방법이 있어야 하므로 next라는 포인터 사용

단일 연결 리스트와 이중 연결 리스트

 

 

연결 리스트 내에서 이동

  • 연결 리스트내의 이동은 선형으로 일어난다.

  • 한 항목을 참조하고 다른 포인터를 따라가 다음 항목을 참조한다.

  • 이 과정을 반복하며 해당 데이터에 접근한다.

  • 임의순서로 데이터에 접근하는 동작이 중요한 상황에는 연결리스트는 부적절

  • 전체 리스트를 차례대로 훑는 작업이나 항목으을 동적으로 삽입하고 제거하는 작업에 적합

  • 연결리스트 구현에서 리스트의 '시작' 부분에 접근하기 쉽게 리스트의 첫번째 항목을 헤드(head)라고 부르는 특별한 포인터로 표시하는 경우가 많다

  • 환형이 아닌

     

    리스트라면 다음항목을 가라크니는  포인터가 Null인 경우 마지막 항목이 된다.

  • 환형 리스트는 첫번째 항목이 마지막 항목이 된다.

리눅스 커널의 구현 방식

리눅스 커널은 구조체를 연결리스트로 바꾸는 대신 구조체에 연결리스트의 노드를 넣는 방식을 사용

 

연결 리스트 구조체

 

 

반응형
반응형

awk
데이터 처리를 위한 유닉스 프로그래밍 언어.
awk 이름의 의미는, 언어 개발자 세 명의 이름의 이니셜을 따서 만든 것..
awk가 제작된 이후 다양한 버전이 나왔는데 구버전은 awk, 새로운 버전은 nawk, GNU 버전은 gawk 라는 명령어로 사용한다.

 

awk 기본 사용법

패턴과 command로 이루어진다.
패턴 부분에는

  - 정규식이나 조건 표현식(true/false)이 올 수 있다.

    1. 정규식 예: /^hello$/
    2. 조건 표현식 예: $1 >= 0


command 부분은 
  - c언어와 마찬가지로 조건연산자, 반복연산자, 산술연산자, 논리연산자, 삼항연산자, 증감연산자, 대입연산자 등을 사용 가능하다

  - 문법 또한 c언어와 거의 유사하다.
아무 command를 지정하지 않을 경우, 패턴에 매칭된 줄을 그대로 출력하는 기본 동작을 수행한다.
command 부분은 { }로 감싼다.
command 예: { if($1 >= 0){ print "hello"; } }


정규표현식
    - 정규표현식을 사용할 때는 슬래시 /로 감싼다.
    - grep, sed와 마찬가지로 정규표현식 메타문자를 사용할 수 있다.

※  단 단어 지시자 \<\>, 캡처 \(\), 반복 지시자 \{\}는 사용할 수 없다

 

$ awk '/^Hello/' file # 정규식 /^Hello/에 매칭되는 줄을 그대로 출력한다.

Field Separator
awk는 필드 구분자를 기준으로 각 줄의 필드를 나누어 처리한다. 필드 구분자는 FS라는 이름의 내장변수로 관리되며 기본값은 탭/스페이스이다.

 

 $ cat file
Hello 1  
Hi 2      
Haha 3 

 $ awk '{print $1}' file
hello
hi
haha

 

디폴트 FS인 스페이스에 의해 필드가 나뉘었다. print 함수를 이용하여 첫 번째 필드 $1를 출력한다. command 부분은 { }로 묶는다.

 

 $ cat file
Hello 1  
Hi 2      
Haha 3 

$ awk '/hello/{print $1,$2}' file
hello 1


정규식 패턴 /hello/에 매칭된 모든 줄의 첫 번째 필드($1)와 두 번째 필드($2)를 출력한다. 이 때 $1,$2 사이에 콤마,를 사용했는데, 출력된 결과에는 콤마 대신 공백이 들어갔다. print 명령에서의 콤마는 출력 필드 구분자를 의미하는 OFS라는 이름의 내장변수의 값으로 치환되기 때문이다. OFS의 기본값은 스페이스라서 콤마 대신 스페이스가 출력되었다.

 

 $ cat file
Hello 1  
Hi 2      
Haha 3 

$ awk '$2 > 1' file
hi 2
haha 3

조건 표현식 $2 > 1이 참인 줄만 출력한다. 즉 두 번째 필드($2)의 값이 1 보다 큰 줄만 출력한다.

 

 

 $ cat file
Hello 1  
Hi 2      
Haha 3 

$ awk '{ print $0 }' file
hello 1
hi 2
haha 3

$0은 필드를 나누지 않은 상태의 전체 레코드를 의미하는 내장변수이다. 즉 줄 내용 전체가 그대로 출력된다.

 

$ awk -F: {print $1} file    # 콜론(:) 을 필드 구분자로 사용

$ awk -F'[:,]' {print $1} file    # 콜론(:)과 콤마(,)를 필드 구분자로 사용
-F 옵션을 사용하여 필드 구분자를 직접 지정할 수도 있다.

 

printf
출력 포맷을 지정하고 싶을 때는 print 대신 printf 함수를 사용한다. 사용법은 C언어의 printf와 유사하다.
printf는 print와 달리 개행(new line)처리가 되지 않으므로, 필요시 \n을 직접 명시한다.


문자 설명
%c character
%s string
%d, %ld 10진수, long 10진수
%u, %lu unsigned 10진수
%x, %lx 16진수
%o, %lo 8진수
%e 부동소수점, e-표기법
%f 부동소수점
%g 부동소수점. %e와 %f 중 적은 자릿수를 차지하는 표기법을 사용.

 

 $ cat file
Hello 1  
Hi 2      
Haha 3 

$ awk '{ printf "word is %-10s and number is %8d and %03d\n", $1, $2, $2}' file
word is hello      and number is        1 and 001
word is hi         and number is        2 and 002
word is haha       and number is        3 and 003

%-10s : 10자리의 공간에 string 출력. 대시-는 왼쪽 정렬을 의미.
%8d : 8자리의 공간에 10진수 출력. 기본으로 오른쪽 정렬.
%03d : 3자리의 공간에 10진수 출력. 남는 공간은 0으로 채움.


내장변수

위에서 언급한 FS, OFS 외에도 여러 내장변수가 존재한다.

내장변수의 이름은 대문자로 이루어져 있다.
내장변수는 패턴 및 command 내에서 사용할 수 있으며 값을 재설정 할 수도 있다.


이름 설명

ARGC       : 커맨드라인 매개변수의 갯수
ARGV       : 커맨드라인 매개변수의 배열
FILENAME : 입력 파일의 이름
FNR         : 현재 파일의 레코드 갯수
NF           : 현재 레코드의 필드 갯수
NR           : 레코드 번호
OFMT       : 숫자를 위한 출력 포맷
OFS         : 출력 필드 구분자
ORS         : 출력 레코드 구분자
RS           : 입력 레코드 구분자
RLENGTH  : match 연산자로 매칭된 부분의 길이
RSTART    : match 연산자로 매칭된 부분의 시작 위치
SUBSEP     : 배열 구분자


 

NR, NF

$ cat file
hello 1
hi 2
haha 3

$ awk '/haha/{ print NR, $1, NF }' file
3 haha 2

NR은 파일 내에서 해당 레코드의 번호를 나타내는 내장변수이다. NF은 해당 줄의 필드 갯수를 나타내는 내장변수이다.

 

OFMT
$ awk `{ OFMT="%.2f"; print 1.234567, 12E-2; }` file
OFMT는 print 함수의 출력 포맷을 지정하는 내장변수이다.

 

ARGV, ARGC
ARGV는 shell 커맨드라인에서 입력받은 매개변수가 순서대로 저장되는 내장 배열이다. nawk 에서만 지원한다.
nawk라는 명령어 자체도 매개변수에 포함되며(ARGV[0]), 명령어의 옵션들은 포함되지 않는다.
ARGC는 커맨드라인 매개변수의 갯수가 저장되는 내장 변수이다.
$ nawk -F',' '{ for(i=0; i<ARGC; i++){ print ARGV[i]; } }' filename1 filename2
nawk        # ARGV[0]
filename1   # ARGV[1]
filename2   # ARGV[2]

match 연산자 (~, tilde)
특정 필드의 값이 정규표현식에 매칭되는지 검사할 때는 ~를 사용한다. 매칭되지 않는지 검사할 때는 !~를 사용한다.

$ awk '$1 ~ /[Hh]ello/' file    # 첫 번째 필드가 Hello, hello인 레코드를 출력
$ awk '$1 !~ /^hello/{ print $1 }' file

variable
정수, 부동소수점 실수, 문자열 등을 위한 변수를 사용할 수 있다.
awk의 변수는 선언 없이 바로 사용할 수 있으며, 사용되는 형태에 따라 0이나 ““으로 초기화된다.
awk 내에서의 변수는 shell에서의 변수와 기본적으로 호환되지 않는다.

shell의 변수를 awk로 전달하기 위해서는 -v 옵션을 사용할 수 있다.

-v 옵션
-v 옵션을 통해 전달된 변수는 awk의 BEGIN 문에서 사용할 수 있다,

BEGIN
awk가 입력 파일을 처리하기 전에, 수행해야 될 전처리 동작들을 지정할 수 있다.
OFS, RS, FS 등 내장변수의 값을 변경하거나, 사용자 정의 변수의 초기화 등을 하기 위해 쓰인다.

 

  $ cat file
Hello 1  
Hi 2      
Haha 3 

 $ awk 'BEGIN{ FS=":"; OFS="\t"; } {print $1,$2 }' file
hello 1
hi 2
haha 3
$ awk 'BEGIN{ print "Hello, world!" }

BEGIN 블럭은 awk가 입력 파일을 열기 전에 수행되므로, 입력 파일 없이 BEGIN 블럭만 실행할 수도 있다.


END
입력 파일의 모든 줄의 처리가 끝난 후에, 맨 마지막으로 실행할 동작들을 지정할 수 있다.
$ awk '{print $1} END{ print "process done."; }' file
$ awk 'BEGIN{ sum = 0; } /hello/{ sum += $1; } END{ print "sum is "sum; }' file
이렇게 BEGIN, 패턴, command, END 를 모두 함께 사용할 수 있다.

 

Array in awk
awk의 배열은 연관 배열(associative array)로, key와 value를 갖는 Hash Set 이다.
변수와 마찬가지로, 미리 선언하지 않아도 바로 사용할 수 있다. (사용과 동시에 생성된다.)
배열이 사용되는 타입에 따라 0이나 빈 문자열로 적당히 초기화된다.
배열의 순회
for (item in array) {
 print array[item];
}


delete
내장 함수 delete는 배열 요소를 삭제하는데 사용한다. - delete(array[item]);

$ awk '{ arr[x++] = $2; } END{ for(i in arr){ delete(arr[i]); } }' filename
기타 내장함수

sub
정규표현식에 매칭되는 부분을 지정한 문자열로 치환한다. longest 매칭이며, 레코드 내에서 여러번 매칭되어도 맨 왼쪽의 일치하는 부분에 대해서 한번만 치환한다. 치환할 대상을 지정하지 않으면 현재 레코드 전체($0)에 대해서 치환한다.

sub(/정규표현식/, “치환할 문자열”, “치환할 대상”);
sub(/정규표현식/, “치환할 문자열”); - $0 에 대해서 치환

gsub
sub와 유사하나 레코드 내에서 정규표현식이 매칭될 때마다 치환한다.

 

index
문자열 내에서 찾는 문자열이 나타나는 위치를 리턴한다. 위치는 1부터 시작하여 계산된다. - index(“문자열”, “찾는 문자열”);

 

length
문자열의 길이(문자 수)를 구한다.

length(“문자열”)
length 문자열을 지정하지 않으면 현재 레코드 전체($0)에 대한 길이를 구한다.


substr
문자열 내에서 지정한 위치부터의 부분 문자열을 반환한다.

substr(문자열, 시작 위치);
substr(문자열, 시작 위치, 문자열 길이)


match
문자열 내에서 주어진 정규표현식에 매칭되는 패턴이 있으면 시작 위치를 반환하고, 없으면 0을 리턴한다. 추가적으로 문자열이 매칭될 경우, 패턴의 시작 위치를 내장변수 RSTART에 저장하고 부분 문자열의 길이는 RLENGTH에 저장한다. 이는 match 함수로 매칭 여부를 확인 후 substr을 사용하는데 유용하다. 단 nawk에서만 동작한다.

match(“문자열”, /정규표현식/);


split
문자열을 단어 단위로 나누어 배열에 저장한다. 필드 구분자를 지정하지 않으면, 내장변수 FS의 값이 디폴트로 사용된다.

split(문자열, 저장할 배열, 필드 구분자);
split(문자열, 저장할 배열); - 내장변수 FS의 값을 필드 구분자로 사용
$ awk 'BEGIN{ split("05/01/2016", date, "/"); print date[3]; }'
2016

int
소숫점 이하를 버리고 정수부만 반환한다.

int(x)

rand
0~1 사이의 난수를 반환한다.

rand()

 

 

반응형
반응형

Grep의 사용방법에 대해서 알아보는 시간을 갖도록 하겠습니다.

 

grep은 리눅스/유닉스 환경에서 문자열을 파싱할 수 있는 명령어 입니다. 이것을 잘활용하면 많은 효과를 볼 수 있는데 이에 대해 알아보는 시간을 갖도록 하겠습니다.

 

기본 옵션

1. -n : 파일 안에서의 패턴에 발견된 라인 및 라인 번호

2. -v : 패턴이 발견되지 않은 라인을 출력

3. -i : 대소문자 무시 (ignore)

4. -l : 패턴이 들어 있는 파일 이름만 출력

5. -c : 패턴이 들어있는 라인 번호의 개수

 

<옵션 분석>

1. grep 

root@ubuntu:~# grep root /etc/group
root:x:0:

2. grep -v : 해당 패턴을 제외한 결과 행을 출력

root@ubuntu:~# grep -v root /etc/group
daemon:x:1:
bin:x:2:
sys:x:3:

 

3. grep -c : 해당 패턴이 들어간 행의 개수를 카운트하여 출력
root@ubuntu:~# grep -c root /etc/group
1

4. grep -l : 해당 패턴을 대상 파일에 존재하는지를 판단하고 존재한다면 대상 파일명을 출력

root@ubuntu:~# grep -l root /etc/group /etc/hosts /etc/passwd
/etc/group
/etc/passwd

5. grep -i :  대소문자를 구별하지 않고 패턴에 해당하는 문자가 포함된 행을 출력

root@ubuntu:/shell# grep -i boy sample.txt
I am a boy
Boy have a robot

<특수문자>

1. 사각괄호 ([ ]) : [ ] 안에 들어 있는 검색을 모두 수행한다.

2. 마침표 ( . ) : 한 문자를 대신한다. 대신한 문자는 모든 문자로 간주 검색을 한다.

3. 괄호안의 대시 ( [ - ] ) :  - 괄호 안의 무자 잡합의 문자 범위를 지정한다.

4. 탈자기호 ( [ ^ ] ) : ^ 특정 조건에 속하지 않은 문자열을 출력한다.

5. 별표 ( * ) : * 지정한 문자열이 0, 1 , 수 차례 반복된다는 의미

6. 행시작(^)끝($) : ^ 괄호 밖의 탈자기호는 행 시작부만 검색한다는 의미이고 $는 지정한 문자열로 끝나는 행만 검색

 

<특수문자 활용>

1. 사각괄호 ([ ]) : [ ]안의 안의 문자집합을 모두 검색해 출력한다.

root@ubuntu:/shell# grep [bg] sample.txt
I am a boy
Boy have a robot
Robot is a blue
You are a girl
root@ubuntu:/shell# grep [BG] sample.txt
Boy have a robot
Girl have a doll

 

2. - 의 사용

root@ubuntu:/shell# grep [a-z]oy sample.txt
I am a boy
root@ubuntu:/shell# grep [a-z]irl sample.txt
You are a girl
root@ubuntu:/shell# grep [A-Z]irl sample.txt
Girl have a doll
root@ubuntu:/shell# grep [A-Z]oy sample.txt
Boy have a robot
root@ubuntu:/shell# grep [A-Za-z]oy sample.txt
I am a boy
Boy have a robot

 

3. . 의 사용 : . 은 한 문자를 대신하여 그에 속한 모든 문자(공백 포함)를 출력

root@ubuntu:/shell# grep b.y sample.txt
I am a boy
root@ubuntu:/shell# grep b.. sample.txt
I am a boy
Boy have a robot
Robot is a blue
root@ubuntu:/shell# grep b... sample.txt
Robot is a blue
root@ubuntu:/shell# grep b.... sample.txt
Robot is a blue
root@ubuntu:/shell# grep b.... sample.txt

4. [ ] 안의 ^의 사용 : 이것은 혼자 쓰이는 ^와는 다르다. ^은 포함하지 않는 문자열을 검색

root@ubuntu:/shell# grep b[^o]y sample.txt
root@ubuntu:/shell# grep b[^a]y sample.txt
I am a boy
root@ubuntu:/shell# grep [^b]oy sample.txt
Boy have a robot

 

5. *의 사용 : *은 반복을 나타내는 연산 중 하나이다. 파일 검색과는 조금 다르니 혼단하지 말았으면 합니다. 정규연산식에서 *은 지정한 문자열이 반복되는 반복되지 않든 모두 검색하라는 것이다.

root@ubuntu:/shell# grep b*oy sample.txt
I am a boy
Boy have a robot
root@ubuntu:/shell# grep bo*y sample.txt
I am a boy

6.  [ ] 밖의 ^사용 : ^는 지정한 검색 문자열로 시작하는 행만을 검색하여 반환합니다.

root@ubuntu:/shell# grep ^I sample.txt
I am a boy
root@ubuntu:/shell# grep ^B sample.txt
Boy have a robot
root@ubuntu:/shell# grep ^I sample.txt
I am a boy

 

7. $의 사용 : $는 지정한 검색 문자열로 끝나는 행만을 검색하여 반환

root@ubuntu:/shell# grep boy$ sample.txt
I am a boy
root@ubuntu:/shell# grep girl$ sample.txt
You are a girl


 

 

반응형
반응형

리눅스 커널을 분석하기 위해서는 반드시 소스코드 레벨에서 분석이 필요할 때가 있습니다. 물론 모든 경우에 소스코드 레벨 분석이 필요한 것은 아니지만 ... 많은 경우에 필요로 하죠...

 

그때 많이 사용하게 되는 소스코드 분석 준비에 대해 알아보겠습니다.

 

source insight나 eclipe와 같은 GUI기반의 훌륭한 소스 Tool들이 있지만 리눅스 커널 소스코드를 분석하기에는 약간 모자란 부족한 점이 있습니다. 자신의 PC의 사양이 좋다면 상관 없지만 리눅스 소스코드는 100MB가 넘는 엄청난 용량을 자랑하고 이것을 한 프로젝트 구동하게 될 경우에는 문제가 발생할 수 있죠

 

그래서 저는 언제나... vim과 ctag를 이용합니다.

 

vim은 테스트 에디터이고 ctag는 소스코드의 tag를 분석해주는 tool입니다. 그밖에 다른 플러그인들도 많이 있지만 저는 이렇게를 가장 많이 사용합니다.

 

우선 설치 방법은 우분투를 기준으로

 

apt-get install vim ctags -y

 

입력하면 설치가 됩니다.

 

그 다음에는 ctag를 이용해 태그파일을 생성해야 합니다.

이때 2가지 방법이 있습니다

 

1. 소스코드 상위 루트에서 #ctags -R을 사용해서 생성

2. 소스코드 상위 루트에서 #make tags를 사용해서 생성

 

1번과 2번의 차이점은 2번으로 생성할 경우 해당 커널 config 파일을 기반으로 태그 파일을 생성하게 됩니다. 이유는 커널은 대양한 아키텍처를 포함하기 때문에 1번 방법으로 할 경우 중복된 태그가 다수 만들어집니다. 물론 아키텍처 별로 분석을 해야 할 경우에는 1번을 사용해야 되지만 자신의 현재 시스템에 적합한 소스코드를 분석하기 위해서는 2번을 사양해야 됨을 알아두시길 바랍니다.

 

마지막으로 제가 사용하는 vim 설정파일을 제안하는 것으로 마무리 하겠습니다.

 

 set shiftwidth=2             ">>나 << 사용시 들여쓰기 간격을 지정합니다.
set visualbell            "사용자실수를 경고할때 비쥬얼 벨을 사용함                 
set nobackup                 "백업 파일을 생성하지 않음
set cindent                  "C스타일의 들여쓰기를
set ruler                    "커서의 위치를 표시함사용함
set autoindent               "자동들여쓰기를 사용
set smartindent              "지능적인 들여쓰기 사용
set incsearch                "키워드를 입력할때 마다 검색하는 점진 검색을 사용
set ruler                    "커서의 위치를 표시함
set showcmd                  "화면마지막 라인에 커맨드 표시
set backspace=2              "삽입모드에서 백스페이스를 계속 허용
set wrapscan                 "찾기에서 파일의 맨끝에 이르면 처음부터 다시 찾음
set title                    "타이틀 바에 현재 편집중인 파일을 표시
set number                   "줄번호표시
set ts=2                     "tab 키를 스패이스바 2개로 구분     
syntax on                    "구문강조기능 사용
filetype on                  "파일종류에 따라 구문을 강조
set background=dark          "배경색을 어두운 색으로
colorscheme evening          "색상테마를 evning으로
set history=1000             "편집기록을 1000개 등록
set hlsearch                 "검색어 기능 강조
set ignorecase               "검색시 대/소문자 구분 없음
set showmatch                "닫는 괄호를 입력할 때
set novisualbell             "화면깜박거리지 않기
set backspace=indent,eol,start  "줄의 끝, 시작, 들여쓰기에서 백스페이스를 사용하면 이전줄과 연결

"################### 단축키 설정 ####################"
"파일 버터간 이동 "
map ,1 :b!1<cr>
map ,2 :b!2<cr>
map ,3 :b!3<cr>
map ,4 :b!4<cr>
map ,5 :b!5<cr>
map ,6 :b!6<cr>
map ,7 :b!7<cr>
map ,8 :b!8<cr>
map ,9 :b!9<cr>
map ,0 :b!0<cr>
map ,w :bw <cr>

"F2 == 폴딩하기  "
map <F2>  z]}zf

"F3 == 저장 "
map <F3> : w! <CR>
map <F3> <ESC> <F3>

"F4 == 탭열기, Ctrl+h,l로 탭이동 "
map <F4> : tabnew<CR>
map <C-h> gT
map <C-l> gt

"F5 == 컴파일 후 결과보기 / 오류난 라인으로 이동
map <F5> : w<cr> :make<cr> :ccl<cr> :cw<cr>

"F6 == Taglist 열기
map <F6> : TlistToggle<CR>

"F7 == 태그리스트 넘어 다니기
map <F7> <c-w> <c-w>

"F8 == 디렉토리 목록 열기
map <F8> : NERDTree<CR>

"F12 == 저장후 종료
map <F12> : wq! <CR>
map <F12> <ESC> <F12>


"=============== ctags 설정 ================"
set tags=./tags,../tags,../../tags,/usr/src/linux/tags,/usr/src/mango100_kernel_2010_07_15/tags


"세부 코드 보여주기 "
if version >= 500
func! Sts()
 let st = expand("<cword>")
 exe "sts ".st
endfunc 
nmap ,st :call Sts() <CR>

func! Tj()
 let st = expand("<cword>")
 exe "tj ".st
nmap ,tj :call Tj() <CR>
endfunc
endif

"=============== cscope 설정 ================"
"set csprg=/usr/bin/cscope
"set csto=0
"set cst
"set nocsverb

if filereadable("./cscope.out")
 cs add cscope.out
else
 cs add /usr/src/linux/cscope.out
endif
set csverb

func! Css()
 let css = expand("<cword>")
 new
 exe "cs find s ".css
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,css :call Css()<cr>

func! Csc()
 let css = expand("<cword>")
 new
 exe "cs find c ".csc
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,csc :call Csc()<cr>

func! Csd()
 let csd = expand("<cword>")
 new
 exe "cs find d ".csd
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,csd :call Csd()<cr>

func! Csg()
 let csg = expand("<cword>")
 new
 exe "cs find g ".csg
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,csg :call Csg()<cr>

 

"============== Man page 설정 ==============="
func! Man()
 let sm = expand("<cword>")
 exe "!man -S 2:3:4:5:6:7:8:9:tcl:n:l:p:o ".sm
endfunc
nmap ,ma :call Man()<cr><cr>

 

"############### taglist ##########################"
let Tlist_Display_Tag_Scope = 1 "태그 범위를 표시합니다
let Tlist_Display_Prototype = 1 "함수의 원형을 표시합니다
let Tlist_Sort_Type="name"      "태그리스트를 이름 순서로 표시합니다.

 

반응형

+ Recent posts