여섯째 날: 알록달록 perldoc

저자

@keedi - Seoul.pm 리더, Perl덕후, 거침없이 배우는 펄의 공동 역자, keedi.k at gmail.com

시작하며

대부분의 프로그래머는 자신만의 선호하는 편집기가 있기 마련입니다. 제각각의 이유를 가지고 편집기 또는 통합 개발 환경을 선택하겠지만 그 무수한 이유중 빠질 수 없는 것이 바로 문법 강조 기능입니다. 유닉스를 만들던 걸출한 해커들이야 분명히 검은 바탕에 흰 글씨로 엄청난 시스템을 만들었다고는 하지만 이러니저러니 해도 자신이 사용하는 소스 코드에 일관된 규칙으로 시각적으로 편안한 색깔이 덧대어진다면 가독성이 높아지는 것은 자명할 것입니다.

펄은 perldoc이라는 시스템을 통해 시스템에 제공되는 펄은 물론 관련 모듈까지 모두 문서를 제공하며 이 에코 시스템에 익숙해진 펄 개발자라면 누구나 자연스레 perldoc 문서를 읽고, 또 만들게 됩니다. Carp 모듈의 내용이 궁금하다면 언제든지 작업하던 터미널에서 perldoc Carp라고 입력하면 perldoc 문서를 읽을 수 있습니다. 이렇게 편리한 perldoc이지만 한 가지 아쉬운 점이 있다면 밋밋하게 단색으로 보여 현란한 웹에 익숙해진 현대인으로서는 읽기가 그리 편하지 않다는 점입니다.

지금부터 터미널을 좋아하는 텍스트 덕ㅎ.. 아니 여러분을 위해 perldoc 매뉴얼에 알록달록 색깔을 입혀보죠!

준비물

필요한 모듈은 다음과 같습니다.

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Pod::Text::Color::Delight

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Pod::Text::Color::Delight

사용 방법

우선 Pod::Text::Color::Delight 모듈은 256색 이상을 지원하는 터미널을 사용하는 것을 전제로 색상 팔레트를 사용하고 있습니다. 따라서 여러분이 사용하는 터미널을 최소 256색 이상을 지원하도록 맞춰주어야겠죠. 자세한 내용은 여러분이 사용하는 터미널의 매뉴얼을 참고하세요.

데비안에서 그놈 터미널을 사용하고 있는 제 터미널의 설정은 다음과 같습니다.

$ echo $TERM
TERM=xterm
COLORTERM=gnome-terminal

tmux를 사용할 때 터미널의 설정은 다음과 같습니다.

$ echo $TERM
TERM=screen-256color
COLORTERM=gnome-terminal

모듈 설치가 끝나면 기존 perldoc 명령을 실행할때 방금 설치한 모듈을 적재하도록 옵션을 명시해줍니다.

$ perldoc -MPod::Text::Color::Delight Carp

짠~!

Pod::Text::Color::Delight를 적용한 perldoc 화면 그림 1. Pod::Text::Color::Delight를 적용한 perldoc 화면 (원본)

아! 아름답군요. ;-)

하지만 perldoc을 실행할 때 마다 항상 저렇게 길게 입력할 수는 없는 노릇이겠죠. 유닉스 계열의 운영체제를 사용한다면 자신이 사용하는 쉘의 alias 기능을 이용하세요. Bash 쉘의 경우 .bashrc 파일 또는 그에 준하는 파일에 다음처럼 설정합니다.

alias perldoc='perldoc -MPod::Text::Color::Delight'

설정 후 새로운 터미널을 실행시켜 수정한 내용이 반영되게 하면 이제는 간단히 perldoc 명령만으로도 알록달록한 perldoc 화면을 볼 수 있습니다.

정리하며...

지금까지 perldoc에 알록달록 색깔을 입히는 방법을 알아보았습니다.

...?

...라고 하기에는 조금 아쉽죠? 조금만 더 파볼까요? ;)

사용자 정의를 위한 지침서

Pod::Text::Color::Delight 모듈은 크게 다음 세 모듈을 사용해서 perldoc에 색을 칠합니다.

