이맥스 – 루비 제작자 “맷츠”, 어떻게 이맥스가 내 인생을 바꿧나?

원문

  1. 이맥스가 내 인생을 어떻게 바꿧나? “Yukihiro Matsumoto” – Matz @yukihiro_matz

  2. 1980

  3. 프로그래밍을 시작했다.

  4. ~

  5. BASIC

  6. 400 단계

  7. 1988

  8. 이맥스와의 만남

  9. Sun-3 위에서

  10. 200명 학부생들과 공유

  11. 이맥스를 시도했었다.

  12. 하지만 사용하지는 않았다.

  13. 이맥스는 금지 되어었다.

  14. 이맥스는 너무 많고 소중한 메모리가 소비하였다.

  15. 우리는 무료 소프트웨어를 받을 수 있는 자유가 있었다.

  16. 우리는 소스코드를 읽을 수 있는 자유가 있었다.

  17. 난 이맥스 소스코드를 다운받았다.

  18. 그리고 이를 연구하였다.

  19. 이맥스는 나의 첫번째 리스프 인터프리터였고,

  20. 나는 이맥스로부터 많은 언어에 대해서 배울 수 있었다.

  21. 포인터들 안에서 내장되어 있는 정수들 (?)

  22. 가비지 컬렉션을 청소했다.

  23. 리스프와 ‘C’ 사이에서의 대회로 불리었고

  24. 나는 리스프가 어떻게 동작하는지 이해할 수 있었다.

  25. 나는 리스프 오브텍트에 매료되었고

  26. 리스프 오브젝트는 C로부터 선언되었다. (?)

  27. 그리고 나는 Sparc Station을 얻었다. (SPARCstation(aka Sun-4) 시리즈는 1989년에 소개되었다.)

  28. 나는 이맥스를 사용하기 위해 다시 시작했고

  29. 이맥스는 나의 한부분이 되었다.

  30. 만약 이맥스에서 아무것도 좋아하지 않았다면, 나는 이것들을 바꿀수가 있었다.

  31. 이맥스는 완전하게 개조가 가능하였다.

  32. 이맥스는 프로그래머가 원하는 모든것을 바꿀 수 있다는걸 깨닫게 해주었으며,

  33. 이 모든것은 자유였다.

  34. 카바인딩 생각없이 모든 것을 바꿀 수 있었다. (?)

  35. 나는 이맥스 없이 아무것도 쓰고 싶지 않았다.

  36. 프로그램들, 문서 그리고 메일들까지

  37. 그래서 나는 내 전용 메일 클라이언트로 썼다.

  38. 이름하여 “email”

  39. 이맥스 리스프 안에서

  40. 이게 나의 첫번째 보잘거 없지 않은 리스프 프로그램이였다.

  41. 나는 매일 이것을 사용했다.

  42. 1993

  43. 나는 루비 개발을 시작했다.

  44. 이맥스 구현으로의 영향력은

  45. 태그 포인터들안에서 인티저는 코드였고,

  46. 이것은 간단한 영역과 가비지 컬렉션을 소비하여 사용하였다.

  47. 비슷한 오브젝트 모델에서 리스프로 사용했고 (여기서 리스프의 오브젝트의 “object”란 내부적으로 표현되 코드이고, OOP를 말하는 것이 아니다.)

  48. 그리고 나는 맨위에 OO 시스템과 같은 스몰토크를 넣었고

  49. 문법적으로 ALGOL/Ada/Eiffel들을 원했다.

  50. 하지만 이맥스 중독자로, 나는 언어 모드가 필요했었고,

  51. auto-indent는 필요한 것이었다.

  52. 1993년으로 돌아가, 문법이 표현된 언어를 위한 auto-indenting 언어 모드는 없었고

  53. 그래서 나는 ruby-mode.el를 만들었다.

  54. 이맥스 리스프와 정규식 표현을 다뤄야만 했고

  55. 매주 그렇게

  56. auto-indentation구현을 어떻게든 성공했다.

  57. 언어의 “end”를 위해

  58. 만약 진행하기 위한 ruby-mode를 만들지 않았다면,

  59. 루비의 문법은 바뀌었을지도 모른다.

  60. C와 같은 또다른 하나

  61. 다른 스크립트언어와 너무 비슷한

  62. 결과적으로 루비 현재의 인기를 차지하지 못햇을 것이다.

  63. 개요

  64. 1) 이맥스는 소프트웨어에 대한 자유를 가르쳐주었다.

  65. 2) 이맥스는 코드를 어떻게 읽는지 가르쳐주었다.

  66. 3) 이맥스는 리스프의 힘을 가르쳐 주었다.

  67. 4) 이맥스는 언어의 핵심이 어떻게 구현되는지 가르쳐 주었다.

  68. 5) 이맥스는 가비지 컬렉션이 어떻게 구현되는지 가르쳐 주었다.

  69. 6) 이맥스는 코드와 디버그를 도와주었다.

  70. 7) 이맥는 텍스트, 메일, 문서 작성과 편집을 도와주었다.

  71. 8) 이맥스는 효과적인 프로그래머가 될수 있도록 도와주었다.

  72. 9) 이맥스는 나를 해커로 만들어 주었다.

  73. 10) 이맥는 내 인생을 바꿔주었다.

  74. 영원히

  75. 감사합니다.

