gtpai 를 이용하니 Multibyte 처리가 안되어 있는 함수를 이용하기 때문에 제대로 동작하지 않는다. 그거와 최대한 유사하게 가장 간단한 기능만을 옮겨봤다. 

 

(defvar gpt-base-url "https://api.openai.com/v1/completions")
(defvar gpt-chat-url "https://api.openai.com/v1/chat/completions")

(defcustom gpt-model ""
  "API Model for OpenAI."
  :type 'string
  :group 'crutil)
(defcustom gpt-api-key ""
  "API key for OpenAI."
  :type 'string
  :group 'crutil)



(defun send-query-to-gpt (text)
  "ask to gpt"
  (interactive
   (list (read-string "물어봐: ")))

  (when (null gpt-api-key)
    (error "OpenAI API key is not set"))

  (let* ((url-headers
	  `(("Content-Type" . "application/json")
	    ("Authorization" . ,(format "Bearer %s" gpt-api-key))))
	 (url-data
	  (json-encode `(("model" . ,gpt-model)
			 ("prompt" . ,text)
			 ("temperature" . 0.7)
			 ("max_tokens" . 1000)))))
    (request
      gpt-base-url
      :type "POST"
      :data url-data
      :headers url-headers
      :parser 'json-read
      :success (cl-function
		(lambda (&key data &allow-other-keys)
		  (insert (cdr (assoc 'text (elt (cdr (assoc 'choices data)) 0))))))))

  )

 

적당히 load 될 수 있는 곳에 이 함수를 만들어 두고 

 