Pod::Text::Color 모듈은 펄 5.6 버전부터 이미 코어 모듈로 들어가 있는 기본적으로 제공되는 모듈입니다. 이 모듈이 대부분의 터미널에서 보여줄 수 있는 수준으로 굵게 또는 밑줄, 반전 등의 효과를 이용해 perldoc을 꾸며주고 있는 것입니다. 물론 이 모듈 덕분에 man 페이지와 거의 유사하게 문서를 읽을 수 있지만 여기서 만족 못하는 사람이 많은 덕분에 Pod::Text::Color::Delight 모듈이 나온 것이겠죠? Pod::Text::Color::Delight 모듈은 Pod::Text::Color 모듈을 상속받기 때문에 문법 강조와 관련해 사용자 정의(커스터마이즈)하고 싶은 부분이 있다면 Pod::Text::Color 모듈과 이 모듈이 또 상속받는 Pod::Text 모듈을 살펴보면 됩니다.

Term::ANSIColor 모듈은 터미널에 색을 간편하게 입힐 수 있게 도와줍니다. 대부분의 번거로운 작업은 이 모듈이 대신 해주기 때문에 여러분이 해야할 일은 자신의 터미널에서 지원하는 색상 목록을 확인하고 어떤 색상을 선택할지 고르는 일입니다. 역시 펄 5.6 버전부터 이미 코어 모듈로 들어가 있으므로 따로 설치할 필요가 없습니다. 다음 명령을 통해 여러분의 터미널에서 표현할 수 있는 색상 팔렛트를 확인해보죠.

$ wget http://api.metacpan.org/source/RRA/Term-ANSIColor-4.02/examples/generate-colors
$ chmod 755 generate-colors
$ ./generate-colors fg256

generate-colors는 다음 6가지의 옵션을 제공합니다. 원하는 색상값을 고르기 위해서 각각의 옵션과 함께 실행해보고 적절한 색상을 확인해두세요.

Syntax::Highlight::Perl::Improved 모듈은 Pod::Text::Color::Delight 모듈이 perldoc 내용에 색상을 입힐때 글자 그대로의 문단(Verbatim Paragraph) 영역을 처리하기 위해 사용합니다. 따라서 공식 문서의 'FORMAT TYPES' 섹션을 참고하면 원하는 색상을 입히는데 도움이 됩니다.

크리스마스 선물 #1: 설정파일

Pod::Text::Color::Delight 모듈의 기본 설정 값은 다음과 같습니다.

use constant COLOR_TABLE => {
    head1  => 'bright_cyan',
    head2  => 'reset bold',
    head3  => '',
    head4  => '',
    bold   => 'reset bold',
    file   => 'bright_green',
    italic => 'reset italic',
    link   => 'rgb045',
    code   => {
        Character         => 'cyan',
        String            => 'rgb542',
        Quote             => 'rgb542',
        Label             => 'rgb542',

        Builtin_Function  => 'bright_red',
        Builtin_Operator  => 'bright_red',

        Keyword           => 'bright_red',
        Package           => 'rgb345',

        Subroutine        => 'rgb454',
        Bareword          => 'white',
        Symbol            => 'white',
        Operator          => 'white',
        Number            => 'white',

        Variable_Hash     => 'rgb520',
        Variable_Array    => 'rgb520',
        Variable_Scalar   => 'rgb520',
        Variable_Typeglob => 'rgb520',

        Comment_Normal    => 'grey10',
        Comment_POD       => 'grey10',
        DATA              => 'grey10',
        Directive         => 'bright_green',
    },
};

하지만 Pod::Text::Color::Delight 모듈은 설정 파일을 지원하기 때문에 얼마든지 특정 키워드의 색을 원하는 색상으로 변경할 수 있습니다. 설정 파일의 경로는 ~/.pod_text_color_delight 입니다.

제 경우 대부분의 경우 Vim을 즐겨 사용하며 Vim의 desert256 색상 테마가 가독성이 높고 눈이 편안해 무척 좋아합니다. 여러분께 드릴 선물은 Pod::Text::Color::Delight의 유사 desert256 설정입니다. :)

