hoisharka's blog Front-end Dev Engineer

emacs org-mode jekyll

지금까지 작성한 포스트는 md파일로 포스트를 작성하고 jekyll로 html변환을 하는 방식이었다. 그런데 이제 org모드에 익숙하기 때문에 org모드로 문서작성을 많이 하는데 이것을 바로 포스팅하고 싶어졌다.

찾아보니 괜찮은 방법을 알아냈다. org 파일로 작성한 포스트를 html로 바꾸고 이것을 jekyll 서버로 올리는 방식이다. org파일은 jekyll프로젝트 하위에 _org 폴더를 만들어 보관한다.

  1. org 파일은 jekyll 프로젝트 하위에 _org 디렉토리를 만들어 보관한다.
  2. org파일을 html로 만들 때 필요한 설정을 init.el에 추가하여 실행한다. _org의 파일을 퍼블리싱하여 _posts에 놓겠다는 내용인 듯하다.

    (setq org-publish-project-alist
          '(("org keyll publish"
             ;; Path to org files.
             :base-directory "~/hoisharka.github.io/_org"
             :base-extension "org"
    
             ;; Path to Jekyll Posts
             :publishing-directory "~/hoisharka.github.io/_posts/"
             :recursive t
             :publishing-function org-html-publish-to-html
             :headline-levels 4
             :html-extension "html"
             :body-only t
             )))
    
  3. org파일의 해더에 내용을 적는다.

    #+OPTIONS: toc:nil num:nil
    #+BEGIN_EXPORT html
    ---
    
    title: emacs org-mode jekyll
    layout: post
    categories: [tool]
    tags: [emacs org-mode jekyll]
    
    ---
    #+END_EXPORT
    
  4. 그 아래 내용을 적는다.
  5. C-c C-e P p 커멘드로 퍼블리싱한다.
  6. _post 디렉토리에 html파일이 추가된 것을 확인할 수 있다.
  7. 이것을 commit 및 push 하면 포스팅이 완료된다.

emacs google-translate

google-translate

emacs에서 바로 구글번역을 사용할 수 있게 도와주는 패키지이다.

