#스페이스맥스 #클로저 #프렉티컬리
2022-07-12 Note archive logseq notes- #치트키: 스페이스맥스
- #속성완성: #이맥스 #스페이스맥스 21days
- [#스페이스맥스: #빔 가이드]
CANCELLED 스페이스맥스 버전 (2022)
기록이다.
====
type:: category:: tags:: #Spacemacs, #Emacs translate:: spacemacs 사용한 클로져 개발 환경의 이해 alias:: project:: url:: person:: progress:: ,
create-at:: week-at:: #2022-W28 editcount:: 1
- 이맥스+클로져+스페이스맥스+클로져모드+LSP 모드+코드포멧팅+레플+린터 등 도대체 알아야 할 것이 너무 많다.
- 아니, 몰라도 상관이 없던 시절도 있지만, 알아야 더 깊게 할 수 있지 않겠는가? 여기에 대해서 붕떠 있었는데 핵심에 다시 돌아 왔다.
- {{renderer :wordcount_msqhfjwdla}}
- MyCLJMacs 의 시작 - Emacs 28.1, Regolith Ubuntu 22.04, Spacemacs + Practically configs
- 의 dotfiles을 보면 간결하다. aws, git, regolith, zsh 이렇게 있다. 여기서 내가 가져다가 쓰는 것은 git 폴더 뿐이다. 근데 이게 다 인가? 이맥스 개발 환경 설정도 있을텐데… 이 부분은 문서에 다음과 같이 나와있다.
Tools with a larger configuration have been separated into their own repositories for convenience. [practicalli/clojure-lsp-config](https://github.com/practicalli/clojure-lsp-config)- Clojure LSP and cljfmt configuration [practicalli/spacemacs.d](https://github.com/practicalli/spacemacs.d/)- Clojure & LSP focused configuration for Spacemacs [practicalli/neovim-config](https://github.com/practicalli/neovim-config-redux)- Clojure, Conjure & LSP configuration with Fennel and Lua configuration
- 그럼 그렇지, 위에서 spacemacs.d 는 fork 해서 잘 쓰고 있다. 문제는 그냥 쓰니까 너무 많은 내용이 중간에 비어있다는 생각이 든다. 그리고 clojure-lsp-config 는 무엇인가? 무슨 문제가 있어서 내가 안 썼던 것 같은데… 근데 생각을 해보자. 오늘도 위에 리포들은 업데이트가 되고 있다. 그렇다는 말은 존이 실제로 쓰고 있다는 말이다.
- =args-out-error=가 clojure-lsp 에서 발생하는 것도 다 같은 맥락에서 나오는 문제가 아닌가? 이런 생각으로 =clojure-lsp-config=를 적용하고 나니 문제가 사라졌다. 그렇다면 clojure-dev 에 모든 문제는 사라진 것이다.
- 나는 이전에 WSL 에서 Emacs 개발 환경을 구성하겠다고 지난 달 말에 삽질을 좀 했었다. 그 때는 Sway+PGTK 를 쓰려다보니 Emacs-git 버전을 가지고 했었다. 물론 굉장히 어리석은 생각이었다. 멋대로 쓰려면 어느 정도 이 바닥에 익숙해야 한다. 그게 아니라면, 패키지 버전으로 사용하는 것이 최고다. 그리고 Native Linux 특히 X11 환경이 안정적이다.
- 의 dotfiles을 보면 간결하다. aws, git, regolith, zsh 이렇게 있다. 여기서 내가 가져다가 쓰는 것은 git 폴더 뿐이다. 근데 이게 다 인가? 이맥스 개발 환경 설정도 있을텐데… 이 부분은 문서에 다음과 같이 나와있다.
- 개발 환경의 구성을 파헤쳐 보자.
- 앞서 토픽에서도 다룬 바, 너무 많은 용어가 난립한다. 당황할 필요가 없다. 이맥스에 바로 붙여서 패키지를 쌓는 경우라면 각각을 고민해서 해야겠지만, 지금 나는 스페이스맥스를 사용하고 있으며 더구나 존의 설정 파일도 다 가지고 오지 않았는가? 그렇다면 밖에서 고민할게 아니라 스페이스맥스+존의 문서에서 해결을 봐야 한다.
- 존의 문서가 최신이 아니다 보니 존이 지금 쓰고 있는 환경 설정과도 다르다. 어디에 중심을 두어야 하는가? 내가 너무 집착하는 것도 있다. 그냥 쓰면 될 일인데…
구성=에 대한 기본은 =스페이스맥스 클로져 레이어
문서에 명시되어 있다. 존도 여기 있는 설정을 쓰는 것일 뿐이다. 다음을 보자.spacemacs/layers/+lang/clojure/README.md
- REPL via CIDER
- Code formatting via CIDER using Cljfmt
- Refactoring via clj-refactor
- Aligning of code forms via clojure-mode
- Debugging with sayid
- Advanced help with helm-cider
- Structuraly safe editing using optional evil-cleverparens
- Linting via clj-kondo
- 어느 정도 보는 눈이 생겼는지 위에 용어가 낯설지 않다. 아 그렇지. 스페이스맥스! 위대하도다!
- DONE 일어나서 여기부터 다시 하자!
- 문서와 현재 설정 파일과 비교하며 검증할 것
모든 문서는 OLD 이다. 소스 코드는 스스로를 설명한다. 왜 다른지 보고 해당 기능을 검증해야 한다.
TODO 설정 파일에 linters 를 명시하지 않고 있다. lsp 에 kondo 가 포함되어 있다고 한다. 이 부분을 검증 하는 방법은?
TODO
lsp-mode
설정에 default enable/disabled 를 확인하라!
- MyCLJMacs 의 시작 - Emacs 28.1, Regolith Ubuntu 22.04, Spacemacs + Practically configs
095 - Brave Clojure redux - Chapter 1-2 The REPL and Clojure Editors
095 - Brave Clojure redux - Chapter 1-2 The REPL and Clojure Editors - YouTube
이거다. 여기서 시작하면 되는거다. 멀리서 찾을 필요가 없었다. 다행이다. 95 면 최신 영상이다. 여기서 브레이브 책을 최신 클로저 개발 환경으로 다시 보기를 한다. 이게 내가 필요한게 아닌가?
앞선 영상에 CLI 파트를 다루고 있다. 예전에 대충 봤던 것 같은데… 아무튼 시작하자.
잘되네. 엄청나네. 그냥 터미널도 이맥스로 만들어. 멀티텀 쉽잖아. 그리고 레이아웃 바꿔가면서 하면 된다. 이게 제일 편하다. 문서화는 이렇게 하고 스크린샷 저장하고 절대 경로 넣어 놨으니까 편하게 하면 돼. 복사하면 돼
브레이브 간략 설명
레인으로 프로젝트 생성 레거시 방법
클로저 툴로 생성 - 존의 뎁 사용하나? 응! 근데, 여기 존 zsh 엄청 좋은데? 봐봐 이거 좀 나도 넣어주라. 캡처하자!
clojure -M:project/new figwheel-main practicalli/landing-page – –reagent 로 만드려는데 안되서 깜작 놀랐다. 분명히 존의 deps 리포가 있는데?!
문제는 리포가 홈에 있었다는거다. ~/.config/clojure 폴더에는 클로저 툴 껍대기가 있었다. 요게 문제였다. 둘중에 하나를 가져오는갑다. 우선순위는 XDG 홈이니까 존의 deps 를 사용하지 않는거다. 수정하니까 잘 된다.
별게 아닌게 아니다. 왜냐? 존의 deps 가 굉장히 쓸만한 건데 동작이 안되니까 버리게 된다. 그게 아니다. 이거 가지고 프로젝트 템플릿 생성할 수 있다. 굳
Chapter 1 Building, Running and the REPL :: Brave Clojure
1 장 이야기 다룬다. 레인, 클로저 툴, 레플, 에디터, 이든 등을 최신 내용을 반영해서 그리고 추가적인 자료를 보충한다.
clojure sample project
lein new app 을 하는 것과 유사한 구성을 만드려면 어떻게 해야 하나? 이건 엄청 간단한 질문인데. 내가 답을 못한다. 많이 안해봐서. 너무 중요하다. 특히, 위에 clojure-deps-edn 을 사용하고 있다면 여기에 맞는 커맨드를 익히면 좋다. 존이 관리하는 이든 파일은 커맨드라인부터 웹애플리케이션 까지 이든 구성이 다 되어 있다. 얼마전에 다시 좀 해보려는데 존이 먹여주는 이런 것들 때문에 오히려 뭘 할지 모르겠더라. 이게 참 애매하다. 아무튼 떠먹여주는 것들은 (실무자들이) 처음부터 욕심내면 안된다.
이든에 대해서는 중요한데 초보자들이 보는 자료는 레인이 많을 것이다. 클로저도 변화하고 있기 때문에… 근데 신경 쓸 필요 없을 것 같다. 그냥 클로저로 무언가 만들고 싶다면 만드는 것 자체에 집중하는게 좋다고 본다. 나는 이런 요소들에 집착한다. 정말 심하게. 이맥스도 그래서 다루는데 시간이 많이 걸렸다. 예를 들어 폰트가 이상하면 거기에 빠진다. 삼천포에 빠지는 것이다. 나는 극단적인 사람이다. 정도를 모른다. 그냥 하고 싶은 것. 순간에 끌리는 것에 빠진다. 물론 나쁜 것만은 아니다. 체계적으로 기록, 검색하는 방법만 있다면! (계속 비슷한 삽질을 하니까)
clojure -M:project/new app junghan0611.clojure-noob-clj
이렇게 하면 된다. 존의 이든 파일이 있으면 된다. 거기에 레인과 유사한 템플릿을 만들어 놓았다. junghan0611 은 네임스페이스에 해당한다. 네임스페이스 생성을 권장하기에 깃헙 이름으로 만들었다. 이렇게 통일하자. junghanacs 로 할껄 그랬나. 여기서 app 이 템플릿 이름이다.
clojure -M -m junghan0611.clojure-noob-clj
-M 이 메인 함수를 호출. -X 는 exec 함수를 호출하는 커맨드다. 결과는 헬로 월드가 나온다. 즉 레인과 동일하다. 즉, 이로써 레인을 벗어나게 되었다. 이런식으로 템플릿을 사용해서 프로젝트를 빌드업하고 작업할 수 있다. 감사합니다. 존님.
uberjar
이런. 열심히 글 써놓았는데 잘못눌러서 이맥스가 꺼졌다. 자동저장을 꺼놓은터라. 날라갔네?! 된장.
간략히 정리하자. 레인에서 uberjar 생성한다.
clojure-tool 로 해보자. 095 영상과 다른 점은 존의 이든 파일이 업그레이드 되었다는 것이다. 생성한 프로젝트의 리드미 파일을 보면 빌드 테스트하면 생성된다고 적혀 있다.
존의 공식 이든 파일을 보면 Project packaging 파트가 있다. 거기에 관련 커맨드가 있다. 스크린샷을 넣자.
위와 같이 하면 된다. 해볼까?
$ clojure -X:project/jar :main-class junghan0611.clojure-noob-clj :aot true $ clojure -X:project/uberjar :main-class junghan0611.clojure-noob-clj :aot true 결과는 project.jar, uber.jar 파일을 확인하면 된다.
영상과 링크가 달라서 헤맸네! Clojure CLI Overview · Practicalli Clojure 여기에 관련 치트쉬트가 있다.
위에서 중요한 것은 Defined In
일 것이다. 프렉티컬리가 많은 것으로 봐서는 존의 이든을 클론하면 위와 같이 TASK 에 따라서 커맨드처리를 할 수 있다. 아무튼 클로저 툴을 잘 활용해야 하기 때문에 최신 변경 내용을 잘 확인하면서 해야 한다.
이맥스를 사용하는 것은 모든게 위험 요소 같다. 이 기능을 누가 제공해주는 것인지… 명확해야 한다. 예를 들어 LSP 방식으로 동작한다면 이맥스는 인터페이스만 사용하는 것이다. 반대로 CIDER 내장 기능은 elisp 으로 구현되어 있는거다. 이맥스라고 봐야 한다. 클로저 툴은 클로저로 작성된 CLI 일 뿐. 이맥스의 clojure-mode 에서 커맨드를 내려주면 땡이다. 근데 이 기능이 어디에 어떻게 키바인딩이 되어있지? 모르면 터미널을 열어야 하나… 이맥스를 잘 써보자. 그래서. 한번 해보면 된다.
22/10/24–15:03 :: 아가 데리러 갈 시간이다. 22/10/25–06:27 :: 이제 다시 시작하오. 더 연속 집중해야 하는데 거참. 오늘은 하원하지말고 7 시에 데리러가서 씻겨서 보내자. 하루 계획을 잡고 가자! 잠시만! 22/10/25–10:50 :: 고요하다. 이제 다시 시작하자. 타이머 걸었다.
REPL
lein repl
다음과 같이 나온다. 끝.
clj-tools repl
먼저, clojure or clj 를 실행하면 user repl 을 사용할 수 있다. bb 는 따로 다루기로 한다.
clojure -M:repl/rebel
이게 뭐지? 존의 이든에서 보면 Rebel Readline enhanced REPL UI
라고 한다. 의존성을 보니 CIDER 위에 rabel-readline 을 추가한 것이다. 좋구먼. :repl/ <Tab>을 누르면 관련된 명령이 자동완성 된다. (map 을 입력해보면 map 의 타입 정보가 나온다. REPL 을 똑똑하게 활용하게 한다. C-x C-d를 입력하면 docs 가 출력된다. repl 에 왜 키바인딩이 들어가나 했는데 보통이 아닌 녀석이로구먼.
이런식으로도 활용할 수 있다.
관련 내용은 존의 문서를 참고하면 된다. 아래 링크가 Rebel 에 대한 이야기다. Terminal REPL · Practicalli Clojure
clojure -M:repl/rebel-nrepl 을 해보니 없다네?! 영상이 2021 년 1 월이니 그 사이에 존이 이든을 바꾸었나 보다. 뭘 어떻게 바꾸었나? 사실 존 문서가 가지는 장점이자 단점이다. 초보인데 뭐 하라고 해서 해보니까 안된다.
확인해보니 rebel 을 하면 nrepl 서버까지 실행해준다. 따로 구분할 필요가 없이 통합한 것이다. 그러면 위의 방식대로 터미널 레플 및 서버 실행을 한번에 하고 에디터에서 붙여보자. jack-in 이 아니라 connect-in 이 될 것이다.
위와 같이 connect 한다. 서버를 실행해 놓았기 때문에 선택할 수 있다.
shared repl on multiple editors
바로 위와 연결된 이야기인데… jack-in 하지 않고 따로 레플 서버를 띄워 놓고 붙이는 것에 장점이 확실히 있다. 에디터가 뻑이 나도 레플 상태를 유지 할 수 있다는 점 이외에 당연하지만 생각치 못한 부분이여서 좋았다. 필요할지는 모르겠다만…
레플 서버를 띄워 놓고, 이맥스에서 연결하고 코드에서도 연결한다. 로컬에서 이렇게 하니까 뭐하는거지 싶을 수도 있는데… 혼자 개발하면서 이맥스에 익숙치 않으니까 코드에서 작업하고 이맥스로도 하나씩 테스트(?)하면서 배워가는 방법으로 괜찮을 수도 있겠다.
아니면, 원격지 레플 서버에 여럿 개발자가 따로 붙어서 디버깅을 하는 시나리오 도 가능할 것 같다. 에디터를 뭘 쓰던 상관이 없으니 각자 개성에 맞게 작업하면 될 일이다.
레플 기반 프로그래밍이 엄청난 장점이라고 말을 하지만 경험하지 않고는 아무것도 느낄 수 없다. 머리로 아는 것은 껍데기에 지나지 않는다. 같은 정보를 얻었다고 다 같은 것이 아니다. 지식에서 지혜로 끌어 올리기 위해서는 경험이 필요하다. 경험이라고 단정지으면 굉장히 무책임하게 느껴진다. 내 입장에서 그렇다. 경험을 응축, 압축 시켜서 엑기스로 만드는 방법이 어디 없는가? 그래야 고독한 늙은이도 고시원 방 한칸에서 꿈을 꿀 수 있지 않겠는가? 여기에 개발 환경이 역량이 들어난다. 코드도 텍스트다. 텍스트 지식 관리에 일부분이다. 나는 이맥스가 이런 역할을 하리라는 믿음으로 하고 있다. 이 믿음은 신에 대한 믿음과 다르다. 입증된 과학적 사실에 대한 종교적 신뢰를 보내는 것이다.
위는 영상을 캡처한 것이다. 실제 해보면 Clojure CLI -> deps.edn 으로 바뀌어 표기되는 것 빼고는 차이 없다. 잘 된다.
Clojure-aware editors (+VSpaceCode)
Clojure Aware Editors · Practicalli Clojure 에디터에 대해서는 위의 존의 문서가 도움이 된다.
헉. 존이 코드를 사용하는데 키매핑을 스페이스맥스와 유사하게 바꿔서 쓴다. 이거 자료 어디있나?! 위 링크에 VSpaceCode Calva 를 따라가면 된다. VSpaceCode 가 뭔가 했다. 설치 방법은 calva, vspacecode 설치하면 되는데…
VSpaceCode 와우!!
VSpaceCode Calva · Practicalli Clojure 자세한 설치는 위의 링크를 따라하면 되겠다. 몰랐네 여태!! 대박이로구만. vspacecode 를 설치하면 자동으로 vim, which-key 가 설치 된다. vim 을 지우지마라. 그리고 calva 에서도 vim extention 이 있다고 링크를 알려준다. 거기에 보면 <esc> 키 리매핑하는 방법이 나와있다. 물론 위에 존의 문서에도 나와있다. 존의 문서에 calva 클로저 키매핑 관련 이야기가 있는데 그건 따로 안했다. 반영이 된 것 같다. 일단 vscode 가 메인은 아니니까. 부담이 없이 활용할 수 있다 정도만 생각한다. 감사할 따름이다.
아래에 SPC 입력 할 때 루트 키매핑 메뉴다. 스페이스맥스랑 동일하다. 스페이스맥스 키바인딩으로 코드를 다룰 수 있다는 것은 굉장한 이점이다. 스페이스맥스 레이어에 메인이 아닌 언어를 다 넣고 싶지 않았다. 파이썬 같은 경우 는 코드에서 열면 뭐 필요한것들 다 설치해주는 등 엄청 편하더라. 아무튼 하나로 모든 것을 커버할 수 있으면 좋다. 물론 에디팅은 빔이지만 그외 IDE 를 구성하는 모든 기능을 하나의 키매핑으로 관리할 수 있기 때문이다.
Socket REPL 여기에 대해서도 다룰 수 있으면 라즈베리 파이에서 쉽게 레플 붙여서 개발 할 수 있다.
096 Ch3 Do things: A Clojure Crash Course
096 - Brave Clojure redux - Chapter 3 getting started writing Clojure - YouTube
Ch3 A Clojure Crash Course
일단 096 폴더 만들고 여기서 사용할 프로젝트를 생성하자.
clojure -M:project/new app junghan0611.getting-started
다 타이핑을 해봐야 된다. 물론 머리로 다 기억하면 좋겠지만… 어딘가에 적어놓아야 한다. 솔직히 여기 적어 놓았다고 찾아볼까? 물론 찾을 수 있다. 이맥스니까 deft 를 열고 검색을 하면 쉽다. 커맨드 라인으로 해도 되고 org 폴더에서 이맥스 search ripgref 돌리면 된다. 이렇게 하는게 효과적인 것은 아니다.
기본적으로 mcfly 를 사용한다. 아래 화면과 쉘의 history 를 검색 가능한 형태로 확장해준다. 정말 훌륭하다.
여기에 존의 영상을 보면서 zsh 활용법을 배웠다. 기존 oh-my-zsh 를 버리고 prezto(?) 로 바꾸었다. clojure 까지만 입력하고 위아래만 누르면 zsh 히스토리에 따라서 커맨드를 보여준다. oh-my-zsh 에서도 비슷하게 뭔가 되는 것 같긴 했는데… 미진했다. 여기서는 깔끔하게 지원이 된다. 물론 mcfly 가 정말 훌륭하다. 삼천포는 아래 따로 추가 정리를 했다.
스페이스맥스 layout, workspace, bufler, project.el 등
코드로 가려고 한다. 무슨 말인가? 이 문서는 noname 레이아웃(워크스페이스)에서 작성 중이다. org-mode 로 작업하고 있는 것이다. 나는 아래와 같이 스페이스맥스에 여러 개의 레이아웃을 만들어서 사용한다. 클로저 레이아웃으로 가서 작업을 할 것이다. 아! 내가 제대로 프로젝타일을 사용하지 않지만, 프로젝타일이나 project.el 이 해주는 기능이 유사하지 않을까 싶다. 물론 거기서 중심은 디렉토리, 파일 등의 데이터 묶음이겠지만 말이다. 레이아웃 관점에서는 bufler 패키지가 현재 레이아웃을 북마크에 저장해주는 기능을 한다. 스페이스맥스의 레이아웃은 이게 어느 패키지를 사용하는지는 모르겠는데 워크스페이스(?)라고 해야 하나? 아무튼 이런 방식으로 스위칭을 하는데 나름 괜찮다.
물론 클로저 레이아웃에 가면, 클로저 프로젝트 A, B, C 를 프로젝타일을 사용해서 관리하면 될 것이다. 레지스터, 북마크, bufler 도 마커로써 도움을 줄 것이다.
코딩 해보자
이맥스는 고정셋으로 하는게 아니다 보니 뭐 하나하나가 스타일이고 말할꺼리가 된다. 삼천포로 계속 빠지게 될 것이다. 진짜 가자!