이맥스 – 텍스트 정렬하기

날씨 탓일까요? 뭔가 막혀있는 느낌이 자꾸 드네요. 이럴 땐 역시나 무엇인가에 몰두하는게 가장 좋더라고요.

이맥스 – 텍스트 정렬하기

이건 왜 몰랐을까? 아래와 같이 정렬되지 않은 텍스트를 일정한 규칙에 의해서 정렬할때 align-regexp기능을 사용할 수 있습니다.

rooney = 21
haha = 20
ray = 17

만약 문자 “=” 을 기준으로 정렬을 하고 싶다면, align-regexp을 치고 문자로 “=”을 입력해주세요.

결과는 아래와 같이 정렬된 것을 볼 수 있습니다.

rooney = 21
haha   = 20
ray    = 17

약간 고급스럽게 아래와 같이 사용 할 수 있습니다.

California 423,970 km²
Taiwan 36,008 km²
Japan 377,944 km²
Germany 357,021 km²
Iraq 438,317 km²
Iran 1,648,195 km²
Korea (North+South) 219,140 km²
Mexico 1,964,375 km²

위에 것을 아래와 같이

Taiwan                 36,008 km²
Korea (North+South)   219,140 km²
Japan                 377,944 km²
Germany               357,021 km²
California            423,970 km²
Iraq                  438,317 km²
Iran                1,648,195 km²
Mexico              1,964,375 km²

먼저 전체 텍스트를 영역 지정하고, CTRL+u 그리고 나서 align-regex명령을 입력합니다. 정규식 입력 란에

.* \([0-9,]+\).*

을 입력하고, 그룹에 대해서는

-1

, 공백은

1

을 입력합니다. 반복 실행은

n

을 입력해줍니다.

위와 동일한 효과를 가질 수 있는 두가지 명렁어가 더 있습니다.

  • sort-regexp-fields
  • sort-columns

급하게 잡힌 약속에 나가봐야해서 이만 쓰겠습니다.

Emacs > 맥을 위한 이맥스 Daemon 설정하기

