Egloos | Log-in
F/OSS study
F/OSS study
[emacs] C 소스 코드 볼 때 preprocessor condition 단위로 이동하기
emacs의 c-mode는 preprocessor 조건식 단위로 이동할 수 있는 command를 제공한다.
  • 해당 조건식의 끝으로 이동 : c-forward-conditional
  • 해당 조건식의 처음으로 이동 : c-backword-conditional
  • 해당 조건식 내에 포함된 다른 조건식의 처음으로 이동 : c-down-conditional
  • 해당 조건식을 포함한 조건식의 처음으로 이동 : c-up-conditional
아래과 같은 파일이 있다고 할 때 각각은 다음과 같이 동작한다.
#ifdef __HEADER_H            // 1a
#define __HEADER_H

#ifdef KERNEL                // 2a

#if BITS_PER_LONG == 32      // 3a
#else                        // 3b
#endif                       // 3c

#else /* KERNEL */           // 2b

#endif /* KERNEL */          // 2c

#endif /* __HEADER_H */      // 1b

각각은 간단히 up, down, forward, backward로 나타내면 다음과 같다.
  • up : 3x -> 2a, 2x -> 1a
  • down : 1a -> 2a, 2a -> 3a
  • forward : 1a -> 1b, 2a -> 2c, 3a -> 3c
  • backward : 1b -> 1a, 2c -> 2a, 3c -> 3a
기본적으로는 #else 부분을 건너뛰게 되는데
up, down 시에는 command 뒤에 -with-else를 붙여서 #else 부분을 포함시킬 수 있다.
  • down-with-else : 3a -> 3b
하지만 (막상 필요한) forward/backward는 -with-else command가 없기 때문에
중간에 다른 조건식이 들어있는 1과 2에서는 이를 이용할 수 없다.
(cc_cmds.el 파일을 들여다보면 구현은 되어 있는 것 같은데 동작이 제대로 안되는 듯 싶다..
사용자 불량인가.. -_-;;)

하지만 up/down -with-else를 이용하면 이를 해결할 수는 있다.
up과 down은 (-with-else 포함) argument를 넘길 수가 있는데
이는 해당 명령의 반복 횟수에 해당하며 특히 음수를 넘기면 시작 위치가 아닌 끝 위치로 이동한다.
따라서 down-with-else로 먼저 이동한 후에 같은 level이 아닌 다른 조건식이 나온다면
-1을 인자로 넘긴 up-with-else를 이용하여 해당 level의 #else 부분으로 돌아올 수 있다.
(뭐 자동화시킬만한 여지가 있긴 하지만 귀찮으니 패스~)
  • down-with-else : 2a -> 3a
  • up-with-else (-1) : 3a -> 2b
간단히 이를 함수로 만든 후에 키를 바인딩하면 간단하게 사용할 수 있다.
(define-key c-mode-base-map "\C-c\C-j" 'c-down-conditional-with-else)
(define-key c-mode-base-map "\C-c\C-k" 'c-up-conditional-with-else-back)

(defun c-up-conditional-with-else-back()
  (interactive)
  (c-up-conditional-with-else -1))
by namhyung | 2009/10/09 15:05 | Tips | 트랙백 | 덧글(0)
트랙백 주소 : http://studyfoss.egloos.com/tb/5136117
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
documentation bash gcc computer-architecture binutils awk build x86 scm linux vcs synchronization blktrace block-layer CARM kernel SMP memory script C glibc elf perf compiler patch emacs git CAaQA3 sed algorithm
전체보기
이글루 파인더

최근 등록된 덧글
1번은 call-stack 금방 확인이 ..
by 혁 at 11/13
해당 문법에 대한 자세한 가이드 같..
by ㅇㄷㅎ at 11/07
perf에 대한 설명 감사드립니다! ..
by flavono123 at 10/24
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X