Header

  1. View current page

    종텐의 작업실

Profile_img_60x60_01
1

Emacs 팁

[EmacsW32]

http://faq.ktug.or.kr/faq/EmacsW32

http://ourcomments.org/cgi-bin/emacsw32-dl-latest.pl

http://wiki.kldp.org/wiki.php/EmacsWin32Install

 

[이맥스 문서 모음]

http://wiki.kldp.org/wiki.php/CategoryEmacs

 

[루비 모드]

http://wiki.kldp.org/wiki.php/EmacsRubyMode

 

 

 

 

인텔리 센스 : http://wiki.kldp.org/wiki.php/EmacsDynamicAbbrevExpand

테마 : http://wiki.kldp.org/wiki.php/EmacsColorTheme

 

 

 

 

출처 : http://www.pie.pe.kr/cgi-bin/moin.cgi/EmacsTip

 


 

이 페이지는

vim 에서 쓰던 기능들이 emacs 에서는 어떻게 하면 되는지 찾아보던중, 이곳에 내가 찾던 내용이 많은것을 발견하고, 몇몇부분을 옮겨적어두기 위해 만들었다. 원 링크의 내용을 그대로 가져온것은 아니어서 약간의 차이가 있다. 그냥 생각나는 대로 적어가는 것이라 CategoryEmacs 의 다른 페이지들과 내용이 겹칠수도 있겠다.

이 페이지에 내용들을 조금씩 추가하면서, http://www.emacswiki.org/cgi-bin/wiki/EmacsNiftyTricks 와는 상당히 무관한 페이지가 되었다. vim 사용자를 위한 emacs 랄까? 그런 내용을 여기 적어둔다.

2005(?)년경부터는 vim 은 완전히 잊어먹었기 때문에 vim 과의 비교글은 이제 더이상 적지 못하고 Emacs 에 대해서만 적는다. 따로 페이지를 열기엔 분량이 적은 경우 이곳에 몰아넣는 용도로 써야지(2007/08/01)

 

point 아래의 단어를 검색하기

C-s 후 C-w

C-s 후 C-w 를 누르면 point 아래의 단어가 입력된다. 약간 차이가 있긴 한데, vim 에서는 CTRL-r CTRL-w 를 누르면 비슷한 일을 할수 있었다.

 

단어 highlight

C-x w h

단어 highlight

C-x w r

highlight 단어 빼기

hl-lock-mode 가 제공하는 기능으로, 그중 자주쓰는 것이 위의 두가지. vim 에서는 단어위에서 % 를 누르는것만으로 가능했는데, 키바인딩이 다소 복잡하다. 자주 쓰게 된다면 좀 편한 함수, hi-word-at-point 등을 만들어서 쓰자.

현재 내가 쓰는 cvs emacs 는 이전 stable 때의 hi-lock-mode 와 약간 다르게 도는 버그가 있다.

 

tab 키 입력하기

C-q 후의 키입력

key-sequence 를 무시하고 바로 입력

C-q 후에 키를 누르면 그 키가 그대로 입력된다. vim 에서도 CTRL-v (윈도에서는 CTRL-q) 가 유사한 일을 한다.

 

picture-mode(virtual edit in vim)

M-x picture-mode

picture-mode 시작

C-c C-c

picture-mode 종료

vim 의 virtual edit 와 유사하다. artist-mode 라는 골때리는놈도 있는데, 세로쓰기, 역방향으로 쓰기 등등 텍스트로 여러가지 장난을 할수있다.

 

n 만큼 명령 반복 수행하기

C-u 횟수 키시퀀스

키시퀀스 를 횟수 만큼 반복한다

이 내용은 튜터리얼에 소개되어 있다.

 

마지막 명령 반복하기

C-x z

C-x z z z z

vim 에서는 . 에 해당한다. 여러번 반복하려면 z 만 눌러주면 된다. undo 등을 계속해서 할때 편리하다.

 

원하는 line 으로

M-x goto-line

M-g M-g

