반응형 이맥스34 tab-width가 8이 아니라는 Emacs의 불평불만 어느 날 개인적으로 만들어 쓰던 Org to GitHub Pages의 출력 스크립트가 또 에러가 나기 시작했다. 위 스크린숏의 마지막 메시지에서도 보이지만 정확한 에러 메시지는 아래와 같다.custom-initialize-reset: Tab width in Org files must be 8, not 4. Please adjust your ‘tab-width’ settings for Org mode.이 글의 제목은 약간 왜곡되었는데, 정확히 말하자면 Emacs가 아니라 Emacs에서 구동되는 Org Mode의 한 스크립트의 Assertion 구문의 불평불만이었다.어쨌거나 이 에러의 원인이 뭔지 찾아보기 위해 --debug-init을 줘서 실행시켜 봤는데 별로 도움은 안 되었다.Debugger enter.. 2024. 2. 20. Scratchpads - 긴급(?) 메모 작성용 vscode 플러그인 개인적으로 Emacs에서 좋아하는 기능 딱 하나를 꼽으라면 어이없게도 스크래치 버퍼(Scratch Buffer)를 고른다. 뭐냐 하면 그냥 아무거나 막 쓸 수 있는 임시 메모장 같은 거다. 이맥스의 기본 버퍼 중 하나일 뿐이지만 개인적으론 굉장히 자주 사용하는 기능이다. 설정에 따라 메모 내용이 저장되기도 하지만 기본적으론 저장이 되지 않는 정말 임시 용도로만 쓰는 메모 공간이다.최근에는 Emacs 대신 vscode를 메인 에디터로 바꾸면서 난감함을 겪게 되었다. 바로 이 스크래치 버퍼가 없다는 문제 말이다.물론 해결 방법이 없는 것은 아니다. 그냥 새 파일 하나를 열어서 막 쓰면 된다.근데 이런 수작업이 귀찮았다. 파일 저장하지 않으면 뭐라 하고, 또 코드를 작성하려면 특정 파일 확장자를 강요받기도 하.. 2022. 3. 27. org-publish에서 탈출하기 그냥 개인적인 욕심이긴 했지만 그동안 수많은 고난(?) 속에서도 억지로 개인 노트를 Emacs에서 org 문서로 작성해서 org-publish로 출력해서 Github Pages에 정적 사이트로 올리는 짓(?)을 했다. 구글 크롤러가 안 도와주고 애드센스도 붙이는데 우여곡절이 있었다. 그래도 대부분 원하는 바를 성공시키긴 했었다. 여전히 구글이 사이트맵은 잘 안 긁어가지만 말이다.하지만 이제는 다른 이유로 블로그 단일 체제로 바꾸기로 결심했다. Emacs 때문이다. 개인적으로 정말 선호하는 에디터이자 환경인 이 소프트웨어 때문이다.사실 명확하게 말하자면 Doom Emacs의 문제다. 업데이트를 할 때마다 높은 확률로 뭔가 문제를 겪었다. 특히 유독 org-publish를 개인적으로 심하게 커스텀한 코드 실.. 2022. 1. 10. Org Mode 기반 정적 사이트 운영 느낌 정리 이 블로그에도 기록을 종종 남기곤 하는데, Emacs에서 Org Mode를 이용해 글을 쓰고 Org Publish를 이용해 정적 사이트를 생성하는 방식으로 운영하는 개인용 GitHub Pages가 있다. 구글이 사이트맵을 잘 안 읽어가서 - 1년에 두 번 읽으려나 - 운영의 의욕이 종종 떨어지기도 하는 등 불평불만을 하기도 했는데, 지금까지 운영해오며 느낀 장단점 썰을 풀어볼까 한다.장점들Emacs: 이맥스에서 글을 쓸 수 있다는 것 자체가 축복이다. 편하고 손에 익은 에디터라는 것만으로 그 어떤 웹 기반 블로그나 에디터와는 비교가 불가능한 장점이 있다. 거기에 Emacs Lisp의 스크립팅을 이용한 자동화와 Org Mode 자체의 풍부한 기능도 이용할 수도 있다.구성의 자유: 레이아웃이든 색상이든 광고.. 2021. 12. 12. gccemacs를 (당분간) 포기했다 gccemacs를 쓰는 것은 퍼포먼스 때문이었다. 해당 OS의 바이너리 포맷으로 컴파일하는 Native Compilation 기능은 당연히 바이트 컴파일만 된 스크립트보다 로딩 및 파싱이 빨라야 한다. 컴파일하는 시간이 오래 걸린다는 점을 제외하곤 모든 것이 좋으리라 생각했다. macOS에서 gccemacs 설치하기(feat. emacs-plus)Homebrew를 통해 설치할 수 있는 이맥스(Emacs) 중 몇 안 되는 GUI가 제대로 돌아가는(?) 프로젝트인 emacs-plus에서 오랜 시간 동안 native-comp 즉 gccemacs를 지원하기 위한 논의와 개발이 있었다. 한참을 지.seorenn.tistory.com물론 시작부터 단점이 있었다. 아직 Emacs 28 버전에서만 지원된다는 점이 있다.. 2021. 5. 12. macOS에서 gccemacs 설치하기(feat. emacs-plus) Homebrew를 통해 설치할 수 있는 이맥스(Emacs) 중 몇 안 되는 GUI가 제대로 돌아가는(?) 프로젝트인 emacs-plus에서 오랜 시간 동안 native-comp 즉 gccemacs를 지원하기 위한 논의와 개발이 있었다. 한참을 지켜보다 잠깐 모니터링을 깜빡한 사이 기쁘게도 이 기능이 어느 정도 동작하는지 코드에 반영이 되어 있었다. 그래서 당장 설치를 시도해봤다.참고로 gccemacs는 이름에서 느낄 수 있듯이 Emacs Lisp 네이티브 컴파일을 지원하는 이맥스다.전제 조건으로 Emacs 28.x 버전만 지원된다는 단점이 있다. 이 버전은 개발 중인 불안정 버전인 만큼 실 업무에 사용하기에는 주의가 필요할 것 같다.설치 커맨드는 아래와 같다.brew install emacs-plus@2.. 2021. 1. 11. 터미널에서 Doom Emacs의 복사가 동작 안 하는 문제 터미널 환경이 원래 GUI랑은 조금 다르긴 해서 복사 및 붙이기(copy and paste) 환경이 호환이 안 되는 경우가 많다. macOS에서는 이 문제를 해결하기 위해서 pbcopy나 pbpaste 같은 터미널 커맨드를 별도로 활용하는 방법을 주로 사용한다. 하지만 직접 설정하는 것은 좀 귀찮은 편이다.Doom Emacs도 -nw 옵션을 줘서 기본적인 터미널 실행환경으로 실행할 경우 y키로 복사(yank)가 안 된다. (Evil 사용 시 이야기다) 붙이기는 어느 정도 동작하는데 내부에서 복사가 안 되면 많이 불편하다. 물론 구태여 터미널에서 왜 이맥스를 돌리냐는 이야기가 있을 수 있는데 터미널 취향인 사람에겐 중요한 문제일 수도 있다.다행히도 이 문제는 쉽게 해결이 가능하다. 그저 시작 가이드 문서에.. 2020. 12. 16. Doom Emacs에서 Python 개발 환경 설정하기 Doom Emacs는 상당히 설정이 잘 되어 있는 설정 팩이지만 여기에 Python 모듈만 집어넣는다고 파이썬 개발 환경이 원하는 대로 완벽하게 잡히지는 않습니다. 이 글은 Doom Emacs에서 Python 개발 환경을 설정하기 위한 주관적인 기초 설정을 하는 법을 정리합니다.참고로 이 글을 쓰는 사람은 macOS가 돌아가는 맥을 사용 중입니다. 따라서 윈도 환경에서는 좀 차이가 날 수 있습니다.init.elDoom Emacs 설정의 가장 기본은 바로 이 init.el에서 시작되지요. SPC f p 키를 눌러서 init.el 파일을 쉽게 열 수 있습니다. 이 파일에는 각 모듈을 카테고리별로 정리해놓고 주석만 풀어주면 바로 사용할 수 있게 준비되어 있습니다.개인적으로는 syntax 모듈과 python 모.. 2020. 10. 21. Org Mode에서 노션(Notion)으로 갈아타기 제법 오랜 기간 동안 개인적인 용도의 노트들을 Org Mode를 이용해 작성하고 관리했었습니다. 하지만 최근에는 노션(Notion)이 무료 플랜의 제한을 많이 풀게 되면서 노션으로 노트 플랫폼을 이주했습니다. 이번 글은 왜 노트 플랫폼을 옮겼나 간단히 매우 주관적으로 정리해보는 글입니다.Org ModeOrg Mode는 이맥스(Emacs)의 킬러 소프트웨어라 불릴 정도로 유명한 빌트인 확장입니다. 이 확장에는 문서나 어젠다와 관련된 다양한 기능이 모여 있습니다. Org Mode 자체에도 플러그인 확장을 추가하여 Org 문서 기반의 데이터베이스를 구축하는 등 Org Mode는 사실상 Org 문서 기반의 플랫폼으로 볼 수 있습니다.앞서 이미 갈아탔다고는 표현했지만 개인적인 용도의 노트를 정리하기 위한 용도로만.. 2020. 10. 16. Emacs 27.1 안정버전 공식 릴리즈 GNU Emacs의 27.1 버전이 공식 릴리즈 되었습니다. 이번 릴리즈는 안정 버전 릴리즈이며 27 버전의 첫 릴리즈이기도 합니다. 아래는 공식 사이트에서 정리하고 있는 릴리즈 내용입니다.Built-in support for arbitrary-size integersText shaping with HarfBuzzNative support for JSON parsingBetter support for Cairo drawingPortable dumping used instead of unexecSupport for XDG conventions for init filesAdditional early-init initialization fileLexical-binding is used by defaultBui.. 2020. 8. 12. Emacs 업그레이드 후 겪은 Doom Emacs 오류 문제 어느 날 Emacs 버전을 새로 올렸습니다. 대망의 27 버전으로 올렸지요. 별문제 없이 빌드가 되었고 Doom Emacs 스크립트만 다시 설치하는 과정을 거친 후 정상적으로 동작하는 것을 확인하였습니다.문제 발생그런데 개인적으로 작성한 어떤 스크립트를 동작시키니 아래와 같은 오류가 나기 시작했습니다.if: No catch for tag: emacs-version-changed, nil우와. 뭔 소린지 모르겠습니다. 태그를 잡을 수 없다니요. 아아...하지만 다행히도 구글링을 통해 선구자(?)들의 한숨과 해답을 찾을 수 있었습니다.이 문제의 원인은 빌드된 패키지가 들어있는 straight가 현재 동작 중인 Emacs 버전과 다른 버전으로 빌드가 되어서 발생한다고 합니다. 그렇다면 이 부분을 새로 빌드해 .. 2020. 6. 17. Property List (Emacs Lisp) Property List(plist)아래처럼 key-value가 나열되는 형태를 프로퍼티 리스트라고 합니다.'(name "Conrad" age 20 phone "82-10-1234-5678" address "Earth, Milkyway, Laniakea Supercluster")일반적인 언어의 사전형(Dictionary) 타입과 비슷한 형태로 유추됩니다.키를 위 처럼 그냥 문자열로 해도 되고 콜론(:)으로 시작되는 심볼로 해도 관계는 없습니다. 하지만 백틱을 이용해 인용(quote)한 상태로 정의해버리면 나중에 액세스가 힘들어질 수도 있습니다.값 읽기값을 읽을 때는 plist-get을 사용합니다.(let ((plist '(name "Conrad" age 20 .. 2020. 3. 30. Let과 Let* (Emacs Lisp) Emacs Lisp에서 이름이 닮은 let과 let*의 기능과 차이점을 간단히 정리해 봅시다.letlet은 Emacs Lisp에서 지역 변수(Local Variable)를 정의할 때 사용합니다.(let ((a 1) (b 2)) (+ a b));; => 3let 내부에는 progn 처럼 Lisp 코드를 나열할 수 있고 마지막 값이 반환 값처럼 동작합니다.생성된 변수는 지역 변수이기 때문에 let 리스트 외부에서는 동일한 이름의 변수에 접근할 수 없습니다.(let ((a 1) (b 2)) (+ a b))(+ a b);; => Symbol's value as variable is void: a각각의 변수는 각자의 영역(?)에서 생성되기 때문에 초기화 단계에서 서로를 참조할 수 없습니다.(.. 2020. 3. 30. Filter와 Map (Emacs Lisp) Filter(require 'seq)(seq-filter (lambda (x) (= 0 (% x 2))) '(1 2 3 4 5 6));; => (2 4 6)seq 패키지에 들어있는 함수이기 때문에 상황에 따라 임포트를 해야할 수도 있습니다.Map(mapcar (lambda (x) (* x 2)) '(1 2 3 4 5));; => (2 4 6 8 10)물론 lambda 대신 일반적인 함수도 사용할 수 있습니다.Map(2)(mapc (lambda (x) (* x 2)) '(1 2 3 4 5));; => (1 2 3 4 5)이름 때문에 적어보긴 했는데, 사실 mapc는 Map이라고 하기엔 좀 그렇고, 오히려 Interation에 가깝습니다. 따라서 다른 언어의 for문과 비슷하게 리스트 원소를 이용.. 2020. 3. 30. 문자열 처리 함수들 (Emacs Lisp) 문자열 생성이어붙이기(concat "a" "b" "c");; => "abc"포매팅(Formatting)(format "%d + %d = %d" 10 20 30);; => "10 + 20 = 30"문자열 리스트나누기(Split)(split-string "my name is conrad" " ");; => ("my" "name" "is" "conrad")마지막 파라미터를 구분자로 이용해 입력된 문자열을 리스트로 나눠줍니다.합치기(Join)(string-join '("my" "name" "is" "conrad") " ");; => "my name is conrad"마지막 파라미터는 생략 가능합니다.기타문자열 비교(string= "abc" "abc");; => t문자열 검색(string-match "amp" ".. 2020. 3. 29. 리스트 다루기 (Emacs Lisp) 리스트 생성그냥 생성하기(list 1 2 3 4);; => (1 2 3 4)위의 경우가 가장 가독성은 좋은 코드이겠지만 보통은 아래처럼 백틱을 이용한 quote 구문을 많이 사용합니다.'(1 2 3 4);; => (1 2 3 4)순차적인 리스트 만들기(number-sequence 2 5);; => (2 3 4 5)굳이 정수가 아니라도 사용 가능하니 매뉴얼을 읽어봅시다.리스트에 추가하기제일 앞에 추가하기(cons 1 '(2 3 4));; => (1 2 3 4)리스트끼리 연결하기(append '(1 2 3) '(4 5 6));; => (1 2 3 4 5 6)리스트끼리 연결하기(2)(let ((some-list '(1 2 3))) (nconc some-list '(4)) some-list);; => (1 .. 2020. 3. 24. Emacs 이 블로그의 Emacs Note 카테고리 글 일부를 별도로 링크로 정리하는 글입니다. 카테고리로 보기가 불편할 때 참고하기 위한 지극히 개인적인 용도입니다.Emacs Lisp리스트 다루기파일/디렉토리 경로와 관련된 Emacs Lisp 함수들문자열 처리 함수들Filter와 MapLet과 Let*Property ListEmacs Lisp Snippets파일 읽어서 내용 수정하고 저장하기Org Mode TipsOrg Mode 문서에 외부 이미지 넣기Org Mode 테이블 스프레드시트Org Publish로 익스포트 자동화하기 2020. 3. 24. 파일/디렉토리 경로와 관련된 Emacs Lisp 함수들 파일 경로나 디렉터리 경로를 다루는 Emacs Lisp 함수 몇 가지를 정리합니다.완벽한(?) 경로 구하기(expand-file-name "~/.emacs.d");; => "/Users/seorenn/.emacs.d"UNIX에서 홈 디렉터리($HOME)를 축약해서 표시하는 문자인 ~(Tilde, 물결 혹은 지렁이 무늬)를 원래 경로로 치환하는 데 주로 사용합니다.와일드카드를 이용해 특정 경로의 파일 목록 구하기(file-expand-wildcards "~/.emacs.d/*.el");; => ("~/.emacs.d/early-init.el" "~/.emacs.d/init.el" "~/.emacs.d/init.example.el")배치 작업을 위해 파일 목록을 구할 때 편하게 사용할.. 2020. 3. 23. 이전 1 2 다음 728x90 반응형