(참조)[https://gist.github.com/ambethia/304964]

여러가지 스크립트가 포함되어 있는 이맥스를 실핼할 때 반복적인 시간이 소요 되는데 이를 해소 할 수 있는 방법을 소개합니다.

맥에 이맥스가 이미 설치 되어 있다는 가정하에 문서를 작성하였습니다.

이맥스 데몬 어플리케이션 생성하기

맥에서 ‘Script Editor’를 열어 아래의 내용을 입력해주세요.

tell application "Terminal"
do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
endtell

저장 할 때는 File > Export, 그리고 File Format : Application을 선택하여 Applications/ 폴더에 저장해주세요.

이상 이맥스 데몬 어플리케이션을 생성하였습니다.

이제 맥이 실행될 때 이 앱을 실행 시켜주기 위해서 어플리케이션을 등록해 봅시다.

  • System Preferences > Accounts 열기
  • 계정 선택 후 Login Items탭 선택
  • ‘+’버튼을 눌러 Emacs Daemon을 선택
  • hide 체크방식에 대해서는 생각할 필요 없음. (나중에 앱 아이콘을 없앨 예정)

이맥스 클라이언트 어플리케이션 생성하기

다시 한번 Script Editor를 열어 아래의 내용을 넣어주세요.

tell application "Terminal"
do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c"
endtell

저장 할 때는 위와 동일하게 Application타입을 선택해주시고, Emacs Client 이름으로 Applications/폴더에 저장해주세요.

새로 생성한 Emacs Client에 아이콘 적용하기

  • Finder를 열어 Application Folder 선택해주세요.
  • Emacs application선택 후 우측 버튼 > Show Package Contents를 선택해주세요.
  • Contents/Resources 폴더 안에 Emacs.icns를 Emacs Client 폴더안에 있는 Content/resources 폴더에 넣어주세요. 그리고 기존에 있던 applet.icns를 삭제하시고 Emacs.icns파일을 applet.icns파일 이름으로 변경해주세요.

Emacs Client가 동작 되는 동안 Dock에서 Emacs 아이콘을 숨겨보자.

  • Application folder에 있는 Emacs Application (Emacs Client가 아님), Show Package Contents로 열어주세요.
  • Info.plist파일을 열어 Add child를 통해 키 NSUIElement, 값 1을 설정해주세요.

모든 설정이 완료 되었네요.

그럼 즐거운 이맥스 라이프!!

Emacs – slime + swank UTF8 미지원으로 인한 문제

ref : http://stackoverflow.com/questions/3101279/how-do-i-use-unicode-utf-8-characters-in-clojure-regular-expressions

일반적으로 English Character가 아닌 것은 emacs + slime + swank에서 작동을 하지 않습니다.

이는 UTF-8이 아닌 다른 것을 지원하므로 아래와 같은 2가지 방법으로 해결할 수 있습니다.

Question:
How do I set emacs/slime/swank to use UTF-8 when talking with Clojure, or use UTF-8 at the command-line REPL?

A more interactive way:
[code]
1. M-x customize-group
2. “slime-lisp”
3. Find the option for slime coding system, and select utf-8-unix. Save this so Emacs picks it up in your next session.

[/code]

Or place this in your .emacs:
[code]
(custom-set-variables ‘(slime-net-coding-system (quote utf-8-unix)))
[/code]

Lisp – Installation

정말 오랜만입니다.

먹고살기 위해 한창 아이폰, 안드로이드 개발만 하다가 다시 Lisp에 접할려고 하니 설치법 부터가 생각이 나질 않는군요.

이전 포스터를 뒤져봐도 엉터리로 작성되어있고 혈압 수치가 보통수준을 넘어선거 같습니다.

이로써 정말 깔끔하게 작성해야겠다는 생각이 번쩍 드는군요.
어떤 이유에서인지는 찾아보지 않았으나 Mac Port로 sbcl설치 시 문제가 발생하는거 같습니다.

처음부터 다시 배운다는 마음으로 포스팅을 남겨봅니다.

Downloading SBCL

Link

설치용 바이너리를 받습니다. Mac OS X유저이기 때문에 x86용 1.0.55버전을 받았습니다.

다운로드 받은 경로로 이동하여 아래와 같이 입력합니다.
[code]# sh install.sh[/code]

설치가 완료 된 후에는 .emacs 파일 <환경 설정 파일>에 아래와 같이 추가해줍니다.
[code]
;; == Slime Setting ==
(add-to-list ‘load-path "~/.emacs.d/slime")
(add-to-list ‘load-path "~/.emacs.d/slime/contrib")
;; (add-to-list ‘load-path "~/.emacs.d/elpa/slime-repl-20100404/")
;; (add-to-list ‘load-path "~/.emacs.d/elpa/slime-20100404/")

(setq slime-backend "~/.emacs.d/slime/swank-loader.lisp")
(load "slime-autoloads")
(require ‘slime)
(require ‘slime-autoloads)
(eval-after-load "slime"
‘(progn
(slime-setup ‘(slime-repl))
(custom-set-variables
‘(inhibit-splash-screen t)
‘(slime-complete-symbol*-fancy t)
‘(slime-complete-symbol-function ‘slime-fuzzy-complete-symbol)
‘(slime-net-coding-system ‘utf-8-unix)
‘(slime-startup-animation nil)
‘(slime-lisp-implementations ‘((sbcl ("/usr/local/bin/sbcl")))))))
;; == End slime setting ==
[/code]

위와 같이 추가해준 후에 사실상 Slime을 먼저 설치해주어야합니다.

Downloading SLIME

[code]
# cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime
[/code]

SLIME을 다운로드 받은 후에 따로 설치하지 않아도 됩니다. 다운로드 파일을 알맞은 경로에 넣어주십시오. 저같은 경우 .emacs.d/ 디렉토리에 넣어 사용중입니다.

위와 같이 모든걸 완료하였다면 emacs config를 재로드하거나 재시작해주신 후 meta+x slime 을 입력하시면 CLisp모드로 전환이 됩니다.

이상입니다.

Emacs – Keyboard Macro

아주 오랜된 일이다.
신입 시절 삼성으로 파견 나가있을 때 내 반복 작업을 도와준 놈이다.

key des
C-x ( 녹화 시작
C-x ) 녹화 끝
C-x e 녹화된 매크로 실행
C-u 10 C-x e 매크로 10회 실행

원문

Emacs – Function:add-to-list

Symbol element & optional append compare-fn
add-to-list는 리스트 항목에 새로운 항목을 추가 할때 사용합니다.
만약 리스트 항목의 맴버가 아니라면 그 리스트 항목 맨 앞에 값을 추가합니다.

그리고 업데이트 후 리스트 값을 반환하며, 그게 아니라면 기존 리스트 값만 반환합니다.

add-to-list 부르기 전에 심볼의 값은 리스트가 되는 것이 낫습니다. ??
add-to-list는 리스트에 존재하는 맴버변수를 대비하여 비교 연산을 하기 위해 compare-fn을 사용합니다.

만약 compare-fn이 nil이면 equal 함수를 사용합니다.

일반적으로 element가 추가되었다면, 기존 심볼 앞에 추가가 됩니다. 하지만 추가적인 argument로 nil을 추가하게 되면 맨 뒤에 붙게 됩니다.

그 argument 심볼은 절대적이지 않습니다;

add-to-list는 set 과 비슷하고, setq와 비슷하지 않은
정식 함수입니다.

그 argument 는 당신이 원하는대로 사용할 수 있습니다.

아래는 add-to-list를 사용하기 위한 몇가지 시나리오입니다.
[code]
(setq foo ‘(a b))
-> (a b)

(add-to-list ‘foo ‘c) ;; c 가 추가되었습니다.
-> (c a b)

(add-to-list ‘foo ‘c) ;; 아무 변화 없습니다.
-> (c a b)

(add-to-list ‘foo ‘b) ;; foo 심볼이 변경 되었습니다.
-> (c a b)
[/code]

add-to-list를 동등한 표현으로 아래와 같이 할 수 있습니다.
[code]
(or (member value var)
(setq var (cons value var)))
[/code]

원문

Emacs – Shortcut (include File Management)

출처 : http://xahlee.org/emacs/file_management.html

Key Purpose
shift + space 한영 전환
 Key  Purpose
 Enter  Open the file
 q  Close the dir
 C  Copy file
 R  Rename file
 D  Delete file
 +  create a new dir
 Z  compress/decompress the file by gzip
 Key  Purpose
 m  mark a file
 u  unmark
 U  unmark all marked
 % m  mark by regular expression
 Key  Purpose
 g  refresh dir listing
 ^  go to parent dir
Key Purpose
% Go to Matching brackets 참고 1
C-q C-j newline
M-x flush-lines RET ^$ RET Delete blank lines with flush-lines 참고 2

참고1) http://www.gnu.org/software/emacs/emacs-faq.html#Matching-parentheses