(require 'cr-utils)
(setq gpt-model "text-davinci-003")
(setq gpt-api-key "<INSERT YOUR API KEY>")

(global-set-key (kbd "C-c o") 'send-query-to-gpt)

맨 위의 cr-utils 는 send-query-to-gpt 함수가 위치한 파일이다. 

 

이러면 편리하게 사용할 수 있다. GPT 는 상당한 구라쟁이지만 말이다. 

예전에 Emacs for OSX 관련 설치글에서 File Dired Mode 에서 한글이 깨지는 문제는

(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)

위 내용을 .emacs 에 써주면 된다고 했습니다. 그런데 shell-mode 에서 한글이 제대로 출력이 안되는 이슈가 존재합니다.

역시 .emacs 에

(setq default-process-coding-system '(utf-8-hfs . utf-8-hfs))

와 같은 내용을 써주면 해결됩니다.

최근에 다시 clojurescript 를 이용해서 작업할 일이 생겼습니다. javascript 는 편리하긴 하지만 구현하는데 재미가 없다는 심각한 결점이 있기 때문입니다. 게다가 최근 lein-figwheel 이라는 편리한 툴이 나와서 정말 편하게 작업을 할 수가 있습니다. 다만 lein figwheel 을 하면 불편하게도 console 에서 작업을 해야 하기 때문에 emacs 의 편리한 기능을 못써서 안타깝습니다. 따라서 nRepl 을 이용해서 편리하게 작업하는 방법을 소개시켜드릴까 합니다.

  1. CIDER 와 clojure-mode 를 설치해야 한다.

    package-install 명령을 이용하면 쉽게 설치가 가능하다.

  2. leiningen plugins 를 설정해야 한다.
    ~.lein/profiles.clj
    

    를 열어서 다음과 같이 추가해 준다. (2015. 12. 29 현재 0.10.0 버젼이 최신)

    {:user {:plugins [[cider/cider-nrepl "0.10.0"]]}}
    
  3. 개별 project.clj 설정에
    :figwheel {:nrepl-port 7002}
    

    내용이 defproject 와 같은 레벨로 추가가 되어 있어야 한다.

  4. .emacs 파일에
    (add-hook 'cider-connected-hook '(lambda ()
                              (cider-interactive-eval
                               "(use 'figwheel-sidecar.repl-api)\n(cljs-repl)\n")))
    
    (defun figwheel-connect ()
    (interactive)
    (cider-connect "localhost" "7002"))
    
  5. figwheel-connect 명령을 실행 프로젝트 루트 디렉토리에서
    lein figwheel
    

    을 실행해서 띄우고 , M-x figwheel-connect 를 이용해서 접속한다.

  세월이 흘러감에 따라서 변하지 않는 것이 없거늘 어찌 Emacs 가 변하지 않으리라 생각했던가..

말 그대로 입니다. 세월이 흘러 흘러 Emacs 가 24.x 대가 나오기 시작한지도 꽤 여러해가 지났습니다. 그런데 저는 과거의 설정파일을 그대로 사용하고 있었더군요. 문제 없이 사용하고 있었던 이유는 최근 쓰고 있던 OSX 가 버젼업이 되면서 한글 '나눔고딕'이 기본으로 포함되서 별 의도하지 않게 사용하고 있었습니다.

최근 Clojure 에 관한 Online 책을 보다가 그 저자가 설정한 Emacs 설정파일을 제꺼에 포함시키는 과정에서 기본 폰트 크기를 변경시키는 로직이 있는데 제가 처음 보는 함수를 쓰고 있더군요. 찾아보니 제가 기존 설정파일에서 쓰고 있었던 폰트 설정 방법은 사라졌더군요.

예전의 폰트 설정 방법 의 내용이 현행화를 필요로 한다는 점입니다.

(set-face-font 'default "Monaco-10")
(set-fontset-font "fontset-default" '(#x1100 . #xffdc)
                  '("NanumGothicOTF" . "iso10646-1"))
(set-fontset-font "fontset-default" '(#xe0bc . #xf66e)
                  '("NanumGothicOTF" . "iso10646-1"))
(set-fontset-font "fontset-default" 'kana
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
(set-fontset-font "fontset-default" 'han
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
(set-fontset-font "fontset-default" 'japanese-jisx0208
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))
(set-fontset-font "fontset-default" 'katakana-jisx0201
                  '("Hiragino Kaku Gothic Pro" . "iso10646-1"))

이 방법이 아주 틀린건 아니지만 살짝 달라졌습니다. 한자나 일본어 설정은 동일하게 동작하는 것 같습니다. 다만 기본 폰트 설정 방법이 변했습니다.

(when (eq system-type 'darwin)

  ;; default Latin font (e.g. Consolas)
  ;; but I use Monaco 
  (set-face-attribute 'default nil :family "Monaco")

  ;; default font size (point * 10)
  ;;
  ;; WARNING!  Depending on the default font,
  ;; if the size is not supported very well, the frame will be clipped
  ;; so that the beginning of the buffer may not be visible correctly. 
  (set-face-attribute 'default nil :height 130)

  ;; use specific font for Korean charset.
  ;; if you want to use different font size for specific charset,
  ;; add :size POINT-SIZE in the font-spec.
  (set-fontset-font t 'hangul (font-spec :name "NanumGothicCoding"))

  ;; you may want to add different for other charset in this way.
  )

이 소스는 KLDP 의 유명한 Emacs 고수이신 cinsk 님의 설정 내용입니다. 제가 좋아하는 폰트로 살짝 고쳤습니다. 다시 말씀드리지만 이건 Emacs 24.x 의 설정 방법입니다.

그리고 "NanumGothicCoding" 폰트는 OSX 에 기본으로 설치가 되어 있지 않습니다. 기본으로 설치 되어 있는 폰트는 "Nanum Gothic" 입니다. 일부러 한글 폰트를 "NanumGothicCoding" 으로 설정한 이유는 나중에 설명하기로 하고 일단 '나눔고딕코딩' 폰트를 다운 받아야 합니다.

나눔고딕코딩 폰트 받기

받아서 서체관리자를 이용해서 설치해 주시고 위의 설정을 .emacs 에 설정해 주면 영문:Monaco , 한글:나눔고딕코딩 으로 설정이 됩니다.

여기까지가 Emacs 24.x 에서 한글 폰트 설정하는 방법이였고. 이제 다른 목적인 Org Mode 에서 한글 테이블 만들 때 표 제대로 보이는 방법에 대해서 이야기 하겠습니다.

Org Mode 는 Ascii 형식의 테이블을 지원합니다. 이게 은근히 편해서 종종 쓰곤하는데 심각한 문제가 있습니다. 한글을 쓰면 테이블 표에 있는 셀(Cell) 크기가 맞질 않습니다. 그래서 궁여지책으로 영문으로 테이블 표를 작성해서 쓰곤 했는데. Emacs 24.x 에 한글을 설정하고 나서는 갑자기 한글로 된 표를 쓰고 싶어졌습니다.

온갖 삽질끝에 이유를 알아냈는데 (어떻게 보면 당연한 거지만)

기본적으로 테이블이 깨지는 이유는 한글 - 영문 폰트의 width 의 비율이 일치하지 않기 때문입니다. 즉 이상적으로는 영문 2자에 한글 1자의 폭이 일치해야 하지만 미묘하게 한글 1자의 폭이 작습니다.

따라서 폰트 크기를 재 설정해 주면 간단하게 해결 됩니다. (이 간단하게 라는 말을 쓰기 위해 고생한 걸 생각하면…)

높이 비율로 크기를 맞춰야 하는데 'Monaco' 크기가 (:height)가 130 일때 'Nanum Gothic' 은 size 가 17 , 'NanumGothicCoding' 은 size 가 16 이어야지 비율이 맞습니다. 실제로 적용은 face-font-rescale-alist 변수를 이용해서 적용해 줍니다.

(setq face-font-rescale-alist
      '((".*hiragino.*" . 1.2)
        ("NanumGothicCoding" . 1.2307692307692308)))

와 같이 .emacs 에 설정을 넣어주면 됩니다.


위와 같이 테이블이 깨지지 않고 보여집니다. 


https://www.gnu.org/software/emacs/manual/html_node/eintr/


에 관련된 내용이 잘 정리되어 있습니다. 프로그램을 잘 모른다고 하는 사람을 대상으로 쓰여졌다고 하는데, 제 생각에는 '글쎄요' 입니다. 물론 이 걸 보고 고수가 된 비전공자가 존재한다는 것이 놀라울 따름입니다. 필리핀 인가 싱가폴에서 사는 처자인데 Emacs 의 org-mode 에 반해서 Emacs 를 배우고 Emacs Lisp 프로그래밍까지 잘하게 된 전설적인 케이스가 있습니다. 제대로 Emacs 를 쓰기 위해서는 한번 읽어볼 만은 하지만.. '글쎄요...' 


http://ergoemacs.org/emacs/elisp.html


차라리 실용적으로 배우실려면 위의 링크를 추천드립니다. 온갖 간단한 실용적인 예제로 도배되어 있기 때문에 오히려 더 쉽게 접근이 가능합니다. 



Emacs 를 mac 에서 사용하다 보면 몇가지 불편한게 있습니다. 대표적으로 ClipBoard 와 연동문제가 있습니다. 그러다가 Emacs for OSX 라는 것이 있더군요.

https://github.com/railwaycat/emacs-mac-port

위 사이트에서 자세한 설명은 되어 있지만 언제 끝날지 모르는 프로젝트더군요. 설명은 저기서 참조하고 소스는 실제로 작업하는 일본 프로그래머의 사설 git 레파지토리에서 받아서 컴파일을 하면 됩니다.

http://www.math.s.chiba-u.ac.jp/~mituharu/emacs-mac.git

이게 그 사설 git 레파지토리 입니다. 이걸 받으셔서 제가 예전에 올렸던 OSX 에서 컴파일해서 사용하기 를 참조해서 컴파일 하시면 됩니다.

$ ./configure --with-mac

옵션을 줘야 mac용으로 컴파일 됩니다. 그리고 결과는 ./build 안에 있더군요. 아이콘이 멋지게 바껴있는 것을 확인하실 수가 있습니다. 다만 사용하시다 보면 한글 디렉토리명이 깨지는 경우가 있습니다. 이건 예전에 제가 Subversion 에서 한글 파일을 인식못하는 문제 에서 썼듯이 UTF8이 종류가 달라서 그러한 문제가 발생합니다. 이걸 해결 하기 위해서 원작자에게 메일로 문의했더니 답변을 주더군요. (감사 감사)


이렇게 파일 이름들이 깨지는 현상입니다.


.emacs 파일안에다가

(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)

와 같은 식으로 적어주면 문제가 해결이 됩니다.


R은 리습계열의 방언에서 출발했다는 이야기가 있습니다. 그래서 인지 정말 놀라울 정도로 이맥스(Emacs)와 잘붙습니다. 게다가 이맥스(Emacs) 와 잘 붙을 수 있게 해주는 모듈이 요즘 빅데이타 의 붐을 타고 계속해서 업데이트 되고 있습니다. 


ESS (Emacs Speaks Statistics) 는 참으로 멋진 줄임말이죠? 이 패키지 모듈을 쓰면 이맥스 상에서 완벽하게 R 과 함게 동작시킬 수가 있습니다. 다만 항상 이런것을 이용할 때의 문제점이 있습니다. 바로 인코딩 문제죠 한글을 입력하면 상태창에서 한글이 완벽하게 깨집니다. 방법은 간단합니다. 


.emacs 파일에 다음과 같은 부분을 추가해주면 됩니다. 




(add-hook 'ess-R-post-run-hook

          (lambda () (set-buffer-process-coding-system

                       'utf-8-unix 'utf-8-unix)))


그리고 이맥스를 재시작하면 깔끔하게 해결이 됩니다. 


추가로 library 명령을 써서 패키지를 로딩하고 나면 한글이 깨지는 경우가 발생합니다. 골치가 아프죠. -ㅅ- 저 같은 경우에는 


library(sqldf) 


를 쓰는 경우에 발생했습니다.  몇군데를 알아봤지만 이게 버그인건지 이맥스 자체의 문제인지는 알아보기 힘들더군요. 단지 interactive R 상에서 


Sys.setlocale ("LC_ALL", "ko_KR.UTF-8")


를 실행해주니 다시 돌아오더군요. 


Emacs 를 24.50 으로 업그레이드 했더니 , 잘 쓰던 org-mode 에서 에러가 발생합니다. 


org-overview: `recenter'ing a window that does not display current-buffer


이런 형식으로 에러가 발생하더군요. org-overview 가 문제라는 것을 알았으면 문제는 고치기 쉽습니다. 


C-h f  를 입력해서 describe-function 함수를 불러냅니다.  이때 함수명을 입력하는 곳에다가 org-overview 라고 입력하면 org-overview 에 대한 가벼운 설명과 그 함수가 포함된 org.el 파일이 하이퍼 링크로 나타납니다. 이때 org.el 을 클릭하면 org.el 파일이 열리는데. 이게 실은 org.el.gz 파일을 압축을 풀고 보여주는 것입니다. 



가볍게 recenter 함수를 호출하는 부분을 막아줍니다. 그리고 나서 이 내용을 저장하면 org.el.gz 파일로 저장되는데 이를 압축을 풀어주던지 아니면 새로 org.el 파일을 만들어서 같은 내용을 복사해줍니다. 그리고 byte-compile 을 해야 하지만 저는 귀찮은 관계로 그냥 org.el 파일로 뒀습니다. 


그리고 기존 소스로 만들어진 org.elc 파일을 지워주시고 emacs 를 다시 띄워주시면 됩니다. 

아래와 같이 파일을 열어서

$ emacs ~/.Xresources


다음과 같은 내용을 추가해 줍니다.

Emacs.font: Consolas-12
emacs.FontBackend: xft


그리고 다음과 같이 터미널에서 입력해 줍니다.

$ xrdb -merge ~/.Xresources


우분투에 Consolas 폰트를 설치하는 방법은 예전 포스트 에서 참조하세요.


EDIT: 2014-02-04

위 방법은 민트 리눅스 (Mint Linux) 마야 (Maya) 버젼에서도 동일하게 동작합니다.  

 
저는 안드로이드를 Emacs 로 개발하고 있는 중인데요. 외부 jar 가 추가 될 때 자동으로 classpath 에 추가 하고 자동으로 import 기능을 활성화 시키는 방안을 찾는 중인데, 없더군요.. 

물론 Eclipse 를 사용하면서 Google AdMob SDK 같은 외부 jar를 사용하기는 쉽습니다. 외부 라이브러리로 추가해 주면 끝이기 때문입니다. 다만 CLI (Command Line Interface) 에서 Ant 를 이용해서 빌드를 할 때는 마구 마구 귀찮아집니다. 하지만 쉽게 하는 방법이 생겼더군요. 

$(ANDROID_PROJECT_ROOT) 밑에 /libs 라는 디렉토리를 만들고 그 안에다가 GoogleAdMobAdsSdk-6.0.1.jar android-support-v4.jar 두개의 파일을 복사해줍니다. 


$(ANDROID_PROJECT_ROOT) 밑의 ant.properties 파일을 열고 다음과 같이 추가해 줍니다. 

  jar.libs.dir=libs


이제 

$ ant clean && ant debug 



해 주시면 성공적으로 바인딩 되는 것을 확인하실 수 있습니다. 

다만 위와 같이 따로 libs 를 추가해 주면 JDE 환경에서 자동으로 classpath 뒤져서 Import 해주는 기능이 libs 에 추가된 jar 에 대해서는 동작하지 않습니다. 이럴 때를 위해서 따로 함수를 만들어 뒀습니다. (100% 제가 만든것입니다 쿨럭..) 



(defun android-mode-my-hook () 
  (progn
    (and (file-exists-p 
          (concat (android-root) "/libs"))
         (setq jde-global-classpath 
               (append jde-global-classpath 
                       (directory-files
                        (concat (android-root) "/libs")
                        t "jar"))))
    ))
(add-hook 'android-mode-hook 'android-mode-my-hook)


다음과 같이 만들어 주면 됩니다. 저는 java 설정만 따로 모아놓고 쓰지만 그렇지 않으신 분들은 .emacs 파일 구석에 적어두시면 될 것입니다. 물론 jdee 와 android-mode 설정 뒤에 적어주셔야 할 것입니다. jde-global-classpath 는 jdee 를 추가 해줘야 생기는 변수고 android-root 는 안드로이드 프로젝트의 루트를 찾아주는 편리한 함수인데 android-mode 를 추가해줘야만 쓸 수가 있습니다. 

점점 lisp 으로 코딩하는게 재밌어 지기 시작합니다. ㅎㅎ 
 

+ Recent posts