반응형 기술적인 이야기/이맥스27 macOS에서 Emacs가 실행되지 않기 시작했다 개인적으로 선호하는 편집 환경인 Emacs는 macOS 상에서 편하게 빌드하기 위해 Homebrew를 통해 emacs-plus 패키지로 설치하는 편인데 상당히 오랜 기간 잘 써왔고 별 문제도 없었기에 지금에 이르고 있다. 다만 최근에 emacs-plus를 업그레이드 한 이후로 문제가 생기기 시작했는데 제목과 같이 Dock이나 파인더에 있는 바로가기를 통해서 앱이 실행되지 않는다는 점이다. 이 문제를 해결하기 위해 상당한 삽질을 했지만 실패했고 그나마 대안을 찾았다.좀 더 상세한 문제 내용언제부터인지 모르겠지만 emacs-plus의 정보나 설치 후 메시지를 살펴보면 아래와 같은 문구를 볼 수 있었다.여기서 osascript를 사용하는 긴 커맨드가 보인다. 기존에는 빌드된 앱(Emacs.app)을 링크(li.. 2024. 12. 17. 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. Emacs 29.2를 설치하고 그게(?) 나았다 Emacs 28 버전대를 써온 지 굉장히 오래되었다. 적어도 2년은 넘은 것 같다. 잘 돌아가기도 했었기에 그랬지만 Homebrew에서 업그레이드 커맨드를 때려도 딱히 설치되는 것이 없어서 아직 이게 최신버전인 줄 알았다. 하지만 그럼에도 내 Emacs는 뭔가 잘 안 굴러가는 상태였다. 시작할 때도 오래 걸리고, Org Mode 문서를 열 때도 오래 걸렸다. 무엇보다 내 GitHup Pages용 페이지 컨버터 스크립트를 돌릴 때도 한창때의 10배 이상 걸릴 정도로 뭔가 잘 안 맞게 돌아가고 있었다. 마치 동맥경화에 걸린 것 같은 그런 느낌적인 느낌이랄까? 고지혈증에 걸린 이 글을 쓰는 작자는 동병상련… 따윈 아직 못 느꼈지만 어쨌든 답답한 것에는 틀림이 없었다. 그러다 Emacs 29.2 릴리즈 소식을 .. 2024. 1. 25. 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. 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. 파일 읽어서 내용 수정하고 저장하기 (Emacs Lisp) Emacs Lisp을 이용해 특정 파일 내용을 읽어서 여기에 몇 가지 내용을 추가한 후 다른 파일로 저장하는 코드입니다.(with-temp-buffer (insert-file-contents "/foo/bar/file.md") (goto-char (point-min)) (insert "# New Header") (search-forward "Status: ") (insert "TODO") (goto-char (point-max)) (insert "# Footer") (write-file "/foo/bar/file-updated.md"))추가로 아래와 같은 함수를 참고할 수 있습니다.(erase-buffer) :: 버퍼 내용을 몽땅 삭제(delete-char N) :: N 개수만큼 글자를 삭.. 2020. 3. 23. 이전 1 2 다음 728x90 반응형