[하스켈 문서 - 1] Atom과 Cabal을 이용하는 개발 환경 설정

redneval의 이미지

1. 서문

(1) 편집기 선택

편집기 중에서 하스켈 관련 플러그인이 잘 갖춰진 것은 다음 4개가 있습니다.

  • Emacs
  • Vim
  • Sublime Text
  • Atom

Sublime Text는 기능은 좋은데, 한글 지원이 좋지 않아서 꺼려집니다. Emacs와 Vim은 강력한 편집기이지만 초보자에게 추천하기에는 진입장벽이 있는 편입니다. Atom은 GitHub에서 개발한 편집기로서 사용하기 쉽고 최근에 등장했음에도 (2015년에 1.0버전이 나옴) 안정성도 괜찮고 하스켈 관련 플러그인도 충분히 갖추고 있습니다.

이 문서에서는 Atom과 Cabal을 사용하는 개발 환경을 갖추는 방법을 설명합니다.

(2) Cabal vs Stack

하스캘 꾸러미들을 설치하는 프로그램에는 Cabal과 Stack이 있습니다. 본격적인 개발을 위해서는 Stack을 이용하는 편이 좋지만 학습하는 단계에서는 Cabal로도 충분합니다. Stack을 사용하는 방식으로 개발 환경 설정하는 방법은 나중에 기회가 되면 소개하기로 하고 여기서는 Cabal을 사용하도록 하겠습니다.


2. 설치 및 설정 (윈도우)

(1) Haskell Platform 설치

Haskell Platform은 컴파일러인 GHC, 꾸러미 설치 프로그램 Cabal과 기본적인 꾸러미들을 모아놓은 것입니다. https://www.haskell.org/platform/ 에서 Haskell Platform을 받아서 설치합시다. 설치가 완료되면 다음 명령어로 GHC 버전을 확인할 수 있습니다.

ghc --version

참고로 현재 윈도우즈용 Haskell Platform에 포함된 GHC 버전은 7.10.3 입니다.


(2) 하스켈 꾸러미 설치

Atom 플러그인인 ide-haskell 등을 사용하기 위해서는 ghc-mod와 stylish-haskell 꾸러미가 필요합니다. Cabal을 이용해서 설치합시다.

cabal update
cabal install ghc-mod stylish-haskell


(3) Atom 설치

당연히 Atom도 설치해야겠죠? https://atom.io/ 에서 받아서 설치합니다.


(4) Atom 플러그인 설치

다음 명령어로 Atom 플러그인을 설치합니다.

apm install language-haskell haskell-ghc-mod ide-haskell-cabal ide-haskell autocomplete-haskell

참고로 Atom 플러그인을 설치하는 방법은 apm 명령어를 이용한 방법 외에도, Atom을 실행하고 "Ctrl + ,"를 눌러서 나오는 Setttings 화면 중 Install 메뉴에서 검색해서 설치하는 방법도 있습니다.

위에서 설치한 플러그인들의 기능은 다음과 같습니다.

  • language-haskell : 문법 강조, 자동 들여쓰기, Snippets
  • haskell-ghc-mod : 형(type) 검사
  • ide-haskell : 에러/경고/Lints, type/info 보여주기, Prettify
  • autocomplete-haskell : 자동완성


(5) ghc-mod 한글 문제 해결

(ghc-mod 5.5.0.0 버전에서 발생하는 문제이며, 다음 버전에서 해결될 예정입니다.)

현재(16년 4월) 기준으로 haskell-ghc-mod는 윈도우에서 유니코드 사용시 에러가 발생합니다. https://github.com/atom-haskell/haskell-ghc-mod/issues/105 에 관련 내용이 있는데 간단히 설명하면, 하스켈에서 유니코드를 utf-8으로 다루다 보니 Atom도 utf-8으로 설정해서 사용하는 반면에 한국어 윈도우 인코딩이 euc-kr (chcp 949)이라서 ghc-mod가 기본적으로 euc-kr을 사용하여 에러가 발생하는 것 같습니다.

이 문제를 해결하기 위해서 https://github.com/DanielG/ghc-mod/pull/747 과 같이 ghc-mod의 입력 인코딩을 옵션을 통해 설정할 수 있게 수정될 예정입니다. ghc-mod의 다음 버전에는 수정되서 나올 것 같은데, 현재 버전인 5.5.0.0에는 수정이 반영돼지 않았습니다.

dev 버전에는 수정이 반영돼있으므로 받아서 컴파일해서 쓰면 됩니다. 먼저 ghc-mod dev 버전을 받습니다. (만약에 Git 사용법을 모르면 https://github.com/DanielG/ghc-mod/tree/dev 에서 Zip 파일을 받아서 압축 풀면 됩니다.) 그리고 ghc-mod.cabal을 편집기로 열어서 버전을 "5.5.0.0"에서 "5.5.0.1"로 수정하고 다음 명령어로 설치합니다.

cabal install ./ghc-mod.cabal

다음 명령어로 ghc-mod 버전이 "5.5.0.1"가 맞는지 확인합시다.

ghc-mod --version


(6) 추가 꾸러미 설치

추가적으로 다음의 꾸러미들도 설치하는 것을 추천합니다.

apm install ide-haskell-repl haskell-hoogle
  • ide-haskell-repl : Atom상에서 ghci를 사용하게 해줍니다.
  • haskell-hoogle : Atom상에서 간편하게 Hoogle 검색을 할 수 있게 해줍니다.

ide-haskell-repl의 기본 keymap이 불편하게 돼있으므로 다음과 같이 설정해줍시다.

"Ctrl+Shift+P"를 눌러서 keymap으로 검색해서 "Application: Open Your Keymap"을 실행하면 keymap.cson 파일이 열리는데 그 파일에 다음의 내용을 추가해줍니다.

'atom-text-editor.ide-haskell-repl':
  'enter': 'ide-haskell-repl:exec-command'
  'up': 'ide-haskell-repl:history-back'
  'down': 'ide-haskell-repl:history-forward’


(7) Atom 화면

설치 및 설정이 완료된 Atom 화면은 다음과 같습니다. 문법 강조, Lint, 형(type) 보여주는 기능이 작동함을 확인할 수 있습니다. 화면에는 나타나지 않지만, 에러/경고 보여주는 기능, 코드 자동완성, 자동 들여쓰기 기능 등도 있습니다.


3. 설치 및 설정 (리눅스)

리눅스에서도 설치하는 방법은 윈도우와 비슷합니다.

(1) 데비안

데비안에서 설치시에, 윈도우와의 차이점을 정리하면 다음과 같습니다.

1) 데비안에서는 Haskell Platform 설치시에 다음의 명령어를 사용합니다.

apt-get install haskell-platform

2) Cabal 관련 경로를 설정해줘야합니다. Haskell Platform을 설치한 후에 PATH를 다음과 같이 설정해줍시다.

~/.bashrc 파일을 열어서 PATH에 "/home/사용자이름/.cabal/bin: "를 추가해줍니다.

3) Atom 설치시에 https://atom.io/ 에서 atom-amd64.deb 를 받아서 다음과 같이 설치해줍니다.

sudo aptitude update
sudo aptitude install git gvfs-bin
sudo dpkg --install atom-amd64.deb

git과 gvfs-bin 외에도 의존성이 필요한 꾸러미들이 있다면 설치해줍시다.

4) ghc-mod 관련한 한글 문제는 발생하지 않습니다.

File attachments: 
Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.