koodev

Emacs JSON 과 C 블록 숨기기

Emacs

지난주에 Emacs로 좀 긴 JSON 파일을 보고 있었는데, 다른 에디터에는 들어가 있는 폴딩(folding)을 할 수가 없어서 https://jsonlint.com 에서 붙여놓고 보고 있었다. 나중에 당연히 Emacs 에서도 할 수 있을것 같아서 (기본 제공되는 모드 위주로) 찾아 보았다.

hs-minor-mode

hs는 여기서 hide & show 이다. 로드되지 않은 상태에서는 M-x hs-minor-mode 로 활성화 시킨다. 블록 커서 위에서만 동작하는 듯 하다. Hide/Show 상태를 토글하는 명령어인 C-c @ C-c 만 잘 기억해 두고 자세한 정보는 여기에서 참고한다.

hide-ifdef-mode

hs-minor-mode 는 C언어의 #ifdef 같은 매크로에는 적용되지 않는다. 이 모드는 #ifdef, #if 등의 매크로 블록을 숨기는 기능이다. 기본 키바인딩이 hs-minor-mode 와 조금 다르다. C-c @ C-d 로 숨기고 C-c @ C-s 로 다시 보이게 한다(보이기는 hs-minor-mode 와 같다). 토글하는 명령어는 없는 듯 하다.

'Emacs' 카테고리의 다른 글

Emacs Major/Minor 모드  (0) 2019.10.23
Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07

Emacs Major/Minor 모드

Emacs

Emacs 에는 모드라는게 있어서 키 입력이나 상황에 따라 모드마다 라는 동작을 한다. 모드에는 크게 Major 모드와 Minor 모드가 있다. Emacs 모드에 대해서 GNU Emacs 매뉴얼의 내용을 보면서 정리했다.

Major 모드

Major 모드는 버퍼에 1개씩 할당되는 모드이다. Major 모드는 바꿀 수는 있지만 없앨 수는 없어서 버퍼마다 반드시 1개의 모드가 활성화되어야 하는 제약이 있다. Major 모드는 Emacs 윈도우의 하단 Mode Line 의 오른편에 있는 소괄호 안에 Minor 모드와 함께 (major minor) 식으로 표시된다.

매뉴얼에서는 Major 모드를 다시 크게 세 가지로 분류한다. ① 일반적인 문자 편집을 위한 것들로 예를 들어 Text Mode, HTML Mode, Tex Mode, Outline Mode 등이 있다. ② 프로그래밍을 위한 모드들로 C Mode, Fortan Mode 등이 그 예이다. ③ 특정 파일과 관계가 없는 모드들이 있는데, 예를 들어 터미널 안에서 파일탐색기 역할을 하는 Dired Mode, 이메일을 보낼 수 있는 Message Mode, Emacs 안에서 쉘을 열 수 있는 Shell Mode 등이 있다.

Major 모드는 반드시 버퍼당 1개가 할당되어야 하기 때문에 Emacs 에서 최소한 자동으로 지정되게 되어 있다. 강제 지정을 위해서는 M-x xxx-mode 이런 식으로 입력하면 된다. 다시 한 번 말하지만 Major 모드는 끌 수가 없기 때문에 비활성화 하려면 다른 모드로 바꿔야 한다.

일반적으로 Major 모드는 파일 이름을 보고 결정하게 설정한다. auto-mode-alist 라는 변수(Association List)에 아래와 같이 등록하면 해당 파일 패턴에서 대응하는 Major 모드가 활성화된다.

