생각나지 않는 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가 적합할 수도 있다.

자바스크립트 함수형 프로그래밍 – 루이스 아텐시오

이 글은 리뷰가 아니다.

 

2019년 4월 초에 구입했다. 가볍게 읽고 넘어간 부분과 함께 어떤 부분은 10번 이상, 어떤 부분은 수술하듯 단어를 분해하며 학습했다.  이 책이 다른 여타의 입문서나 Medium 글과 비교해 다른 건 체계적으로 함수형 프로그래밍을 어떻게 하는지 기술했다는 점이다. 소위 말하는 ‘초보자’를 위한 책은 아니다. 생각하고 고민하며 구현해가면서 봐야하는 책이었다. 분명하고 확실한 정의를 제공하지만 아는만큼 보이기 때문에 이해하지 못하는 부분은 결국 나중에서야 혀를 차게되는 경우가 제법 있었다.  

함수형 학습 초반에는 FxJS1https://github.com/marpple/FxJS 소스를 분석하고 같은 기능을 직접 구현하면서 ‘함수형이 무엇을 해결하려고 하는지’를 배워갔다면 실전에 가장 영향을 미쳤던 건 Either Monad 구현2https://github.com/andrwj/FPJS이었다. 과하게 Either를 적용하면서 문제가 생길 때마다 FolkTale3https://folktale.origamitower.com/ 구현 하나 하나를 적용하는 계기가 됐다. 그리고 6월 중순을 지나며 Lambda Calculus 구현4https://www.youtube.com/watch?v=3VQ382QG-y4을 볼 때 함수형 코딩론의 밑바닥에 손이 닿인 기분이 들었고 무엇을 어떻게 어떤 식으로 해야할지 완전히 이해했다.

 

.forEach(), .map() , .filter(), .reduce() … 이런 것에 촛점을 맞출 수 밖에 없게한 기존의 책과 Medium 글, 옆집 개가 짖으니 나도 짖는다 식의 블로그 글들,  함수형 코딩 무용론,..  OOP 방법론과의 비교글, ..  오래 전부터 함수형을 배우고 싶었으나 늘 그 언저리에서 머물 수 밖에 없었던 이유를 깨달았고 병신짓인지 모르고 읊어대는 교회 방언마냥 욕을 해대고 싶었으나, 비난의 대상이 너무 넓어 스스로에게 침뱉는 격이었다.

 

생각지 않았던 프로그래밍 언어에 대한 해방감인 찾아온 건 뜻밖의 수확. 라인 한 줄을 코딩하더라도 지침이 있기때문에 코딩하면 할수록 쌓이는 즐거움. 무엇이 잘못되고 무엇이 올바른 가에 대한 확고한 지침. 덤으로 찾아온 회춘.  나의 지난 시간들이 너무나 억울하다. 코딩의 세상에도 사회주의 공산주가 존재한다고 표현하면 너무 과하다 생각할지 모르겠지만, 내 옆에 있던 동료와 소위 열정을 불살랐던 스터디그룹과 한가닥 한다는 개발자의 선호도와 의견들, 무엇보다 개발자를 생각하지 못하게 강제한 회사와 사장의 요구들… 그 모든게 좀 처럼 생각을 자유롭게 적용하지 못하게 서로에게 영향을 끼쳤다.  설령 내가 억울하다 여기는 과거의 시간동안 함수형 코딩을 할 수 있었다해도 동료란 인간들과 무형의 팀원과 일에 치여 귀찮은 팀장과 돈이 궁한 사장의 압력을 버티지 못했을 것이라 생각한다. 그저 늦었지만 지금이라도 제대로 알게된 것에 힘입어 얼마 남지 않았을지도 모를 내 앞의 시간을 함수형 개발을 하며 기쁨을 계속 누려가고 싶다. 

 

함수형 코딩을 배우려는 개발자에게 몇 마디 하자면, 모든 결론은 함수형 코딩이 지켜야할 몇 안되는 이 규칙Rule에 귀결한다는 사실을 반지로 삼아 끼고 학습하면 너무 돌아가지 않고 신속히 적응할 수 있을 것이다:

 

  • Declarative
  • Purity
  • Transparency
  • Immutability

 

위의 네가지 규칙의 코딩by 그리고 규칙을 위해for , 또한 룰에 의해of 코딩하는 방법이 함수형 프로그래밍이다.  학습 초반에 너무 ‘정의’에 매달리지 말고 해당 ‘정의’가 어떤 상황에서 적용되는 것인가를 주의 깊게 보는게 더 낫다. 정의는 결국 이해한 뒤에야 인정하는 동감일 뿐이다. 그러자면 남들이 작성한 FP 스타일 코드를 무조건 많이 보는게 확실한 방법. 무수하게 사용하는 if..then..else 조차도 함수형 방법론에 의해 대체되면 인지적 자유와 해방감을 얻게된다. 곧 한번 코딩하면 그 부분은 논리 오류가 아닌 이상 문제가 없음을 확신하므로 더 이상 자신의 코드에 불안을 가지는 경우가 드물어간다.  작게 쌓아올리지만 결국엔 거대한 모습을 형성하게 됨을 볼 때, OOP는 후쿠시마산 농수산물과 같다는 생각이 들지도 모른다. 값 싸고 그럴듯해 보이는데 내부피폭을 유발하는 OOP.  그 내부 피폭에 해당하는게 OOP의 핵심이론이라니…ㅋ  아마도 깊은 빡침을 느낄지도 모른다.

 

FP를 반대하는 개발자는 OOP의 우수성과 비교하며 제발 OOP에 안주해주길 바란다. 적자생존 아니던가.. 사실 나도 FP를 OOP와 공존시키는 방법이 있는가 엄청 찾아보고 고민했었다.  원래 불가능한 것이며 하지 말아야 할 시도인데도 불구하고 그렇게 끈덕지게 달라붙었던 건, 아직까지 ‘현업’에서 OOP를 쓰기 때문이었다.  역시나 병신 짓을 반복했던 나. 그 ‘현업’이란게 나를 속여온 원흉 중 큰 부분인데 거기에 또 미련을 가진 이유가 뭐냐…  그러나 이제 OOP도 문제되지 않는다고하면 뭔 궤변같은 개소리냐 하겠지만, 사실 그렇다. 문제가 뭔지 알고 난 후에는 얼마든지 피해가는 방법이 보이기 때문이다.  쉽다고는 하지 않는다. 단지 비용이 들어갈 뿐이지. 그 비용은 회사 대표가 지출하는 것이고 문제삼지 않는다면 굳이 거기에 기를 쓰고 반대할 필요가 없다. 

 

시간… 시간이 필요하다.  함수형 코딩론은 이해가 된 시점부터 시간 싸움인 것 같다. 좀만 더 일찍 알았더면…  즐겁게 내가 만들고자 하는 것들을 구현하는 기쁨에 나이가 들던말던 개발자로서 살아가는 재미가 더 했을 텐데..

References   [ + ]

1. https://github.com/marpple/FxJS
2. https://github.com/andrwj/FPJS
3. https://folktale.origamitower.com/
4. https://www.youtube.com/watch?v=3VQ382QG-y4