스페이스맥스에서 둠이맥스로 갈아탐

ES6+ 기반의 컴포넌트를 작성하는 것 뿐이었는데 WebStorm, VSCode, Spacemacs… 모두 사용할 수 없을 정도로 느려진다. 프로젝트 구성 파일의 사이즈가 제법 큰 사이즈이지만 따로 콤포넌트 루트는 고작해야 파일 6개 뿐인데 이해할 수 없는 반응이었다. 

 

JVM 기반 WebStorm은 느려지는 원인을 잡아내기란 또 하나의 ‘프로젝트’에 가깝다. 짜증나는 클릭질, 어디에서 뭐가 영향을 주는건지 도무지 알수도 없고 알고싶지도 않다.  VSCode는 왜 또 그런데… 덩달아서 느려진다.  브라우저 기반이라 어쩔 수 없나보다 하고 포기하고 Spacemacs로 코딩하려니 이건 뭐.. 셋다 모두 태업을 하는건지 도무지 이해할 수 없는 현상… 결국 급한김에 vim으로 마무리했지만 받쳐오르는 짜증때문에 그동안 손도대지 않으려했던 Doom Emacs를 건드려 보기로 했다.

 

Spacemacs에 길들여진 후라서 Doom Emacs의 단축키 호출 설정은 가장 큰 장애물이었다. SPC f e d  대신에 SPC f p , treemacs 설정도 모르겠고, SPC SPC 두번 호출에 의해 명령어로 검색하는게 아니라 M-x 로 호출한다. 반응이 돌에 걸려 넝어졌다가 일어나는 꼴 모냥스럽게 느리다. 뭔가 맘에 안든다. 

 

React 코딩을 위한 환경으로 설정했는데도, 일단 어플 자체가 뜨는 시간은 아주 빠르다. 일단 기동 후에 지연된 로딩을 하기 때문에 동작한 직후에는 반응이 더디다. 그래도 Spacemacs에 비하면 개인택시로 미터기 내린상태에서 총알택시 코스탄 정도로 빠르다.  ~/.spacemacs 파일을 고치던 것과 달리 총 3개의 파일로 나눠져 설정한다.

  • ~/.doom.d/init.el  — spacemacs의 layer에 해당한다
  • ~/.doom.d/config.el — spacemacs의 user-config 함수에 해당한다
  • ~/.doom.d/package.el — addtional-packages 함수에 해당한다

 

부팅하기전에 설정에 따른 필요한 사항을 미리 컴파일시켜둬야 한다.  설정을 변경한 경우는 Emacs를 재시작 하기만 하면 된다. 패키지를 추가했다면 반드시 설정을 동기화 해야한다. Emacs 어플 자체의 버전이 바뀐경우에도 doom sync를 해줘야 한다. develop 브랜치를 사용중인데 git pull 로 변경사항을 적용한 후 doom sync 또는 upgrade를 통해 변경사항을 적용하는걸 잊지 말자:

  • ~/.emacs.d/bin/doom sync 

 

 

설정에 따른 로딩하는 패키지의 수는 Spacemacs에 비해 3배정도 차이가 난다.  도대체 Spacemacs는 뭘 그리도 많이 읽어들이는지… 하지만 결국 주된 사용처는 React/ESLint/TypeScript 코딩이라서 설정은 별반 다를게 없다. 대신 eslint_d 를 적용하고 Tide 대신 LSP로 대동단결하는 분위기다. 

 

Emacs는 27버전을 사용한다. 28은 언제 릴리즈될지 알수없고, 26은 JSX 지원이 내장되어 있지 않다.  js2-mode 가 아닌 rjsx-mode를 쓰라고 하는데, 빌어먹을 모드 구분은 아직도 힘들다. Flycheck에다 flycheck-inline-mode를 반드시 써주자. 그렇지 않으면 발랄하게 팝업창이 죽어라 뜨기 때문이다. 

 

ESLint에 auto-fix는 끈다. 내가 알아서 고칠께, 넌 조언만 해라는 설정이다.  TypeScript Hint는 어지간하면 필요할 때 뜨게한다. 스토커마냥 커서 지나가는 길목마다 나타나지 말란말이다.   혹시라도 맛이갈 경우를 대비해 VSCode Insider에도 적절히 설정해준다. 패키지를 모두 없애버리고 VIM + ESLint 만 동작하게 핸둔다. 그러고선 비상대피용으로 vim-plug를 사용해서 VIM 도 새단장을 해주었다. (근데 왜 expandtab이 자꾸 풀리냐고!!!)      이걸 윈도우쪽에도 적용해야하는데, 아,, 느므 싫다.. 윈도우…

