개요

  • 하고 싶은 것: Windows에서 clojure를 개발할 수 있는 Emacs환경을 구축하고 싶다.
  • 목표: https://github.com/flyingmachine/emacs-for-clojure/ 의 설정파일을 제대로 구동할 수 있는 Windows Emacs버전을 찾는다.
  • 환경설저파일(init.el)은 Clojure Brave and True의 소스를 기본으로 했다.

Windows용 이맥스 다운로드 경로

  • http://ftp.jaist.ac.jp/pub/GNU/emacs/windows/

패키지 설정

init.el 에 다음을 추가한다. (참고: https://stable.melpa.org/#/getting-started)

(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)
;; (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)

시도한 버전

emacs-24.3-bin-i386

  • Emacs시작시에 검은화면이 안나오고 package-pinned-packages 가 없다는 에러가 나왔다.
  • 아마도 이 함수는 emacs-24.4부터 제공하는 것 같다.

emacs-24.5-bin-i686-mingw32

  • Emacs시작시에 검은화면이 나왔다.
  • 그러나 에러로 let-alist-1.0.5 를 사용할 수 없다는 메세지와 seq-2.16를 사용할 수 없다는 나왔다.
  • list-packages에서 찾아보니 let-alist-1.0.6이 사용가능했다. 인스톨하고 재구동해봤다.
  • let-alist 에러가 사라졌다!
  • list-packages에서 찾아보니 seq는 seq-2.23을 사용가능했다. 이 버전을 인스톨하고 재구동해봤다.
  • seq 에러가 사라졌다!
  • 그런데 File error: Cannot open load file, no such file or directory, project 라는 에러가 나왔다. 딱히 init.el에 project디렉토리를 열라는 명령을 없어보이는데…이유를 모르겠다.
  • 그리고 clojure파일을 연후 cider-jack-in을 시도하자 cannot open load file: no such file or directory, map 이라는 메세지가 나온다.
  • 이건 못쓰겠다. 이맥스 버전을 좀더 올려본다.

emacs-25.3-x86_64

  • 오.. 실행시 아무런 에러가 나오지 않는다.
  • cider-jack-in 도 성공한다!

Emacs Clojure 개발환경

그러나 M-x list-package 로 들어가자 다음과 같은 에러메세지가 출력된다.

gnutls.c: [1] (Emacs) GnuTLS library not found
Opening TLS connection to ‘stable.melpa.org’...
Opening TLS connection with ‘gnutls-cli --x509cafile nil -p 443 stable.melpa.org’...failed
Opening TLS connection with ‘gnutls-cli --x509cafile nil -p 443 stable.melpa.org --protocols ssl3’...failed
Opening TLS connection with ‘openssl s_client -connect stable.melpa.org:443 -no_ssl2 -ign_eof’...failed
Opening TLS connection to ‘stable.melpa.org’...failed
Failed to download ‘melpa-stable’ archive.
Opening TLS connection to ‘melpa.org’...
Opening TLS connection with ‘gnutls-cli --x509cafile nil -p 443 melpa.org’...failed
Opening TLS connection with ‘gnutls-cli --x509cafile nil -p 443 melpa.org --protocols ssl3’...failed
Opening TLS connection with ‘openssl s_client -connect melpa.org:443 -no_ssl2 -ign_eof’...failed
Opening TLS connection to ‘melpa.org’...failed
Package refresh done
1 package can be upgraded; type ‘U’ to mark it for upgrading.
Failed to download ‘melpa’ archive.

메세지를 보건대 HTTPS 통신을 하기위해서 gnutls-cli또는 openssl를 찾고 있는데 Windows상의 PATH에 해당 툴이 보이지 않아서 발생하는 문제같다. 따라서 이 툴들을 설치해주면 될 것 같다.

GnuTLS 설치

  • 여기에서 Windows버전을 다운로드할 수 있다.
  • https://www.gnupg.org/ftp/gcrypt/gnutls/v3.7/gnutls-3.7.8-w64.zip 를 다운로드 받아서 압축을 푼 후 PATH 변수에 지정된 경로에 이동했다.

음… 설치했는데도 안된다. Emacs버전을 다시한번 올려본다.

emacs-26.3-x86_64

여기서 부터는 no-deps가 붙어있는 버전과 붙어있지 않은 버전이 등장하기 시작한다.
no-deps가 붙어있는 것은 용량이 114M , 붙어있지 않은 것은 용량이 215M 다. 추측컨대 no-deps가 붙어있지 않은 쪽이 의존 라이브러리가 모두 포함된 버전인 것 같다. 여기에는 HTTPS통신용 라이브러리도 들어가있지 않을까? 이 것을 사용해본다. bin폴더를 확인해보니 gnu관련 유틸들이 꽤 많이 들어가 있다.
이맥스를 실행해보니 melpa접속에 실패했다는 메세지가 사라졌다! 이 버전을 사용해야겠다.

중요 패키지 설치

helm

  • Emacs 25부터는 기본적으로 설치되어 있다는 것 같다.

helm-M-x 키 설정

다음 설정을 init.el에 추가한다.

(global-set-key (kbd "M-x") 'helm-M-x)

위를 설정하고 이맥스 커맨드(함수)를 실행하는 M-x를 실행하면 아래와 같던 실행창이

emacs m-x실행화면

다음과 같이 변한다.

emacs helm-m-x 실행화면

실행하고 싶은 커맨드를 입력하면 매칭되는 커맨드만을 찾아서 보여준다. 매우 편리하다!

emacs helm-m-x 실행화면2

helm-show-kill-ring 설정

다음 설정을 init.el에 추가한다.

(global-set-key (kbd "M-y") 'helm-show-kill-ring)

kill-ring은 이맥스에 삭제된 텍스트(C-k 등으로 삭제한 텍스트)가 보관되는 영역이다. 기본적으로는 60개까지 저장되는 듯 하다. 이 것을 보려면 기본적으로는 kill-ring이라는 변수를 C-h v kill-ring 커맨드로 확인하는 것으로 가능한데 실행해보면 꽤 알아보기 힘들다. helm-show-kill-ring을 사용하면 다음과 같이 보기 편하게 보여준다. 붉은 선으로 나뉘어진 부분을 통해 삭제된 순서대로 볼수 있다. 위에 있을 수로 새롭게 삭제된 텍스트이다. 또한, 이 함수는 helm의 원래 설정대로라면 C-x c M-y커맨드로 매핑되어 있어 사용하기 어렵다. 이 것을 간단하게 M-y로 매핑하도록 한다.

emacs helm-show-kill-ring

helm-mini

미니버퍼를 보기좋게 보여주는 기능이다. 다음 설정을 init.el에 추가한다.

(global-set-key (kbd "C-x b") 'helm-mini)

helm-find-files

파일검색을 더 보기 좋게 보여준다. 다음 설정을 init.el에 추가한다. C-x C-f를 누르면 helm으로 파일 검색을 할 수 있게 된다.
파일 검색중에 디렉토리에서 C-l을 누르면 해당 디렉토리 내부로 들어간다. 여기서 탭을 누르면 다시 상위 디렉토리로 이동한다. (엔터를 눌러도 되지만 엔터까지 오른이 이동해야 하기 때문에 탭이 더 편하다.)

(global-set-key (kbd "C-x C-f") 'helm-find-files)
; rebind tab to run persistent action
(define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action )

helm-google-suggest

helm-google-suggest는 helm을 이용해서 google 검색 제안(suggess)기능을 이용할 수 있는 기능이다.

다음설정을 추가한다. curl 을 사용할 수 있으면 helm-google-suggest를 사용할 때 curl을 이용한다.

(when (executable-find "curl")
  (setq helm-google-suggest-use-curl-p t))

다음과 같이 검색어를 입력하면 구글 검색 제안을 이맥스내에서 확인할 수 있다. 검색어를 선택하면 기본 브라우저가 기동되어 해당 검색어 검색 결과를 보여준다.

emacs helm google suggest

helm-projectile

projectile은 프로젝트 내부에서 파일 검색등을 위해서 사용하는 패키지다. C-x C-f보다 더 편리한 프로젝트 내 파일 이동 및 검색기능 등을 제공한다. M-x package list 에서 helm-projectile을 찾아서 설치한다.

다음 설정을 init.el에 추가한다. C-c h를 키바인딩으로 추가했다.

;; For Helm-Projectile
(projectile-global-mode)
(setq projectile-completion-system 'helm)
(helm-projectile-on)
;(setq projectile-indexing-method 'alien) ; speed up settting just for windows emacs user
(global-set-key (kbd "C-c p h") 'helm-projectile)

helm-projectile-grep

프로젝트 내부에서 특정 문자열을 포함하는 부분을 찾을 수 있는 기능이다.

(global-set-key (kbd "C-c p s g") 'helm-projectile-grep)

nyan-mode

커서가 버퍼상에서 어느 위치에 있는지를 알려주는 인디케이터가 귀여운 고양이로 변하는 모드이다. M-x package list 에서 nyan-mode를 찾아서 설치한다. init.el에 다음설정을 추가한다.

; nyan-mode 
(setq-default nyan-animate-nyancat t) ; 이걸 켜면 고양이가 움직인다. 귀엽다. 
;(setq-default nyan-wavy-trail t) ; 이걸 켜면 고양이 뒤의 무지개가 파도처럼 움직인다. 이것까지 켜면 좀 어지럽다. 
(nyan-mode)

markdown-mode

이맥스에서 마크다운 파일(.md)을 편집하기 위한 모드이다.
M-x package list 에서 markdown-mode를 찾아서 설치한다.

프리뷰보기

작성중이 마크다운의 프리뷰를 보고싶으면 M-x markdown-preview 또는 C-c C-c p를 입력한다.

에러: Markdown command markdown is not found 라는 에러 메세지가 나온다.

https://qiita.com/howking/items/bcc4e05bfb16777747fa

;; C-c C-c p
(setq markdown-command "jq --slurp --raw-input '{\"text\": \"\\(.)\", \"mode\": \"gfm\"}' | curl -sS --data @- https://api.github.com/markdown")

웹 브라우저에서 보기

또는 markdown-open을 사용하자.

기타 설정

인코딩 설정

다음 인코딩설정을 추가한다.

;; encoding setting
(prefer-coding-system 'utf-8)
(setq coding-system-for-read 'utf-8)
(setq coding-system-for-write 'utf-8)

PATH설정

윈도우즈에 설정한 PATH 변수의 값을 이맥스는 인식하지 못한다. 이맥스가 인식할 수 있도록 해주어야 한다. => 다음에 하자.

참고

(when (executable-find "ack-grep")
  (setq helm-grep-default-command "ack-grep -Hn --no-group --no-color %e %p %f"
        helm-grep-default-recurse-command "ack-grep -H --no-group --no-color %e %p %f"))


(setq helm-split-window-in-side-p t ; open helm buffer inside current window, not occupy whole other window
      helm-move-to-line-cycle-in-source t ; move to end or beginning of source when reaching top or bottom of source.
      helm-ff-search-library-in-sexp t ; search for library in 'require' and 'declare-funciton' sexp.
      helm-scroll-amount 8 ; scroll 8 lines other window using M-<next>/M-<prior>
      helm-ff-file-name-history-use-recentf t
      helm-M-x-fuzzy-match t ; optional fuzzy matching for helm-M-x
      helm-buffers-fuzzy-matching t
      helm-recentf-fuzzy-match t
)

;(helm-mode 1)  ; This line may conflict with clojure setting 


;; For Helm-Projectile
(projectile-global-mode)
(setq projectile-completion-system 'helm)
(helm-projectile-on)
;(setq projectile-indexing-method 'alien) ; speed up settting just for windows emacs user