개요
- 하고 싶은 것: 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 도 성공한다!
그러나 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
를 실행하면 아래와 같던 실행창이
다음과 같이 변한다.
실행하고 싶은 커맨드를 입력하면 매칭되는 커맨드만을 찾아서 보여준다. 매우 편리하다!
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
로 매핑하도록 한다.
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))
다음과 같이 검색어를 입력하면 구글 검색 제안을 이맥스내에서 확인할 수 있다. 검색어를 선택하면 기본 브라우저가 기동되어 해당 검색어 검색 결과를 보여준다.
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