참고2) http://ruslanspivak.com/2007/10/22/delete-blank-lines-with-flush-lines/

[Emacs] About Encoding

1. Encoding 자동 판별 모듈 – Unicad
Unicad는 Universal Characterset AutoDetector의 약자입니다.
Mozila Universal Charset Detector를 Emacs 모듈로 포팅한 것이라고 하네요.
이 모듈은 Google Code에서 호스팅 되고 있고, EmacsWiki에 별도로 설명하는 페이지를 가지고 있습니다.
[code]
Project Link: <a href="http://code.google.com/p/unicad/">http://code.google.com/p/unicad/</a>
EmacsWiki Link: <a href="http://www.emacswiki.org/cgi-bin/emacs/Unicad">http://www.emacswiki.org/cgi-bin/emacs/Unicad</a>
잘 정리되어 있는 링크 : <a href="http://blog.kaisyu.com/2011/01/emacs-encoding-unicad.html">http://blog.kaisyu.com/2011/01/emacs-encoding-unicad.html</a>
[/code]

2. Emacs File/Character Encoding/Decoding FAQ를 정리해 보았습니다.
출처 : http://xahlee.org/emacs/emacs_encoding_decoding_faq.html
이번 장은 Emacs에서 파일과 Char인코딩/디코딩에 대해서 이야기 나눠보겠습니다.
만약 인코딩과 디코딩에 대해서 좀 더 알고 싶다면 UNICODE Basics: What’s Character Encoding, UTF-8, and All That?
Q:버퍼에서, 인코딩 시스템이 그파일을 어떻게 디코드하였는지 알 수 있나요?
A:’buffer-file-coding-system’ 변수를 확인하기 위해서,
[M-x describe-variable] 입력 후에 변수 명 ‘buffer-file-coding-system’을 입력합니다.

