Spacemacs 설치, 똥밭 피해가기

2018-Nov-30 Update

master 브랜치보다  develop 브랜치에서사용할 설정을 user-init, user-config 별로 각각 파일 하나에 번들해서 사용하는게 낫다. 

 


무료 소프트웨어에 삽질은 옵션이 아니다. 

Spacemacs1http://spacemacs.org/도 예외없다.

그토록 꼴보기 싫어하던 C-x C-key  조합을 쓰게 만든 Spacemacs 이니 한번쯤 시도해보는 것도 나쁘지 않을거라 생각한다.

오랬동안 가지고 놀 장난감이 생긴 기분이 들지도.. 

 

그러나 본격적으로 쓰려고 하면 어플 뜨는데 걸리는 시간과, 이것 저것 넣다보니 중년남성 배나오듯 빵빵해지는 package-selected-packages  리스트를 보게될거다. 프론트엔드 개발용으로 쓸만하게 셋팅하면…. 음.. 대략 한 200~300개?  그보다 더 될지도..

Clojure/nREPL 걸어두면 뭔가 더 묵직해질 것이고  TypeScript 관련 개발도 나름 나쁘지않지만 필요한 유틸레이어를 넣고 넣고 넣다보면 걍 Visual Studio Code로 돌아갈 확률 크다.  내가 그랬는데, 이젠 아님.  어쨌든 Spacemacs로 몇년 충분히 익숙해지면 다른 배포본도 성숙해 있을테니 그때 갈아타면 된다고 생각한다.

 

간단한 설치때문에 사용도 간단할 줄 알았다가 좀 헤맬때엔 짜증도 났는데, 시간 지나서 보니 그닥 크게 문제가 있는 것도 아니더라.

그저 몇가지 똥스런 함정만 피해가면 해피한 사용을 할 수 있을 거라 생각하고 써보길 강추한다.

무턱대고 옵션 넣다보면 거지꼴을 못면한다

물론 뻥이다. 그럴리 없다. 걍 70~80년대 표어가 생각나서 써봤다.

 

Spacemacs 처음 설치 할 때 세가지 물어본다.

 

  • 키 바인딩은 vim, emacs, hybrid 가 있는데 뭘로 할래?
  • 네가 뭘 좋아할 지 몰라서 필요한 패키지를 ‘full‘ 버전이랑 ‘base‘ 버전으로 나눴는데, 어떤걸 선택할래?
  • 좀 무겁긴해도 풀옵션 ‘helm’ 이 있고, 풀옵션 못지않지만 빠릿한 ‘ivy’가 있는데 어떤걸로?  설마 ‘난 패스’~ 하진 않겠지?

 

아마 십중팔구 vim-spacemacs_full-helm  조합을 선택할 텐데,  처음엔 그 조합으로 하고 익숙해지면 세세한 설정을 하기를 권한다. 

이것 저것 바꿔봐야 Gentoo Linux 함정과 다를 바 없다.( 모조리 컴파일 할 수 있어서 사용자의 요구에 딱 맞으면서 더 빠른 환경을 갖출 수 있다! 고 설레발 쳤었지만 그 사용자의 요구는 아무런 노력없이도 이쁘고 빠른 것인데 정작 죽어라 CPU 돌려가며 컴파일해봐야 속도차이는 얼마나지 않고 그저 다른 배포본보다 못하면 못했지 이쁘긴 개뿔..같은 그런 함정)

 

운 좋으면 무사통과

최초 설치할 때 운이 좋으면 일사천리로 설치되겠지만, 몇가지 패키지 업데이트는 주기적으로 생기기 때문에 삑살이 나거나 설치 오류나서 멈출 가능성도 크다.  문제는 그 첫번째 설치가 끝난 다음에 일어난다. 

 

1. 설치하려는데 네가 말한 그런 패키지 없는데, 혹시 너 이름 잘못쓴거 아니냐? 라고 수도 없이 경고를 뱉는다. 

최초 설치 할 때는 저장소 서버 3곳Melpa2https://melpa.org/packages/, Org3https://orgmode.org/elpa/, GNU4http://elpa.gnu.org/packages/ ) 에서 패키지를 찾기 때문에 대부분 설치가 되지만, 최초 설치 이후로 ~/.emacs.d/elpa/archives 아래에 패키지 정보가 기록된 이후에는 왜 그런지 GNU 한곳에서만 찾는다.  이 증상 때문에 대부분 패키지 설치가 실패할 수 있다. 

 

솔류션 #1: rm -rf ~/.emacs.d/elpa/packages   한 다음, Spacemacs 재시작 (다시 실패할 확률 큼)