;; glsl mode
(autoload 'glsl-mode "glsl-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.glsl\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.vert\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.frag\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.geom\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.fs\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.gs\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.vs\\'" . glsl-mode))

사실 파일 이름을 보고 Major 모드를 동작시키는 단계는 처리 순서상 비교적 뒤의 단계에 위치한다(5단계 중 4번째). 가장 우선 순위가 높은 모드선택은 파일로컬 변수에서 -*- 로 지정된 이름을 보고 결정하는 것이다. 두 번째는 재미있게도 스크립트 파일을 만들 때 제일 위의 라인에 해당 스크립트를 실행할 인터프리터 역할을 하는 파일을 #! 와 함께 적어주는데 이 파일의 이름을 보고 유추하여 모드를 선택한다. 예를 들어 어떤 스크립트 파일의 제일 윗줄에 #!/usr/local/bin/perl 이라고 적혀 있었으면, Perl Mode를 로드한다.

세 번째는 파일 내용의 앞단(어디까지인지는 모르겠지만)을 정규표현식 매칭하여 모드를 결정하는 단계가 있다. magic-mode-alist 라는 변수에 (정규표현식 . 모드) 이런 식으로 등록한다. nil로 줄 경우 이 과정을 건너뛰며 기본값은 nil 이다.

네 번째가 앞서 언급한 파일이름 패턴을 보는 단계이고 마지막은 magic-fallback-mode-alist 라는 변수를 보고 역시 파일 앞부분의 내용을 보고 정규표현식 매칭하는 단계이다. 여기에는 기본값이 셋팅되어 있는데, 이미지 파일이나 HTML, JSON 파일 등을 대상으로 한다.

major-mode 라는 변수는 Major 모드의 이름을 나타내는 버퍼로컬 변수이다. 현재 활성화된 Major 모드를 나타내는데, 자동으로 설정되므로 웬만하면 수정하지는 말고, 필요할 때 읽어 쓰기만 하자. C-x b 로 버퍼를 새로 만들 때 기본으로 켜지는 모드를 지정할 수 있다라고 하는데 일단 기본값은 fundamental-mode 이고, nil로 설정할 경우 이전 버퍼의 것을 그대로 가져다 써서 모드가 결정된다고 한다.

(Fundamental 모드를 제외한) 모든 Major 모드는 xxx-mode-hook 이런 이름으로 Hook 을 지정할 수 있다. 보통 이런 모드 hook 은 다른 Minor 모드들을 로드하는데 사용한다.

Minor 모드

Minor 모드는 무언가 옵션같은 느낌이다. Major 모드는 버퍼당 반드시 1개가 켜져있어야 하지만 Minor 모드는 동시에 여러개를 활성화시킬 수도 있고, 비활성화도 가능하다.

메뉴얼에서는 Minor 모드를 크게 2가지로 분류한다. ① 버퍼로컬 Minor 모드는 특정 몇몇 버퍼에서 활성화되고 그외에는 비활성화되는 특징을 갖는다. ② 글로벌 Minor 모드는 활성화되면 현재 Emacs 세션 전반에 걸쳐 영향을 준다.

대부분의 버퍼로컬 Minor 모드는 활성화 되었을 때 Mode Line 에서 Major 모드 옆에 표시된다(즉, 활성화된 모든 Minor 모드가 다 표시되는건 아님).

Major 모드와 마찬가지로 Minor 모드를 활성화시키는 명령어는 (xxx-mode) 이다. Minor 모드는 비활성화도 가능하기 때문에 활성화된 상태에서 해당 모드 명령어를 실행시키면 토글되어 비활성화된다. Minor 모드 활성화 명령어와 관련된 내용을 정리하면 아래와 같다.

  • Prefix argument 없이 M-x 나 키바인딩으로 실행시킨 Minor 모드 커맨드는 현재 상태를 토글한다
  • 위의 경우 Prefix argument 가 0이나 음수 값이라면 해당모드는 비활성화로 바뀌고, 다른 argument의 경우 활성화된다
  • Lisp 코드로(소괄호 Call 방식) 실행시킬 경우 argument가 nil 또는 생략되었을 경우 비활성화 되고, 그 외 다른 값을 넣을 경우 활성화된다

대부분의 minor 모드는 해당 모드 커맨드와 같은 이름의 변수를 갖는데, 활성화된 상태에서 non-nil 값을, 비활성화된 상태에서 nil 값을 갖는다. major-mode 변수와 마찬가지로 이 변수는 자동 세팅되기 때문에 읽기만 하고 괜히 수정하는 것은 추천하지 않는다.

Major 모드는 대체로 특정 프로그래밍 언어나 특정 작업에 대한 기능을 제공하는 반면, Minor 모드는 비교적 작은 규모이지만 여러 다른 작업에 유연하게 적용될 수 있는 기능을 제공한다. Minor 모드 중에 auto-fill 이라는 모드를 예로 들어보자. 이 모드는 엔터키를 입력하여 줄바꿈을 하였을 때에 대한 처리를 제공한다. 이 모드는 text-mode 일때와 java-mode 일때 다르게 동작하는데, text-mode 일때는 줄이 너무 길어지면 word wrap을 실행하지만 jave-mode 에서는 word wrap을 실행하지 않는다. 하지만 java-mode 에서도 주석을 편집하는 경우는 word warp이 되어야 하는데 auto-fill 모드는 주석의 경우 알아서 word warp을 하도록 처리해 준다. 이렇듯 전세계의 Emacs 모드 개발자들은 Minor 모드가 Monor 모드의 정체성을 유지하도록 하기 위해 엄청나게 신경쓰고 있는 것이다(The authors of various Emacs modes have done a great job of making sure that things that should work as minor modes are minor modes).

참고

'Emacs' 카테고리의 다른 글

Emacs JSON 과 C 블록 숨기기  (0) 2019.11.17
Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07

Emacs - Python 문서 열람시 멈춤현상

Emacs

제목을 두서없이 쓰긴 했는데, 다음 스택오버플로 링크와 똑같은 문제이다.

https://stackoverflow.com/questions/21517747/emacs-freezing-when-asking-jedi-auto-complete-information-while-interpreter-is-b

어느날부터 이맥스로 파이썬 문서를 열고, 커서를 움직이다가 보면 커서가 멈추고 에디터에 반응이 없게 되는 현상이 발생하기 시작했다. 파이썬 문서에서만 발생하며, C-g 를 연타하면 멈춤현상에서 빠져나올 수 있지만 잠시 후 다시 멈춤현상이 나타난다. 멈춤현상이 발생했을 때 top 명령어로 프로세스들을 봤는데 (elpy인지 jedi인지 확실하지 않지만) 어떤 파이썬 프로세스의 CPU 점유율이 100% 가까이 되었고, 메모리 사용량도 계속 늘어나고 있었다. 환경은 iMac 27-inch Late 2015, macOS Mojave Version 10.14.6, Emacs 26.3(25.1.1 에서도 동일) 이다.

elpy 관련 패키지를 추가로 설치한 지금은 멈춤현상이 발생하는 빈도가 많이 줄었다. M-x elpy-config 를 실행하면 elpy 설정정보가 나오는데, 여기에서 elpy 관련 추가 패키지들의 버전 정보 등을 보여준다. 내 경우 기본 패키지만 설치되어 있었고 그마저도 예전 버전이라서 기본 패키지와 더불어 추가 패키지들도 모두 설치했다. 패키지들은 jedi, autopep8, yapf, black, flake8 등이었고 pip 명령어를 실행할 수 있도록 elpy-config 버퍼에서 실행 링크를 제공하고 있다.

참고: https://emacs.stackexchange.com/questions/47128/elpy-autocomplete-stops-working-unexpectedly

'Emacs' 카테고리의 다른 글

Emacs JSON 과 C 블록 숨기기  (0) 2019.11.17
Emacs Major/Minor 모드  (0) 2019.10.23
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07

Emacs Wdired 모드

Emacs

Wdire 모드에서 (query-replace) 를 실행한 모습

이번주에 폴더 안의 파일들의 이름에 접두어를 붙여서 바꿀일이 있었다. Python 스크립트를 만들어서 실행시켰는데, 잠시 후 이를 취소해야겠다는 생각이 들었다. 그래서 다시 취소하는 Python 스크립트를 만들어야 하나 했었는데, Emacs의 Wdired 모드를 사용하여 간단하게 파일 이름들을 되돌려 놓을 수 있었다.

Wdired 모드는 Dired 버퍼에서 동작하는 모드이다. 원래 Dired 버퍼는 읽기 전용인데, Wdired 모드는 이를 "부분" 쓰기허용으로 만든다. 즉, 여기서 W는 "writable"을 의미한다.

Wdired 모드를 활성화 시키려면 우선 Dired 모드로 진입하고 나서, C-x C-q (dired-goggle-read-only) 를 누르면 된다.

Wdired 모드에 진입하면 파일 이름을 수정할 수 있다. 커서로 수정하는 것 뿐만 아니라 (replace-regexp) 같은 것으로도 편집이 가능하다. 파일 이름을 몽땅 지우면 해당 파일이 삭제되니 주의하자. 파일 이름만 수정 가능하고 다른 부분(권한 등)은 기본적으로 편집할 수 없다. 그런데 wdired-allow-to-change-permissions 변수를 t 로 바꾸면 권한 수정을 할 수 있게 된다.

수정된 내용은 바로 반영되는 것은 아니고 C-c C-c 이나 파일 저장할 때 쓰는 C-x C-s 를 눌러야 반영된다. Wdired 모드에서는 둘 다 (wdired-finish-edit) 로 매핑되어 있다. 취소하기 위해서는 C-c C-k (wdired-abort-finish) 를 하면 된다.

참고

'Emacs' 카테고리의 다른 글

Emacs Major/Minor 모드  (0) 2019.10.23
Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07
Emacs Server setting  (0) 2019.05.15

macOS 에서 Emacs 데몬이 종료되지 않는 문제

Emacs

macOS 에서 Emacs Server/Client 환경을 만들던 중 데몬이 종료가 되지 않는 문제에 대해서 정리했다.

문제점

Emacs Server/Client 설정은 EmacsWikiEmacs As Daemon 에서 잘 설명해주고 있다. Ubuntu 에서의 설정은 Emacs As Daemon 을 따라서 성공했다. 그런데 macOS에서는 Emacs 서버 데몬을 실행한 후 시스템종료가 안 되는 현상이 발생했다.

Ubuntu 에서는 Emacs 데몬의 systemd 설정파일에서 시스템 종료 시점에 emacsclient --eval "(kill-emacs)" 을 날려주도록 설정해 놨는데, macOS의 시작프로그램 관리자인 launchd 에서는 종료시점에 대해 뭔가를 할 수가 없게 되어있다. 따라서 Emacs 데몬이 종료를 못하고 강제종료를 해 주어야지만 시스템을 종료할 수가 있는 것이다. 내가 직접 테스트해보지는 않았지만 이 문제는 Emacs 를 데몬이 아닌 모드로 실행 후에 (server-start) 를 직접 또는 init.el 등에서 실행해 주면 괜찮다고 한다.

아래 글을 쓴 redinger 라는 분도 macOS에서의 Emacs 데몬 시작 스크립트를 공유해 두시고 나와 같은 문제로 인해서 사용을 하고 있지 않다고 한다.

https://gist.github.com/redinger/1394910/c0dc6877c158a13760212dbe10b4abb32ae3c4f8

그런데 (server-start) 를 불러주는 방식은 최초에 Emacs 실행 시 데몬 모드가 아닌 일반 모드로 실행을 해야 하는 번거로움이 있어서 개인적으로 마음에 들지 않는 방식이다.

데몬 종료가 되지 않는 원인

데몬 종료가 안 되어서 시스템 종료를 방해하는 원인은 바로 Emacs 개인 설정에서 Emacs 종료시에 편집 중이던 수정된 파일을 저장할지 안할지 확인하는 과정이 들어가 있기 때문이었다. Emacs를 데몬으로 실행해 버리면 이를 확인할 수가 없기 때문이다. 즉, 아래와 같은 설정이 문제였다.

(setq confirm-kill-emacs 'yes-or-no-p)

해결책

그런데 Emacs를 일반 모드로 실행하는 경우도 있기 때문에 위의 설정을 포기하는 것도 많이 아쉬웠다. 방법은 Emacs가 데몬 모드로 실행될 경우에는 confirm 설정을 포기하고, 그렇지 않은 일반 모드일 경우에만 confirm 설정을 사용하도록 init 파일에서 설정하면 되는 것이다. Emacs에는 daemonp 라는 함수가 데몬모드로 실행 중인 경우 t 를 리턴하게 되어 있다. 즉, 아래와 같은 내용을 init 파일에 넣어주면 된다.

(if (daemonp)
    nil
  (setq confirm-kill-emacs 'yes-or-no-p))

References

'Emacs' 카테고리의 다른 글

Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
Create a new file in ido mode  (0) 2019.06.07
Emacs Server setting  (0) 2019.05.15
EIN and virtualenvwrapper  (0) 2018.07.22

Create a new file in ido mode

Emacs

예전에 다른 곳에 썼던 글을 가져온다. 글이 쓰여진 시점은 2017년 1월 이다.

Emacs를 사용하기 시작한지 4년 가까이 되었지만 최근에서야 ido mode를 사용하려고 하고있다. 익숙해지려고 하던 도중 파일 생성에 대해 문제점이 있어서 관련 내용을 정리해 본다.

상황은 다음과 같다. 파일을 생성하려고 C-x C-f 를 누르고 해당 파일 이름을 입력했다. ido-create-new-buffer 변수가 ‘alway로 잡혀 있기 때문에 매칭되는 파일이 없으면 자동으로 새 버퍼를 연다. 그런데 ido mode가 이전에 다루었던 path들을 캐시하고 있기 때문에 이전 path에 매칭되는 파일이 있을 경우 새 버퍼를 여는 대신에 해당 파일의 이름으로 버퍼를 열게된다. 파일 생성을 하고 싶은데 이전 경로의 파일을 열게 되는 것이다. 이런 상황이 많지는 않을 것 같기도 하지만 소스코드에 따라서 Makefile이나 CMakeList.txt 같은 파일들은 디렉토리마다 존재할 수가 있고, 새로 만드려고 할 경우 문제가 될 수도 있다.

ido 모드를 빠져나가기

C-x C-f C-f 이걸 누르면 ido 모드를 종료하고 일반적인 find file 모드로 진입하게 된다. 그리고 생성할 파일 이름을 입력하면 (지나치게) 스마트하게 이전 path를 뒤져서 파일을 열지 않고 입력한 해당 경로의 버퍼를 열게 된다. 가장 적당한 방법이라고 생각한다.

C-j

또 다른 방법은 ido-find-file 에서 생성할 파일 이름을 입력하고 재빨리 C-j 를 누르면 해당 파일이 생성된다. 하지만 너무 늦을 경우 이전 path를 뒤지게 되니 바짝 서둘러서 진행해야 한다.

ido-auto-merge-work-directories-length

ido-auto-merge-work-directories-length 변수를 -1로 설정할 경우 이전 path를 뒤지는 짓을 하지 않도록 막는다. 이전 path를 뒤지는 기능이 아쉽겠지만 작업환경에 따라서는 유용할 수도 있을 것 같다.

References

'Emacs' 카테고리의 다른 글

Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Emacs Server setting  (0) 2019.05.15
EIN and virtualenvwrapper  (0) 2018.07.22

Emacs Server setting

Emacs

Emacs를 서버-클라이언트 서비스로 구성하는 과정에 대해 기록한다.

환경은 Ubuntu 18.04, Emacs 26.2 이다.

참고

Starting Emacs Deamon with systemd

Systemd 는 대부분의 리눅스 배포판에서 시작 프로그램을 관리하는 프로그램이다. 아래 emacs.service 파일은 emacs26.2 소스(emacs-26.2/etc/emacs.service)에 들어있는 것을 내 환경에 알맞게 수정한 것이다. 아래와 같이 수정하여~/.config/systemd/user/emacs.service 를 만들어 준다.

## If your Emacs is installed in a non-standard location, you may need
## to copy this file to a standard directory, eg ~/.config/systemd/user/ .
## If you install this file by hand, change the "Exec" lines below
## to use absolute file names for the executables.
[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/local/bin/emacs --fg-daemon
ExecStop=/usr/local/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

ExecStart 에 emacs 실행 경로와 함께 넣어준 --fg-daemon 인자는 포어그라운드 데몬으로 실행하라는 의미이다. 참고로 --bg-daemon 혹은 --daemon 은 백그라운드 데몬으로 실행하라는 의미이다.

그리고 터미널에서 아래와 같이 실행하여 이맥스 서버를 실행시킨다.

systemctl enable --user emacs
systemctl start --user emacs

Launcher 아이콘 생성

런처 아이콘 역시 Emacs 26.2 소스 코드에서 만들어 놓은 파일을 고쳐서 사용하면 된다. emacs26.2/etc/emacs.desktop 을 아래와 같이 수정하여 .local/share/applications/emacs.desktop 을 만들어준다.

[Desktop Entry]
Name=Emacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=emacsclient -c -a "emacs" %F
Icon=emacs
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=Emacs
Keywords=Text;Editor;

emacsclient 의 -c 옵션은 새 이맥스 프레임을 생성하여 실행하라는 의미이고, -a 는 이맥스 데몬이 실행중이지 않을 경우 fallback 으로 할 액션에 대해 정의하는 것이다.

그리고 터미널에서 아래 명령어를 실행해 주면 finder 같은 곳에서 emacs를 검색하면 위에서 지정한 동작을 수행하는 아이콘이 뜰 것이다. 실행시켜주고 dock 에 고정하면 된다.

sudo desktop-file-install --dir=/usr/share/applications/ ~/.local/share/applications/emacs.desktop

'Emacs' 카테고리의 다른 글

Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07
EIN and virtualenvwrapper  (0) 2018.07.22

EIN and virtualenvwrapper

Emacs

Emacs와 IPython을 함께 쓰기위한 설정을 만지던 중, 특정 virtualenv와 연동하는 부분에서 좀 막히게 되었다. 완벽한 솔루션은 아니지만 기록해둔다.

초반 삽질: elpy

Emacs Python IDE로 모드 중에 elpy가 눈에 띄었고, IPython관련 기능들도 있길래 이것으로 시작해 보았다. elpy는 pyvenv가 연동되며 자체에서 IPython 프로세스를 실행시키면 해당 pyvenv에 해당하는 IPython interpreter(Jupyter도 가능)가 뜨기 때문에 환경설정과 관련해서는 문제가 전혀 없었다.

하지만 곧 맞닥드린 문제가 있었는데, pyplot등으로 그린 표나 그림 등이 인라인으로 표시되지 않고 임시파일에 기록되어 미리보기(MacOS Preview App)등의 다른 윈도우에서 별도로 표시되는 것이었다.

인라인 표시 기능과 관련하여 한동안 찾아본 결과 org-babel이나 EIN(Emacs IPython Notebook)에서 가능하다는 정보를 알게 되었다.

Inline plot in emacs ipython REPL?

Emacs IPython Notebook

org-babel은 좀 아닌것 같아서 EIN을 들여다보기 시작했다. elpy처럼 자체에서 IPython REPL 프로세스를 띄울 수 있고, elpy에서 안되는 인라인 컨텐츠 표시도 잘 되었다.

하지만 EIN도 문제가 있었는데, 특정 virtualenv를 선택할 수가 없었다. 내 환경에는 virtualenv가 2개 - python3, python2 - 가 있는데 python3 환경에만 물렸다. 이렇게 되면 python3만 쓸 수 밖에 없다. 시스템에 python2랑 3가 둘 다 설치되어 있으면 브라우저 notebook 클라이언트에서는 둘 중 하나를 고를 수 있었는데, 특정 virtualenv와 물리게 되면 하나의 버전만 쓸 수 있다. 그럼 virtualenv에 python을 두개 설치하면? 확인해 본 결과 virtualenv는 하나의 python 버전만 사용하도록 설계되었단다.

Create a virtualenv with both python2 and python3

EIN and Jupyter with virtualenv

그래서 생각해낸 방법은 우선 터미널에서 virtualenv를 띄우고 거기서 Jupyter를 실행시킨 다음에, EIN에서 해당 Jupyter에 접속해서 notebook 환경을 사용하는 것이다. 이렇게 할 경우 터미널을 왔다갔다 해야 하긴 하지만 모든 문제가 해결된다. (해보진 않았지만) virtualenv/Jupyter 두 개 조합을 띄우고 둘 중 하나를 선택해서 들어갈 수도 있을 것 같다.

우선은 터미널을 띄우고 원하는 virtualenv를 활성화시킨다. 그리고 Jupyter를 띄우는데, 포트 번호랑 토큰(또는 암호)을 기록해둔다.

그리고 Emacs로 돌아와서 M-x ein:notebooklist-login 을 실행한다. 위에서 기록해둔 포트 번호와 토큰(또는 암호)를 입력한다. 그리고 M-x ein:notebooklist-open 을 입력하면 위에서 띄워놓은 notebook과 연결된다.

References

'Emacs' 카테고리의 다른 글

Emacs - Python 문서 열람시 멈춤현상  (0) 2019.09.18
Emacs Wdired 모드  (0) 2019.06.29
macOS 에서 Emacs 데몬이 종료되지 않는 문제  (0) 2019.06.07
Create a new file in ido mode  (0) 2019.06.07
Emacs Server setting  (0) 2019.05.15