vim 에서는 :라인 에 해당된다. 기본적으로 키 바인딩이 안되어있다.

22.1 부터는 M-g M-g 또는 M-g g 등등으로 키바인딩이 추가되었다. (2007/08/01)

 

키보드 매크로

이 페이지를 만들기 전에 만들어 둔것. 이 페이지로 합쳐야 할텐데 귀찮아서 링크만.

 

자동완성

M-/

dabbrev-expand

M-RET

complete

자동완성은 이외에도 여러가지가 있는데, 내가 emacs 에서 쓰는건 M-/ 가 주로 쓰여지더라. vim 에서는 CTRL-p, CTRL-n 외에도 CTRL-x CTRL-l 로 라인단위의 자동완성도 지원하는데 emacs 에서는 아직 못찾았다. hippie-expand 라는것도 좋다는데 아직 써보지 않았다.

 

외부 프로그램의 출력을 버퍼에 넣기

C-u M-!

shell 명령을 실행하고 그 결과를 버퍼에 뿌린다

C-u M-|

현재 선택된 region 을 어떤 프로그램의 입력으로 넣고, 그 출력으로 선택된 regeion 을 replace 한다.

이것 때문에 이 페이지를 만들게 되었다. vim 에서는 :r! 명령 으로 쓰면 되고 내가 아주 자주 쓰던 것이다.

C-u M-| 는 vim 에서는 어떻게 하는지 모르겠는데, 아주 쓸만해 보인다. 예를들어 예를 들어 C-x h C-u M-| uniq RET 를 해서 버퍼내의 내용들을 uniq 하게.. 등등

 

bookmark

C-x r m 이름

bookmark 지정

C-x r b 이름

bookmark visit

C-x r l

bookmark 리스트

M-x bookmark-delete

bookmark 지우기