솔류션 #2: ~/.spacemacs 파일내 dotspacemacs/init 함수 끝 부분에 아래 코드를 넣고, Spacemacs 재시작


  (setq configuration-layer--elpa-archives
    '5"melpa" . "https://melpa.org/packages/")
      ("org" . "https://orgmode.org/elpa/")
      ("gnu" . "http://elpa.gnu.org/packages/")
      ("marmalade" . "https://marmalade-repo.org/packages/"

  (package-refresh-contents) ; 설치 끝나면 이 라인을 주석 처리!

) ;; end of  defun dotspacemacs/init

 

 

2. 설정이 조금 바뀔 때 마다 설치했던 패키지를 자꾸 삭제한다!

Spacemacs 의 기능이다. 대부분 텍스트 파일이라 냅둬도 하드 용량 차지하지도 않는다. 십년 넘게 유지해도 거지같은 동영상 하나 크기도 안될 것이다. 그러니 냅두라고 ~/.spacemacs 파일내에 설정하자. 

dotspacemacs-install-packages ‘used-only

dotspacemacs-install-packages ‘used-but-keep-unused

 

 

3. Symbol’s funccion definition is void: org-projectile:per-repo

정말 귀찮은 오류다. 이거 제대로 해결방법 아는 분은 트위터로 귀뜸좀 해주기 바란다.  그전 까지 다음과 같이 간단히 … 

diff --git a/emacs.d/layers/+emacs/org/packages.el b/emacs.d/layers/+emacs/org/packages.el
index d6fad0ec3..001e238f4 100644
--- a/emacs.d/layers/+emacs/org/packages.el
+++ b/emacs.d/layers/+emacs/org/packages.el
@@ -27,7 +27,7 @@
     org-mime
     org-pomodoro
     org-present
-    (org-projectile :toggle (configuration-layer/package-usedp 'projectile))
+    ; (org-projectile :toggle (configuration-layer/package-usedp 'projectile))
     (ox-twbs :toggle org-enable-bootstrap-support)
     ;; use a for of ox-gfm to fix index generation
     (ox-gfm :location (recipe :fetcher github :repo "syl20bnr/ox-gfm")

 

 

4. iTerm 에서 실행할 때 Cmd-Space 한글 전환이 안되거나, 되더라도 뭔가 따로 노는 느낌이다

Emacs에는 언어마다 전용 입력기가 있고, 그걸 써야 한다. 그런데 터미널에서 실행하는 Spacemacs는 Command 키에 반응을 iTerm이 먼저 가로채므로  Command 키와 연결된 어떤 것도 동작하지 않는다!. 하지만 GUI형 Spacemacs 에서는 Command키와 관련된 동작에 문제없다. 단독실행형이기 때문이다.  따라서, Cmd+Space 조합으로 한/영 전환은 터미널에선 포기해야 한다. 

외장 기계식 키보드를 쓰는 경우, 키 배열이 다를 수 있으므로 Karabiner-Elements.app6https://pqrs.org/osx/karabiner/document.html의 도움을 받아 특정 키를 다른 키로 맵핑해야 할 것이다.

내 경우는 Capslock 을 Option으로 바꾸고, Option-Space 조합으로 터미널과 GUI 어플 양쪽에서 한가지 방법으로 한/영 전환하고 있다. 그러나 아래 코드에서는 달리 설정하는 법을 보였다. 내게있어 리눅스와 윈도우는 찬밥이니, 해당 플랫폼 사용자는 아래 코드를 보고 각자 알아서 필요한 부분을 수정해서 쓰기 바란다.

(prefer-coding-system 'utf-8)
(set-language-environment "Korean")

(setq-default file-name-coding-system 'utf-8)
(setq-default default-korean-keyboard "")
(setq-default locale-coding-system  'utf-8)
(setq-default coding-system-for-read 'utf-8)

(set-keyboard-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)

;; Treat clipboard input as UTF-8 string first; compound text next, etc.
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))

(cond ( (and window-system (eq system-type 'darwin))
        (message "한영전환: Cmd-Space")(global-unset-key (kbd "s-SPC")) (global-set-key (kbd "s-SPC") 'toggle-input-method))
      (t (message "한영전환: Option-Space")(global-unset-key (kbd "M-SPC")) (global-set-key (kbd "M-SPC") 'toggle-input-method))
      )

 

 

5. 한글 좀 썼다가 저장하려니 자꾸 특수문자가 있다면서 저장형식을 물어본다.  계속.. 계속…게속…  께속.. 미저리다..

위의 4번 설정 이전에 쓴 파일에 UTF-8 BOM 관련한 문제다. BOM 마크는 에디터로는 보이지 않고 Hex Viewer 어플이나 file 명령어로 확인할 수 있다.

일단 복잡한 설명은 다 생략하고, 나는 BOM 없이 쓴다.

 

솔류션 #1: Visual Studio Code 등으로 파일을 읽어들여 ‘다른 이름으로 저장하기’를 하자. 그런후 파일 바꿔치기.

솔류션#2: BOM을 제거하자

remove-utf8-bom.sh
#!/bin/bash
BOMBOM=${1:-없어}
if [[ "${1}" -eq "없어" ]]; then
    echo ""
    echo ㅗ 
    exit 1
else
    sed -i '1s/^\xEF\xBB\xBF//' ${BOMBOM}
fi

 

 

6. 궁금한 패키지가 있는데 Melpa에는 없고 Github에서만 받을 수 있다. 어떻게 설치하란 건가?

아무~ 문제없이 , 간단히 설치할 수 있다:

;; https://github.com/quelpa/quelpa-use-package
 (use-package package-name
       :quelpa (package-name   :fetcher github
                               :repo "user-id/repository-id")
                               :upgrade t))

 

 

7. 괄호..괄호..괄호!!!!  ㅉㄴㄷ 

(use-package aggressive-indent
  :hook
  7css-mode . aggressive-indent-mode)
    (emacs-lisp-mode . aggressive-indent-mode)
    (js-mode . aggressive-indent-mode)
    (lisp-mode . aggressive-indent-mode)
    (sgml-mode . aggressive-indent-mode
  :config
  (setq-default aggressive-indent-comments-too t)
  (global-aggressive-indent-mode 1)
  (add-to-list 'aggressive-indent-protected-commands 'comment-dwim))

 ;;(add-to-list 'aggressive-indent-excluded-modes 'html-mode)

복잡하지만 있어보이는 문법을 쓸수없고 brace/bracket 으로 scope를 주지 못해 보이는 일시적인 금단 증상이다.  빠르면 일주일 이내 증상이 호전된다. 약없다.  그나마 들여쓰기를 가열차게 강제해주는 패키지 덕분에 괄호 짝이 맞지 않거나 들여쓰기가 하라는 대로 안되면 어딘가 삑살이가 난 줄 곧알게된다. 금식할 때 라면같은 패키지다.

 

 

8. 나는 터미널에서 띄우고 싶은데, 자꾸 GUI 어플이 뜬다.

emacs -nw 파일명

 

 

9. HTTPS 연결이 안되서 설치가 안된다!~

emacs --insecure

 

 

10. 뭘 눌러야 내가 원하는게 되는지 몰겠다

Emacs 처음 입문하는 사용자는 ‘명령어 단축키가 뭔지 알려고 애쓰겠지만, 이제 겨우 초보티를 벗은 내가 감히 팁을 하나 공유하자면 오히려 명령어를 찾아보며 단축키는 Cheatsheet8https://github.com/darksmile/cheatsheet 같은 어플에 넣고 보든, 노트에 필기해서 보든 계속 시도해보는 것이 가장 빨리 적응하는게 아닐까 싶다.

(use-package cheatsheet
  :ensure nil
  :defer 5
  :quelpa (cheatsheet :fetcher github :repo "darksmile/cheatsheet" :upgrade t)
  )

(define-key evil-normal-state-map (kbd "|") 'cheatsheet-show)

(cheatsheet-add-group 'Programming
                      '(:key "SPC c l" :description "주석(토글)")
                      '(:key "C-c C-n" :description "새 코드 스니핏 만들기")
                      '(:key "C-h m" :description "현재 모드 확인")
                      '(:key "s-u" :description "파일 다시 읽기")
                      )

(cheatsheet-add-group 'System
                      '(:key "SPC h d k" :description "현재 할당된 단축키 보이기")
                      '(:key "SPC h d f" :description "함수 정보 보이기")
                      )

(cheatsheet-add-group 'File
                      '(:key "M-m p k" :description "모든 버퍼 닫기")
                      '(:key "M-m f R" :description "파일 이름 바꾸기")
                      )

;; 컨닝페이퍼 숨기는 키는 "C-q"

SPC SPC 명령어타이핑  어차피 명령어는 거기서 거기.. 영어도 쉬운 영어.. 치다보면 나오고 누르다보면 익숙해지고.. 뭐, 그런거지.

그래도 세상 곳곳에는 이미 똥밭을 지나간 현자들이 많아서 주옥같은 컨닝페이퍼9https://gist.github.com/davoclavo/d41cd86ffda22f1649e4를 쉽게 찾아 볼 수 있다.

 

 

12. 더 빠른 스타트업을 원한다!

emacsclient -c -q -n 파일명  emacs daemon이 없으면 만들 것이고, 있으면 새로운 윈도우를 만들어 뜨게된다. 1초 미만.   동일한 인스턴스에서 프레임(윈도우)만 만들어 보이는 것이므로 버퍼를 공유한다. 그러나 Homebrew 시스템을 이용하는게 더 있어보인다: brew services start emacs-plus

 

 

13. 모든 Emacs 데몬을 종료하고 싶다!

emacsclient -e "(save-buffers-kill-emacs)"

    or

brew services stop emacs-plus

 

 

References   [ + ]

1. http://spacemacs.org/
2. https://melpa.org/packages/
3. https://orgmode.org/elpa/
4. http://elpa.gnu.org/packages/
5. "melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("gnu" . "http://elpa.gnu.org/packages/") ("marmalade" . "https://marmalade-repo.org/packages/"
6. https://pqrs.org/osx/karabiner/document.html
7. css-mode . aggressive-indent-mode) (emacs-lisp-mode . aggressive-indent-mode) (js-mode . aggressive-indent-mode) (lisp-mode . aggressive-indent-mode) (sgml-mode . aggressive-indent-mode
8. https://github.com/darksmile/cheatsheet
9. https://gist.github.com/davoclavo/d41cd86ffda22f1649e4