ㅈㅅㄹ

Emacs에서 shell-mode 에서 뿌리는 ansi color가 테마 색이랑 잘 맞지 않아서 가시성이 떨어지거나 할 때가 있다. 내 경우는 color-theme-tomorrow-night-eighties이나 color-theme-tomorrow-night-blue 테마를 사용하는데, 둘 다 ansi blue 색상의 가시성이 떨어져서 ls를 치면 디렉토리가 잘 보이지 않는 문제가 있었다.


물론 입맛대로 ansi color 각각에 해당하는 색상을 지정해 줄 수 있다. ansi-color.el 라이브러리를 통해 이러한 일을 할 수 있는데, 아래는 내 컬러값 세팅 예시이다.

(eval-after-load 'ansi-color
  '(progn
     (setq ansi-color-names-vector
           ["black" "tomato" "chartreuse1" "gold1"
            "DodgerBlue3" "MediumOrchid1" "cyan" "white"])
     (setq ansi-color-map (ansi-color-make-color-map))))

ansi-color-names-vector에 아래 표에 보이는 것과 같이 코드 값 순서대로 원하는 색상을 적어 주면 된다. 색상은 "black"처럼 이름으로 지정해 줘도 되지만, "#000000"처럼 RGB값을 지정해 줘도 된다. M-x list-colors-display RET를 사용하면 사용할 수 있는 이름과 색상을 열람할 수 있다.


Intensity 0 1 2 3 4 5 6 7
Normal Black Red Green Yellow Blue Magenta Cyan White
Bright Black Red Green Yellow Blue Magenta Cyan White
Wikipedia의 ansi color table


ansi-color-names-vector을 세팅해 주면, GNU Emacs 24.5 기준으로 shell-mode에서는 정상적으로 색상이 변경되지만 term-mode에서는 지정한 색상에 맞춰 ansi color가 변경되지 않는다. 이유는 term-modeansi-color.el 라이브러리를 사용하지 않고, ansi color face를 별도로 정의하고 있어서 그런데, ansi-color-names-vector에 지정한 색상을 term-mode에도 동일하게 사용하려면 아래의 구문을 설정에 추가하자.

;; To make colors in term mode derive emacs' ansi color map
(eval-after-load 'term
  '(let ((term-face-vector [term-color-black
                            term-color-red
                            term-color-green
                            term-color-yellow
                            term-color-blue
                            term-color-magenta
                            term-color-cyan
                            term-color-white]))
     (require 'ansi-color)
     (dotimes (index (length term-face-vector))
       (let ((fg (cdr (aref ansi-color-map (+ index 30))))
             (bg (cdr (aref ansi-color-map (+ index 40)))))
         (set-face-attribute (aref term-face-vector index) nil
                             :foreground fg
                             :background bg)))))

해 보니까 eshell-mode의 경우도 ansi-color-names-vector에 따라 변경이 안되는 것 같긴 한데 내 경우는 eshell을 사용하지 않아서 잘 모르겠네. EmacsWiki에서 가이드 하는 방법이 잘 안 되는 것 같기도 하고... 이건 나중에 내가 eshell을 자주 쓰게 되면 업데이트 하겠지 -_-

'Emacs' 카테고리의 다른 글

Emacs의 버퍼 변경 알림 프롬프트에서 변경 내용 표시하기  (0) 2016.04.01
Emacs spell checker  (0) 2016.03.11
auto-complete-c-headers 설정  (1) 2016.03.03
자동 byte-compile 설정  (0) 2016.03.03
Emacsclient의 활용  (0) 2016.03.02