#
# FILE: ~/.pod_text_color_delight
#
+{
    head1  => 'rgb113 bold',
    head2  => 'rgb113',
    bold   => 'rgb512 bold',
    file   => 'green',
    italic => 'rgb512',
    link   => 'rgb530',
    code   => {
        Character         => 'rgb522',
        String            => 'rgb522',
        Number            => 'rgb522',
        Quote             => 'rgb522',

        Label             => 'rgb542 bold',

        Builtin_Function  => 'rgb542 bold',
        Builtin_Operator  => 'rgb542 bold',
        Keyword           => 'rgb542 bold',

        Package           => 'rgb220 bold',
        Variable_Hash     => 'rgb252',
        Variable_Array    => 'rgb252',
        Variable_Scalar   => 'rgb252',
        Variable_Typeglob => 'rgb252',

        Subroutine        => 'rgb252',

        Bareword          => 'reset',
        Symbol            => 'reset',
        Operator          => 'reset',

        Comment_Normal    => 'rgb255',
        Comment_POD       => 'rgb255',
        DATA              => 'rgb255',
        CodeTerm          => 'rgb255',

        Directive         => 'bright_red',
    },
};

유사 <em>desert256</em> 테마를 적용한 perldoc 화면 그림 2. 유사 desert256 테마를 적용한 perldoc 화면 (원본)

마음에 드시나요? :)

크리스마스 선물 #2: 패치

현재 Pod::Text::Color::Delight 모듈에는 버그가 있습니다. POD 형식중 목록 항목을 처리할때 특정 경우 몇몇 항목을 보여주지 못하는(지우는) 문제가 있습니다. 다행히 심각한 문제는 아니라서 수정하기 어렵지는 않습니다.

눈치채신 분이 계실지 모르겠는데 Pod::Text::Color::Delight 모듈의 설정 파일은 펄 코드입니다. 덕분에 패치 제작은 정말 간편합니다. 다음은 앞선 유사 desert256 색상 테마 설정 파일에 런-타임 패치를 적용한 멍키 패치(monkey-patch)입니다.

#
# FILE: ~/.pod_text_color_delight
#

sub Pod::Text::Color::Delight::cmd_item_text {
    my ($self, $attrs, $text) = @_;
    $self->SUPER::cmd_item_text($attrs, $text);
}

+{
    head1  => 'rgb113 bold',
    head2  => 'rgb113',
    bold   => 'rgb512 bold',
    file   => 'green',
    italic => 'rgb512',
    link   => 'rgb530',
    code   => {
        Character         => 'rgb522',
        String            => 'rgb522',
        Number            => 'rgb522',
        Quote             => 'rgb522',

        Label             => 'rgb542 bold',

        Builtin_Function  => 'rgb542 bold',
        Builtin_Operator  => 'rgb542 bold',
        Keyword           => 'rgb542 bold',

        Package           => 'rgb220 bold',
        Variable_Hash     => 'rgb252',
        Variable_Array    => 'rgb252',
        Variable_Scalar   => 'rgb252',
        Variable_Typeglob => 'rgb252',

        Subroutine        => 'rgb252',

        Bareword          => 'reset',
        Symbol            => 'reset',
        Operator          => 'reset',

        Comment_Normal    => 'rgb255',
        Comment_POD       => 'rgb255',
        DATA              => 'rgb255',
        CodeTerm          => 'rgb255',

        Directive         => 'bright_red',
    },
};

와우! 원래 모듈의 소스 수정 없이 버그를 패치했네요. 펄에서는 흔히 사용하는 기교니 너무 놀라지는 마세요. :-)

정리하며

지금까지 터미널에서 perldoc을 알록달록하게 꾸미는 방법을 알아보았습니다. 어쩌면 웹페이지를 띄워서 보면 그만일 문제기는 하지만 터미널에 익숙한 개발자라면 Ctrl-Shift-T perldoc Carp를 키보드로 입력하는데 아마 1초도 걸리지 않겠죠. 이 작은 팁이 펄 개발을 더욱 즐겁게 만들어 주(었)길 바래봅니다.

예전에도 그랬고 지금도 여전히 CPAN은 개발자를 자극하는 흥미로운 것이 한 가득입니다. 항상 설치와 SYNOPSIS대로 따라하는 것으로 끝내지 말고 조금 더 찬찬히 문서를 읽어보고 소스를 확인해 어떤 기법을 사용했는지 참고해 여러분의 것으로 만드는 것도 잊지마세요!

Enjoy Your Perl! ;-)

EOT

EOT

blog comments powered by Disqus