Q:Open/Save 된 파일이 현재 어떻게 코딩 시스템을 사용하는지 알 수 있을가요?
A:[M-x describe-coding-system]

Q:버퍼 인코딩 시스템을 어떻게 설정할 수 있나요?
A:’set-buffer-file-coding-system’을 부른 후에 원하는 인코딩 타입을 입력해주면 됩니다.

Q:Opening/Saving 할때 영구적으로 인코딩 방법을 어떻게 선택하나요?
A:Options>Mule(Multilingual Environment)>Set Language Environment를 선택합니다.
원하는 환경을 바꾸고 Options>Save Opstion을 눌러 환경을 저장합니다.

Q:Emacs는 어떠한 인코딩 방식을 지원하나요?
A:’list-coding-systems’ 를 호출하게 되면 리스트를 보여줍니다.

Q:물리적으로 인코딩 방식을 설정 할 수 있나요?
A:첫 라인에 [-*- coding: utf-8 -*-]파일을 넣어줍니다. 자세한건 원 글을 읽어보세요.

Q:어디서 emacs 유니코드에 대해서 좀더 읽어볼수 잇나요?
A:본 사이트 참조.

[Emacs] Create a directory within emacs.

* to create the directory dir/to/create, type:
[code]
M-x make-directory RET dir/to/create RET[/code]

* to create directories dir/parent1/node and dir/parent2/node, type:
[code]
M-! mkdir -p dir/parent{1,2}/node RET[/code]
It assumes that Emacs’s inferior shell is bash.

* or in a Dired mode

+
It doesn’t create nonexistent parent directories.

Example:

[code]
C-x d *.py RET ; shows python source files in the CWD in `Dired` mode
+ test RET ; create `test` directory in the CWD[/code]
CWD stands for Current Working Directory.

* or just create a new file with non-existing parent directories using C-x C-f and type:
[code]
M-x make-directory RET RET[/code]