vim 에서는 m문자 로 지정하고 `문자 로 찾아갔었다. 역시나 vim 과는 약간 느낌이 다르다. visual studio 에서 쓰던 f2 로 적당히 바인드 하는것도 좋을듯?

 

fill-paragraph

M-q

긴 문장을 적당한 길이(fill-column 변수에 지정)에 엔터를 넣어서 보기좋게 해준다. 처음엔 이거 어디다 쓰나 했는데, 뜻밖에 아주 자주 쓰게 되더라. auto-fill mode 라는 것도 있다.

 

indent 새로 하기

C-M-\

vim 에서의 =, 또는 visual studio 의... 음.. alt-f8 이던가? 안쓴지 오래되서 기억이 안나는군. 어쨋건 그런 존재.

 

전체 region 잡기

C-x h

자주 쓰게 된다.

 

C-z, C-x, C-c, C-v 등을 윈도우 처럼

cua-mode 라는게 있다고 하는데 내경우는 쓰지 않는다. 그냥 적어만 둔다. toggle 방식이라서, copy-paste 작업을 할때만 잠시 켰다가 끄는 사람도 있더라.

 

shift-arrow 로 region 잡기

pc-selection-mode

윈도에서처럼 shift-arrow 키로 region 을 잡는다. 이놈과 cua-mode 를 같이 쓰면 윈도처럼 쓸수 있다.이곳을 더 읽어보자 이미 emacs 의 kill,yank 에 익숙해져서 이걸 쓸일은 없겠지만..

 

copyright 삽입

M-x copyright

copyright 삽입

M-x copyright-update

copyright update 현재 연도 추가

허.. 별게 다있네..

 

주석 * 자동으로 써주기

C-M-j

vim 에서 다음과 같이 formatoptions 을 조정해주면 /** 이후 엔터를 치면 * 를 써주게 된다.

  • au BufNewFile,BufRead *.h,*.c,*.cpp execute ":set fo=croql"

emacs 에서는 comment-indent-new-line 라는 것으로 비슷한 기능을 구현하고 있다. comment-indent-new-line 는 기본적으로 C-M-j 로 바인딩 되어있다. 이거.. RET 를 상황에 따라 M-j 또는 C-M-j 로 바인딩 해주면 똘똘하게 돌것 같은데 elisp 을 아직 잘 몰라서 애석하다.

  • 추가.
    저렇게 어렵게 하지 않아도 될것 같다.
    AdaptiveFill mode, 또는 그 확장판인 http://www.wonderworks.com/download/filladapt.el
    등을 쓰면 해결이 될듯 하다.

참고로, comment 관련 명령들은..

M-;

현재줄에 주석 달기(자주 쓰게 된다)

C-u M-;

현재줄 주석 지우기

C-x ;

comment-set-column

C-M-j

comment-indent-new-line 바로 위에서 언급

M-x comment-region

선택된 범위를 주석처리/또는 주석 해제

transient-mark-mode 상태고, 선택된 영역이 있다면 M-; 는 comment-region 을 부른다. 한마디로 M-; 는 기억해 둘것.

 

선택영역 shift 하기

C-x TAB

오른쪽으로 한칸 시프트

C-u 5 C-x TAB

오른쪽으로 5칸 시프트

C-u - 10 C-x TAB

왼쪽으로 10칸 시프트

vim 으로 치면 << 또는 >> 에 해당한다. 역시 vim 과 마찬가지로, 한줄에 대해서, 또는 region 을 잡은상태에서 하면 region 전체에 적용되게 된다. vim 과 다른점은 vim 은 shift 를 한번하면 shiftwidth 만큼 해줘서 탭을 넣어준것 같은 효과를 주기 편한데 비해 emacs 는 space 하나 단위로 해서 좀 귀찮다는게 문제.

이런이유로, vim 에서는 코딩을 하다가, >> 등으로 인덴트를 조절하는 경우가 많았는데, emacs 에서는 C-M-\ 을 써주도록 하자. 이것을 여기 적는 이유는 C-u - 10000 C-x TAB 처럼 큰 음수로 왼쪽으로 땡겨줘서 indent 를 없애 버려야 하는 경우가 종종 있기 때문이다. 이런경우 외에는 그냥 C-M-\ 을 쓰고, vim 시절의 << >> 를 사용하던 습관은 버려야 겠다.

 

짝괄호 찾기

  • ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; vim 의 % 처럼, 짝이 맞는 괄호를 찾아주는 놈
    ;; http://www.emacswiki.org/cgi-bin/wiki/MatchParenthesis
    ;; 에서 가져왔다.
    ;; 키바인딩이 항상 고민인데.. C-c % 는 겹칠 가능성이 큰것 같은데.. 쩝
    ;; EmacsWiki 에서 누군가 제안한 META META 로 해볼까 하다가 일단 C-c % 로 했다.
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (defun match-paren (arg)
    "Go to the matching paren if on a paren; otherwise insert %."
    (interactive "p")
    (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
    ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
    (t (self-insert-command (or arg 1)))))
    ;; % 에 바인딩
    ;; % 위에서 % 를 입력하려면 C-q %
    (global-set-key (kbd "%") 'match-paren)

emacs 에는 show-paren-mode 가 있어서 % 의 필요성이 좀 덜하지만 그래도 최대한 vim 시절과 유사하게 세팅해놓는 것이 내 목표이니 이내용을 추가한다.

 

vim 의 TagList 플러그인

이부분은 따로 페이지를 만들 생각이니 간단하게 적는다. cedet 와 ecb 를 설치해서 vim 의 TagList 와 유사하게 쓰는게 가능하다. ecb 는 여러가지 레이아웃을 지원하는데, 그중 left9 레이아웃이 TagList 에 가장 근접하다. CEDET와ECB 페이지를 보자.

 

emacs 에서 tag 사용

UsingTagsWithEmacs

etags 사용

UsingGnuGlobalWithEmacs

GNU global 사용 이쪽이 더 좋다

 

occur buffer

M-x occur

M-x grep 과 유사한데, 파일 대상이 아니고 현재 버퍼를 대상으로 한다. vim 에서는 이런걸 써본적이 없는데.. 알아두면 쓸곳이 있을것 같아서 적어둔다. 여러가지로 응용할수가 있는데, http://www.emacswiki.org/cgi-bin/wiki/OccurBuffer 를 봐두자.

 

.h 와 .cpp 전환

M-x ff-find-other-file

vim 에서는 :A plugin 으로 했던것. 기본적으로 바인딩이 안되어있어서, 자주쓰려면 바인딩부터...

 

현재 포인트(커서) 아래의 정보 보기

C-x =

what-cursor-position

현재의 offset, 상대적인 위치, hex 값 등을 볼수 있다. 예를들어 이렇게 나오게 된다.

  • Char: s (0163, 115, 0x73) point=2311 of 6285 (37%) column 22 

 

커서 이동

C-f     한 문자 앞쪽으로 움직인다
C-b 한 문자 뒷쪽으로 움직인다

M-f 한 단어 앞쪽으로 움직인다
M-b 한 단어 뒷쪽으로 움직인다

C-n 앞 줄로 움직인다
C-p 뒷 줄로 움직인다

C-a 줄의 시작으로 움직인다
C-e 줄의 끝으로 움직인다

M-a 문장의 시작으로 움직인다
M-e 문장의 끝으로 움직인다

삭제

<Delete>     깜박이 직전의 문자 지우기
C-d 깜박이 다음의 문자 지우기

M-<Delete> 깜박이 직전의 낱말 죽이기
M-d 깜박이 다음의 낱말 죽이기

C-k 깜박이 위치로부터 줄 끝까지 죽이기
M-k 현재 문장의 끝까지 죽이기

정규식 도우미

M-x re-builder

으.. 없는게 없다. vim 과 정규식이 너무 달라서 혼동스러운데, 이걸 찾아서 다행이다.

주석문 스펠링 검사

M-x flyspell-prog-mode

ispell 또는 aspell 이 깔려있어야 한다. 위의 모드를 쓰면 aspell 등을 이용해서 주석문의 스펠링 검사를 해준다. aspell 이 윈도용으로 포팅된게 있어서 설치는 해봤는데, 속도가 너무 느려서 flyspell-prog-mode 를 c-mode-hook 에 넣지는 않았다. aspell 이 한글도 검사해주면 좋았을텐데 아쉽다.

  • ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; ispell 설정
    ;; 영어로 주석을 달기 위해서 flyspell-prog-mode 를 쓰고싶었는데,
    ;; 이거 켜니까 너무 느리구나.
    ;; 그냥 aspell 깔아만 둔다.
    ;; aspell 은 http://aspell.sourceforge.net/ 에서 윈도용 포트도 받을수 있다.
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (when win32p
    (setq-default ispell-program-name "C:\\Program Files\\Aspell\\bin\\aspell"))
    (when unixp
    (setq-default ispell-program-name "aspell"))

현재 버퍼에 다른 파일 내용 추가, insert-file

C-x i

insert-file

insert-file-contents

elisp 으로 실행할때

vim 에서는 :r 파일명 이던가.. 이제 vim 은 가물가물하다.

이전 수정하던 곳으로 돌아가기

C-u C-SPC

이전 set-mark 위치로 pop 하기

이건 일종의 편법(?)인데... C-SPC 는 region 을 잡기 위한 명령이지만 C-u prefix 를 넣어주면 바로 이전에 set-mark 가 된곳으로 돌아가게 된다. 이 set-mark 는 스택구조로.. C-u C-SPC 를 할때마다 pop 된다.

즉, 어떤 버퍼내의 위치를 간단히 기억해두려면

C-SPC C-g

그자리에 set-mark

C-u C-SPC

바로 전자리로 pop

#ifdef 등 필터링 하기

M-x cpp-highlight-buffer

cpp-highlight-buffer is an interactive compiled Lisp function in `cpp'.
(cpp-highlight-buffer arg)

