괄호 쌍을 쉽게 맞추기 위한 show-paren-mode, electric-pair-mode

1 minute read

(progn
  (show-paren-mode t)
  (setq
   ;; 괄호만 강조
   show-paren-style 'parenthesis
   ;; 괄호 강조를 즉시 보여준다
   show-paren-display 0
   ;; 괄호 입력 후 내용 입력시 괄호를 강조
   show-paren-when-point-inside-paren t
   )
  )

show-paren-mode 를 사용해 괄호 쌍을 강조하게 했다. 표현식(expression)을 강조하는 건 노이즈가 심해서 괄호만 강조하게 수정했다.

(progn
  (electric-pair-mode 1)
  (setq electric-pair-pairs '((?\{ . ?\})
                              (?\( . ?\))
                              (?\[ . ?\])
                              (?\" . ?\")))
  )

electric-pair-mode 를 사용해 괄호 쌍을 맞춰주게 했다. ( 문자를 입력해 괄호를 열면 자동으로 닫는 ) 문자를 삽입해주는 모드다. 다른 구분자(delimiter)도 등록했다.

(progn
  (defun smart-tab-jump-out-or-indent (&optional arg)
    (interactive "P")
    (let ((closings (mapcar #'cdr electric-pair-pairs))
          (after (char-after)))
      (if (member after closings)
          (forward-char 1)
        (indent-for-tab-command arg))))

  (global-set-key [remap indent-for-tab-command] 'smart-tab-jump-out-or-indent)
  )

snippet을 쓰다 보니 TAB 키를 눌러 빠져나오는 게 익숙하다. ( 문자로 괄호를 자동으로 닫아 () 문자열이 있을 때, ) 문자를 입력하면 ()) 문자열이 되는 게 아니라 닫는 ) 문자 입력을 무시하는 기능이 있어서 () 문자열이 된다. ) 문자를 입력해서 빠져나오거나 커서를 움직여서 괄호를 빠져나올 수도 있지만 TAB 키가 더 편하다. Anyway to tab out of parentheses? 답변을 참고해 함수를 만들어 추가했다.

smartparens 패키지를 사용해볼까도 생각했지만 지금은 emacs 기본 모드로도 충분하다. lisp, clojure 프로그래밍을 자주 한다면 smartparens 패키지의 괄호 조작 때문에 사용했을 것 같다. 가끔 emacs lisp를 만지는 게 전부라 emacs 기본 모드로 충분하다.

괄호 쌍 맞추는 작업에 맞춰 하나 더 해야 할 게 있다. electric-pair-mode 를 활성화하면 처음부터 입력할 때는 불편한 게 없지만, 수정할 때 괄호로 감쌀 게 있다면 자동으로 입력되는 ) 문자를 매번 지워줘야 해서 불편하다. 그래서 괄호로 감싸는 기능이 필요하다. 이거까지 해줘야 불편함 없이 사용할 수 있다. 다음 글로 쓸 예정이다.

PS: electric pair 는 어떤 뜻일까? 일렉트릭 기타의 일렉트릭과 같은 뜻인데, 왜 전기의 라는 단어를 사용한 걸까? 자동이란 뜻이 담긴 단어라서 쓴 걸까?

링크

C-x C-s C-x C-c