생각나지 않는 Spacemacs 단축키, 늘 옆에 두는 컨닝페이퍼

Spacemacs 단축키가 어느 정도 사용하다보면 잘 외워질 것 같이 보여도 “사용하지 않으면 도퇴”되는 사람의 머리의 특성 때문에?, 이전에 잘 사용하던 단축키라도  조금만 공백기가 있으면 정작 필요할 때 아무 문제없이 생각나 주질 않는 경향이 있다. 당연히 이럴 때를 위해 컨닝페이퍼Cheatsheet 패키지가1https://github.com/andrwj/cheatsheet 있으면 좋겠다 생각들었고, 하나 찾았는데 버그가 좀 있고 원 저작자가 오랬동안 업데이트를 하지 않고 있어 Emacs Lisp 학습 목적으로 수정하며 사용중이다. 

 

 

 

기본 단축키 설정이 없으므로 사용자가 반드시 설정해야 한다. 아래 설정에선 단축키로  vertical-bar 를  할당한다.

 

;; https://github.com/andrwj/cheatsheet
(load-file "~/.emacs.d/private/cheatsheet/cheatsheet.el")
(when (require 'cheatsheet)
  (define-key evil-normal-state-map (kbd "|") 'toggle-cheatsheet-window)

  (cheatsheet-add-group 'Search
       '(:key "SPC /" :description "helm-ag")
       '(:key "SPC s s" :description "helm-swoop")
       '(:key "SPC f y y" :description "파일전체 경로 표시 및 복사")
       '(:key "SPC g l l" :description "브라우저 열어서 저장소에 있는 현재파일 위치 표시")
  )
  ;; 생략..
)
 

 

  • 가로 에디터 공간이 넉넉하면 세로로 분할된 윈도우에서 열린다. 또는 SPC  w  L  등의 키로 위치를 옮길 수 있다.
  • Cheatsheet 윈도우를 닫을 때도 같은 단축키를 사용한다. (토글)  그러나 Cheatsheet 윈도우 안에 포커스가 있을 때는 기본 설정인  로만 닫힌다.
  • Cheatsheet 윈도우에 포커스를 둔 상태에서 윈도우가 닫히면 (임시 버퍼를 가리지 않고) 가장 직전에 포커스를 받았던 버퍼로 이동한다. 
  • 단축키 설정이 듣지 않는 Treemacs 등에서는 해당 모드에서 toggle-cheatsheet-window 함수를 호출하도록 설정을 추가해야 한다.

 

References   [ + ]

1. https://github.com/andrwj/cheatsheet

Spacemacs에서 문자열 검색 또는 변경하기

문자열 검색과 치환은 리팩토링에 반드시 필요한 기능이다. 그러나 Spacemacs는 여러 패키지에서 동일한 기능을 제공하고 있고 저마다 사용방법이 조금씩 달라서, 익숙하지 않을 때는 오히려 생산성이 크게 감소된다. 마음이 급하거나 바쁠 때는 Emasc를 버리고 VScode로 작업하거나 vim에서 처리하는 불상사가 반복되기도 한다.  또한 아무리 익숙해졌다고 생각해도 얼마간 사용하지 않으면 여지없이 키배열이 생각나지 않는 골치아픈 영역이기도 하다.  (그리하야 내 이를 어여삐여겨 새로 3개의 테이블을 맹가노니… 부러 잊음없이 제때 잘 쓰고자 할 따람이니라.)

 

문자열 검색
  helm-project-smart-do-search helm-ag helm-swoop
검색  SPC    /   SPC →  v  SPC   s →  s 
검색 범위 버퍼 및 프로젝트내 모든 파일 버퍼 및 프로젝트내 모든 파일 현재 작업 버퍼

패턴간  이동

다른 버퍼에서

시각적  선택

영역(버퍼/파일/프로젝트) 지정후

시각적 선택

다른 버퍼에서

시각적  선택

검색 문자열

블록잡힌 문자열  또는 

커서 위치의 문자열

블록잡힌 문자열  또는 

커서 위치의 문자열

블록잡힌 문자열

없으면 입력받음

파일정보  표시

표시됨

표시됨

제외됨

사용 문맥

 

검색후 iedit로 문자열 변경을 할 때 사용.

변경없이

검색만 할 때 사용

요구사항

 

외부 실행파일 설치필요 (ag)
Ubuntu: apt-get install silversearcher-ag 

macOS: brew install the_silver_searcher 

 

 

현재 버퍼내 문자열 치환
  iedit evil-mc multiple-cursors

다중 커서  지원 여부

X O O
패턴 지정 SPC  s  e  C-n 
C-p 
n 
p 
(region-bindings-mode 패키지 필요)
패턴간 이동

  (다음) 

 p  (이전)

M-n 
M-p 

 

특정 위치 제외 가능: TAB 키로 토글 C-t  
(토글기능은 아니며
다음번 매칭된 패턴으로 이동)
N 
P 
(region-bindings-mode 패키지 필요)

검색후 문자열 변경

 S 키를 눌러 변경 시작
 패턴입력   
   ↳ ESC  ESC

VIM 표준 키입력      
패턴입력          
g   r   q 
VIM 표준 키입력      
패턴입력          
C-g             
요구사항  

~/.spacemacs 파일에

레이어 설정

~/.spacemacs 파일에

레이어 설정

~/.spacemacs 레이어 설정

;; set 'evil-mc' backend. (or 'mc' for 'multiple-cursors' backend)
(setq-default dotspacemacs-configuration-layers '(
  (multiple-cursors :variables multiple-cursors-backend 'evil-mc))

 

프로젝트내 파일에 대해 문자열 검색&치환

agptack 등이 설치되어 있으면, 파일 간에 매칭된 패턴변경은 helm-ag에 의해 처리된다.

1 SPC / 키입력으로 Helm Smart Search를 시작한다. (이때 바꾸고자 하는 패턴을 미리 블록잡아두면 편리하다)

2 C-c C-e 키입력으 helm-ag-edit 편집모드로 전환한다. (나타나는 내용은 helm-ag가 검색한 것들이다)

3 SPC s e 키입력으 iedit-mode 상태로 전환한다음, 표준 VIM 키를 사용해 패턴을 선택한다.

4 C-c C-c 키입력으로 적용하거나, C-c C-k 키입력으로 취소한다.

5 ESC ESC 두번 입력으로 helm-ag 검색모드에서 normal 모드로 전환한다.

 

 

요약

  검색만 할 경우

  ↳ 현재 버퍼: helm-swoop   SPC  s s 
   프로젝트 전체 파일: helm-ag    SPC v  

  검색 및 치환 할 경우
   현재 버퍼: iedit   SPC s e
   프로젝트 전체 파일: helm smart search  SPC  / iedit 기능 사용  

 

 

다중 커서 (multiple-cursor)

아래 보다시피 거지같이 복잡하다. 다중 커서 기능을 지원하는 두개의 패키지가 완벽하질 않다. 그나마 쓰라고 한다면 evil-mc 패키지인데 이 패키지의 가장 큰 아쉬운 점은 블록설정된 영역의 첫 부분에서 커서를 만드는 기능이 없다는거다. 결론적으로 다중커서 백엔드로 evil-mc를 지정해서 메인으로 삼고 multiple-cursors 패키지는  ~/.spacemacs  dotspacemacs-additional-packages  설정에 추가해서 두개 모두 쓰고 있는 중이다.

  evil-mc multi-cursors

현재 패턴 위치에  커서 만들고, 
매칭되는 다음 패턴위치로  이동

evil-mc-make-and-goto-next-match
C-n
mc/mark-next-like-this
n
(require ‘region-bindings-mode)

현재 패턴 위치에  커서 만들고, 
매칭되는 이전 패턴위치로  이동

evil-mc-make-and-goto-preview-match

C-p 

mc/mark-previous-like-this
p
(require ‘region-bindings-mode)

현재 패턴 위치에  커서 만들고, 
다음 커서위치로  이동

evil-mc-make-and-goto-next-cursor
M-n 
mc/skip-to-next-like-thise
N
(require ‘region-bindings-mode)

현재 패턴 위치에  커서 만들고,
이전 커서위치로  이동

evil-mc-make-and-goto-prev-cursor

M-p 

mc/skip-to-previous-like-this
P
(require ‘region-bindings-mode)

다중커서  상태 해제

evil-mc-undo-all-cursors

g r  q 

C-g 

모든 패턴에 대해  커서 만들기

evil-mc-make-all-cursors
g  r  m 
mc/mark-all-like-this

SPC  s  m  b 

선택영역의 모든

  첫 컬럼에 커서 만들기

  mc/edit-lines
C-S-c   C-S-c 
or
SPC  s  m  r 

 

빡침주의

아무리 많은 돈을 준다해도 살수없는 시간을 이딴 설정때문에 복잡하게 살지 말자! 

어지간하면 VScode 쓰면 된다. 그러나 X-Window 없는 서버에서 코딩해야하는데 VIM로는 열불 날때 Spacemacs가 적합할 수도 있다.