Highlight C code according to preprocessor conditionals.
This command pops up a buffer which you should edit to specify
what kind of highlighting to use, and the criteria for highlighting.
A prefix arg suppresses display of that buffer.

필요할때 실행해보면 간단히 쓸수 있다. 설정이 번거로우니 코드가 복잡할때만 쓰자.

M-x hide-ifdef-read-only

이것도 사용가능한데 쓰는 방법을 잘 모르겠다.

local variable

텍스트 파일의 첫줄에 이렇게 적으면, 하드탭, 8칸, c++-mode 로 그 파일을 열게 된다.

  • // -*- mode: c++;  tab-width:8; indent-tabs-mode:t; c-basic-offset:8; -*- 

또는 파일이 마지막에 이렇게 적을수도 있다.

  • // Local Variables:
    // mode: c++
    // tab-width:8
    // indent-tabs-mode:t
    // c-basic-offset:8
    // End:

vim 에서는

  • // vim:ts=8:sw=8:noet

이렇게 적는게 있는데, 이걸 뭐라고 하는지는 잊었다.

참고로, inkscape 라는 놈은 이렇게 해놓고 쓰더라.

  • 줄 번호 보이기/숨기기
       1 /*
    2 Local Variables:
    3 mode:c++
    4 c-file-style:"stroustrup"
    5 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
    6 indent-tabs-mode:nil
    7 fill-column:99
    8 End:
    9 */
    10 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :

vim 의 * 와 #

vim 에서 즐겨쓰던놈이라 Emacs에 없어서 좀 아쉬웠는데 위에도 적혀있지만 단어 highlight 로 대신했었다. 그런데 EmacsWiki 에 비슷한 구현을 해놓은게 있더라. http://www.emacswiki.org/cgi-bin/wiki/VagnJohansen

하지만 이구현은 하이라이팅을 해주지는 않아서 vim 과는 느낌이 좀 다른데.. 하이라이팅을 하도록 추가해서 쓰던가하자

  • (global-set-key [C-M-down] 'vjo-forward-current-word-keep-offset)
    (global-set-key [C-M-up] 'vjo-backward-current-word-keep-offset)

    (defun vjo-forward-current-word-keep-offset ()
    " (Vagn Johansen 1999)"
    (interactive)
    (let ((re-curword) (curword) (offset (point))
    (old-case-fold-search case-fold-search) )
    (setq curword (thing-at-point 'symbol))
    (setq re-curword (concat "\\<" (thing-at-point 'symbol) "\\>") )
    (beginning-of-thing 'symbol)
    (setq offset (- offset (point))) ; offset from start of symbol/word
    (setq offset (- (length curword) offset)) ; offset from end
    (forward-char)
    (setq case-fold-search nil)
    (if (re-search-forward re-curword nil t)
    (backward-char offset)
    ;; else
    (progn (goto-char (point-min))
    (if (re-search-forward re-curword nil t)
    (progn (message "Searching from top. %s" (what-line))
    (backward-char offset))
    ;; else
    (message "Searching from top: Not found"))
    ))
    (setq case-fold-search old-case-fold-search)
    ))
    (defun vjo-backward-current-word-keep-offset ()
    " (Vagn Johansen 2002)"
    (interactive)
    (let ((re-curword) (curword) (offset (point))
    (old-case-fold-search case-fold-search) )
    (setq curword (thing-at-point 'symbol))
    (setq re-curword (concat "\\<" curword "\\>") )
    (beginning-of-thing 'symbol)
    (setq offset (- offset (point))) ; offset from start of symbol/word
    (forward-char)
    (setq case-fold-search nil)
    (if (re-search-backward re-curword nil t)
    (forward-char offset)
    ;; else
    (progn (goto-char (point-max))
    (if (re-search-backward re-curword nil t)
    (progn (message "Searching from bottom. %s" (what-line))
    (forward-char offset))
    ;; else
    (message "Searching from bottom: Not found"))
    ))
    (setq case-fold-search old-case-fold-search)
    ))

TODO 등을 강조해서 표현하기

vim 에서 지원해서 꽤나 맘에 드는 기능이었는데 Emacs 에서는 아래내용을 추가하면 된다.

  • ;; TODO, BUG 등에 강조표시
    (font-lock-add-keywords 'c++-mode
    '(("\\<\\(FIXME\\):" 1 c-nonbreakable-space-face prepend)
    ("\\<\\(TODO\\):" 1 c-nonbreakable-space-face prepend)
    ("\\<\\(BUG\\):" 1 c-nonbreakable-space-face prepend)
    ("\\<\\(NOTE\\):" 1 c-nonbreakable-space-face prepend)))

인코딩 관련

메뉴의 Option | Mule | Set Coding System 만 알아두면 된다 자주 쓰는 명령들이 아니니 키바인딩은 생략

C 소스 찾아서 indent 하기

http://dreamstorm.tistory.com/16 에도 적어둔다. 위키쓸까 블로그쓸까..

  • (defun indent-all-files (dir)
    "지정된 디렉토리 아래에서 C 소스파일들을 찾아 indent
    한다. 사용하기 전에 상황에 맞게 조금씩 수정하면서 사용하자."
    (interactive "D")
    (save-excursion
    (dolist (file (findr "\\.c$\\|\\.h$" dir))
    (unless (string-match "_darcs" file)
    (set-buffer (find-file-noselect file))
    (message "indenting %s..." file)
    (mark-whole-buffer)
    (call-interactively 'indent-region)
    (when (buffer-modified-p)
    (message "done.")
    (save-buffer))
    (kill-buffer (current-buffer))))))

NEWS 보기 && NEWS 를 보면서 새로 배운 것들

C-h n 을 통해서 Emacs 내에 포함된 NEWS 파일을 읽을수 있다. 잠시 읽어보고 아래 내용들을 건졌다. 내용이 너무 많아서 읽다 말았으니 틈틈히 마저 읽어보자 (2007/08/01)

M-g M-g

goto-line 에 키바인딩. 원래는 이놈에 키바인딩이 없어서 super-g 로 바인딩해서 쓰고 있었는데 이번 버전부터 이게 지원되더라. M-g 로 시작하는 키시퀀스가 이제 공간이 생겼으니 내가 몇개 추가해서 쓰는것도 좋을듯.

C-S-<backspace>

kill-whole-line vim 의 dd 가 가능해졌다.

M-SPC

just-one-space 키보드 매크로시 유용할듯 사실 이놈보단 x 좌표만 이동시켜주는 놈이 있으면 더 좋을거 같은데.. 언제 찾아보자

C-x 5 C-o

새 프레임으로 창을 열어주는데 듀얼모니터를 쓸때 유용할거 같다. 아직 모니터 한대 쓰는지라 잘은 모르겠지만.

마우스왼클릭

링크를 따라거거나 할때 2 버튼이 기본이라 불편했는데 이번에 수정되었다

C-x RET r

revert-buffer-with-coding-system 요놈도 NEWS 보다 건진놈. 종종 써먹을듯

C-x C-v

ffap-alternate-file

그외 이런 모드들이 추가되었다고 한다. 언젠가 한번쯤 써볼까 했던 놈들이 기본으로 포함되었다고 하니 여기 적어두고 나중에 틈나면 문서나 읽어보자

erc

IRC mode

rcirc

IRC mode

newsticker

요건 전에 쓰던놈.. 블로그라인즈 에 만족하고 있기 때문에 다시 쓸것 같지는 않지만..

ses-mode

스프레드시트

table

...

flymake

이건 꼭 써보고 싶은 모드이긴 헌데.. 똥컴 벗어나면 한번 세팅해보자

follow mode, master mode, scroll all mode

좌우로 버퍼를 나눠 띄우고 동시에 스크롤을 시켜보려고 했는데 몇가지 방법들이 있더라.

  • follow-mode
  • master-mode
  • scroll-all-mode


CategoryEmacs

History

Last edited on 04/05/2008 16:35 by jong10

Comments (0)

You must log in to leave a comment. Please sign in.