2011년 7월 26일 화요일

[Emacs] 특정 영역을 이동시키기

Emacs에서 선택한 영역을 위/아래 라인으로 이동시키는 기능 소개.

... 쓸 모 없는 기능일지도 모른다. 왜냐하면 영역을 선택하고 cut(C-w) 한 뒤에 원하는 위치에 paste(C-y)하면 되기 때문이다. 그런데, 이런 기능을 지원하는 에디터가 대표적으로 TextMate 등등이 있는데 아무래도 있으면 비주얼적인 면에서 의외로 편한가보다.

자 그럼 무한확장을 자랑하는 Emacs 인 만큼 관련 기능을 구현해보자.
(defun move-region (start end n)
  "Move the current region up or down by N lines."
  (interactive "r\np")
  (let ((line-text (delete-and-extract-region start end)))
    (forward-line n)
    (let ((start (point)))
      (insert line-text)
      (setq deactivate-mark nil)
      (set-mark start))))

(defun move-region-up (start end n)
  "Move the current line up by N lines."
  (interactive "r\np")
  (move-region start end (if (null n) -1 (- n))))

(defun move-region-down (start end n)
  "Move the current line down by N lines."
  (interactive "r\np")
  (move-region start end (if (null n) 1 n)))

(defun move-line-region-up (start end n)
  (interactive "r\np")
  (if (region-active-p) (move-region-up start end n) (move-line-up n)))

(defun move-line-region-down (start end n)
  (interactive "r\np")
  (if (region-active-p) (move-region-down start end n) (move-line-down n)))

(global-set-key (kbd "M-p") 'move-line-region-up)
(global-set-key (kbd "M-n") 'move-line-region-down)
영역을 선택하고 M-p 혹은 M-n 키를 누르면 선택한 영역이 위/아래로 이동하게 된다. 영역을 선택하지 않으면 현재 라인의 텍스트가 이동하게 된다.

cua-mode와의 호환성 같은 건 없으리라 생각된다.

원문 참고:

댓글 3개 :

tkHWANG :

아주 좋네요. 매번 Emacs tip 잘 보고 있습니다.
고맙습니다. ㅋㅋ

Seorenn :

아 매번 봐 주시다니 감사합니다 ;ㅅ;

익명 :

http://www.emacswiki.org/emacs/MoveLine
이 내용도 추가 되어야 되네요.^^