간단한 사용법

  1. 아래 설정을 init.el에 추가하고 실행한다.

    ;; google translate
    (use-package google-translate
      :ensure t
      :config
      (require 'google-translate-smooth-ui)
      (setq google-translate-translation-directions-alist
            '(("en" . "ko") ("ko" . "en")))
      (setq google-translate-output-destination nil)
      (setq google-translate-pop-up-buffer-set-focus t)
      (setq google-translate-default-source-language "en")
      (setq google-translate-default-target-language "ko")
      (global-set-key "\C-ct" 'google-translate-smooth-translate))
    
  2. 번역할 영어 문장을 region으로 선택한다.
  3. C-ct 커멘드를 임력하면 팝업 버퍼가 열리면서 번역된 내용이 나타난다.

emacs yanippet 다시 설정하기

지킬 블로그 포스팅을 작성할 때 적어야하는 메타 데이터를 yasnippet으로 작성해 둔 적이 있었다.

최근에 emacs 최신 버전으로 설치한 후 init 파일을 다시 정리하고 있어서 이전에 설정해 놓은 포스트 메타 데이터를 자동 생성하는 yasnippet이 날아가버렸다.

어떻게 설정했는지 기억이 안나서 내가 올려놓은 포스팅을 보고 따라해봤다(emacs yasnippet 사용하기) . yasnippet 등록까지만 되고 설정해놓은 key를 입력하고 탭을 눌러도 반응이 없었다.

다시한번 yanippet을 설치하는 설정부터 알아봤다. init.el에 아래 설정을 추가하면 된다. yanippet 패키지에 yasnippet-snippets 패키지까지 설치한다. yasnippet-snippets 패키지는 이미 만들어놓은 여러 snippet들을 모아놓은 패키지이다.

yanippet 설정.

(use-package yasnippet
  :ensure t
  :init
    (yas-global-mode 1)
  :config
  (use-package yasnippet-snippets
    :ensure t)
  (yas-reload-all))

설정 추가 후 C-x Ce로 코드를 실행시킨다. 패키지들이 깔려있지 않다면 설치가 진행될 것이다. 만약 설치 시 에러가 난다면 M-x package-refresh-contents를 실행하여 패키지목록을 갱신해준다. 그래도 에러가 나면 package-archives 설정을 다시 확인해봐야될 것이다.

다음은 markdown 설정이다.

markdown 설정

(use-package markdown-mode
  :ensure t
  :commands (markdown-mode gfm-mode)
  :mode (("README\\.md\\'" . gfm-mode)
         ("\\.md\\'" . markdown-mode)
         ("\\.markdown\\'" . markdown-mode))
  :init (setq markdown-command "multimarkdown"))

설정 추가 후 C-x Ce로 코드를 실행 시킨 후 emacs yasnippet 사용하기 에서 등록했던 jph(jekyll post header를 약자로 해서 지음)를 .md 확장자 파일에서 실행했다.

정상적으로 snippet이 자동완성 되었다.

추가로 yasnippet-snippets 패키지에 포함된 이미 만들어져있는 snippet을 사용하는 방법을 적어본다.

M-x yas-describe-tables 으로 snippet 목록을 확인할 수 있다.

emacs-yasnippet-snippets.png

내가 작성한 jph를 포함해서 다양한 snippet 목록을 확인할 수 있다. 사용할 snippet의 key를 타이핑하고 탭을 누르면 해당 snippet의 내용이 자동 완성된다.

유용한 snippet이 있는지 살펴보고 익숙해지면 좋을 것 같다.

참고

유명 함수 스코프

함수형 자바스크립트 책을 보다가 간단한데 몰랐던 내용이 있었다.

몇년간 자바스크립트를 하면서도 이 부분에 대해서 전혀 몰랐었다.

유명 함수 스코프에 관련된 내용이다.

아래는 org-mode에서 테스트 코드를 돌려본 내용이다.

named-function-scope

위의 f는 global 스코프에 정의되어 있고, 아래 f는 외부에서 접근할 수 없는 내부 스코프라고 한다. 이전 지식으로는 둘다 global 스코프이고 아래에 동일한 함수명으로 재정의 했기 때문에, 위의 f는 덮어띄워질 것이라고 생각했었다.

테스트 결과를 보면 둘다 f라는 이름의 함수이면서 다른 스코프에 위치되어 있어 서로 간섭하지 않는 것을 볼 수 있다.

vf에 유명함수를 정의해서 대입하는 경우 함수 내에서 함수자신을 참조할 때 외부의 영향을 받지 않아 안전하다고 한다. 좋은 팁인 것 같다.

emacs에서 clojure 개발 환경 세팅

emacs에서 clojure 개발 환경을 세팅해봤다. windows에서 하려니 좀 까다로웠던 것 같다. 결국 braveclojure.com의 글을 보고 따라하면 세팅된다. emacs설정 파일도 제공해주기 때문에 간단하게 설치된다.

아래 글은 그냥 삽질했던 것 몇가지 적어놓은 것이다.

나는 기존에 사용하던, 여태껏 emacs를 배우면서 삽질했던 결과를 보존하기 위해 기존 세팅을 기반으로 세팅하고 싶었고 삽질을 시작했다.

leiningen-win-installer 설치

우선 leiningen을 설치해야한다. leiningen은 clojure 프로젝트에 대한 빌드 자동화와 의존성을 관리하는 툴이라고한다.

windows에서는 leiningen-win-installer로 설치할 수 있다.

leiningen-win-installer

https://djpowell.github.io/leiningen-win-installer/ 에서 다운받아 설치한다. 내 경우 jdk는 깔려있어서 패스하고 leiningen-win-installer만 설치했다.

설치 경로는 C:\Users[사용자명]이 기본값이다. 나도 기본값으로 설치했다.

leiningen-2.8.1-standalone.jar

내가 참고했던 youtube강좌에선 leiningen-win-installer를 설치하고 lein --version을 입력하면 lein버전이 출력된다. 그런데 내 경우엔 leiningen-2.8.1-standalone.jar 파일을 찾을 수 없다고 떠서 당황했다.

문제를 해결해보려고 이것저것 해봤는데 결국 해결한 방법은 이것이다.

  1. lein.sh 파일을 받는다.
  2. HOME 디렉토리에 받은 파일을 위치 시킨다.
  3. 쉘 스크립트이기 때문에 cmd가 아닌 git bash를 연다.
  4. HOME 디렉토리로 이동해서 ./lein.sh 명령어로 다운 받은 파일을 실행한다.
  5. $HOME/.lein/self-install/경로에 leiningen-2.8.1-standalone.jar가 다운받아진 것을 확인할 수 있다.

아래는 lein.sh를 실행했을 때 나타나는 화면이다. lein.sh 실행 화면

여기까지 하면 cmd에ㅓ lein repl명령어로 clojure예제를 실행할 수 있는 repl을 띄울 수 있다. repl

git-bash에서 leiningen 실행

lein이 cmd에서는 실행됐지만 git-bash상에서는 실행되지 않았다. 나는 emacs에서도 git-bash를 기본 shell로 사용하고 있었기 때문에 git-bash에서 lein명령어가 되지 않으면 emacs에서도 사용할 수 없을 것 같았다.

그래서 검색한 결과 몇가지 세팅을 해주고 git-bash에서 lein을 실행할 수 있었다.

  1. 홈디렉토리(C:/Users/[사용자명])에 bin디렉토리를 만들고 leiningen에서 제공하는 lein.sh파일을 넣어주었다.
  2. git-bash를 열어 홈디렉토리 아래 .bashrc파일을 생성하고 vim으로 열어 내용을 아래처럼 적어준다.
alias=lein.bat
  1. git-bash를 재시작하면 git-bash에서 lein이 동작한다.

clojure-mode & cider 패키지 설치

clojure-mode는 emacs에서 clojure 코딩을 하기 위해 필요한 패키지이다. CIDER는 “Clojure(Script) Interactive Development Environment that Rocks!”의 약자로, emacs를 확장하여 clojure프로그래밍을 지원한다.

이맥스를 열고 clojure-mode와 cider를 설치해준다.

M-x package-install [RET] clojure-mode [RET]
M-x package-install [RET] cider [RET]

이렇게 설치하고 M-x cider-jack-in [RET]를 쳐주면 lein repl이 나와야 하는데… 에러가 발생했다. 원인은 emacs 기본 shell을 git-bash로 바꿔놨기 때문이었다. init.el에 해당 설정을 주석처리하고 emacs를 재시작하니 repl이 정상적으로 동작했다.

결론

앞에서 말했듯이 braveclojure.com의 글을 보고 따라하면 emacs에서 lein repl이 정말 쉽게 뜬다. 그러나 git-bash를 기본 shell로 사용할 수 없게 된다. emacs를 정말 좋아하는데 윈도우 환경에서 emacs를 사용하려니 이런 문제들이 계속 발생하는 것 같고 가상 머신으로 리눅스를 띄워 사용하려니 컴퓨터 성능이 안 따라준다. 도커를 사용해서 emacs를 사용하는 방법을 알아봐야겠다.

참고