2018년 12월 24일 월요일

프로그램 개발 개요

IDE 를 사용할 수 있다면 IDE 를 사용하는 편이 수월할 수도 있으나 shell 과 text 편집 기능 정도만 있는 text editor 두가지로 개발을 하는데 크게 무리가 없는 정도의 프로젝트의 경우 emacs 를 선택하는 것도 좋을 것이라 생각한다

사실 emacs 를 주로 사용하게 되면서 되도록이면 개발은 emacs 로 진행하고 있고 emacs 로 어떻게든 개발할 수 있는 여지가 있는지 찾게 되고 운이 좋은건지 대부분은 방법이 있었다

새로운 언어가 나오면 먼저 해당 소스 코드의 문법 강조 package 를 찾아 설치하고 shell 로 빌드하는 방법을 찾아서 shell script 또는 makefile 등을 이용해 명령어 한번에 빌드하거나 테스트 할 수 있는 정도만 준비하고 나머진 일반적인 emacs 사용법에서 다르지 않다

이러한 방법이 더 좋으니 모두 사용하라고 권할 것은 아니지만 emacs 로 python 이나 swift (linux 버전) 와 같이 꽤나 새로 나온 언어 또는 앞으로 새롭게 나올 언어들도 별다른 무리 없이 emacs 는 지원할 수 있다는 점은 흥미로운 부분이다



코딩


문법 강조


M-x package-list-packages RET
<파일 포맷>-mode 라는 이름으로 문법 강조 package 들이 있음
예)
cython 은 cython-mode 라는 package 를 설치
package 설치 후에는 열려 있는 파일은 닫았다가 열던지 M-x cython-mode RET 등으로 버퍼를 해당 모드로 적용

참고(패키지 설치): https://tjemacs.blogspot.com/2018/11/package.html

들여쓰기


소스 코드의 경우 tab 키의 기본 동작은 자동 들여쓰기로 tab 키를 여러번 누른다고 문자열 tab 이 입력되는 것이 아님

Enter 를 치면 자동으로 들여쓰기가 기본 동작이지만 emacs 설정에 따라 M-j 로 개행을 삽입해야 자동 들여쓰기가 동작하는 경우 있음

Python 의 경우 들여쓰기 의도를 파악하기 모호하기 때문에 tab 을 계속 누르면 들여쓰기가 늘었다가 다시 맨앞으로 돌아오고 다시 늘어나는 식으로 들여쓰기를 선택할 수 있도록 함

여러 줄을 선택하고 tab 을 누르면 해당 영역의 코드 모두 자동 들여쓰기

주석


  • C-; - 주석 삽입
  • 선택 후 C-; - 주석으로 만들기 또는 이미 주석인 경우 주석 해제


주석 내용 입력 중 M-j 를 누르면 개행이 되면서 곧바로 주석 내용 입력 상태


컴파일


makefile 의 경우 make 명령으로 컴파일하고 오류 및 경고가 출력되고 실행 결과가 0 인지 아닌지에 따라 빌드가 결과적으로 성공인지 실패인지 가늠

emacs 의 compilation 버퍼는 빌드 과정의 출력 정보를 분석해 컴파일 오류 및 경고에 해당하는 소스 파일 위치를 강조 표시하고 빌드 결과가 성공인지 실패인지 버퍼 마지막에 알림

Compilation 버퍼에서 M-n 또는 M-p 로 오류 및 경고에 해당하는 출력문 사이를 이동할 수 있음

C-x ` 로 첫번째 오류 및 경고 위치의 소스 파일의 해당 줄을 표시


참고(컴파일 버퍼): https://tjemacs.blogspot.com/2018/12/compilation.html


소스 버전 관리


SVN 또는 GIT 등의 소스 버전 관리 도구의 편리 기능 제공

버전 관리 도구 마다 유사하게 제공하는 기능 (예: log, commit, blame, diff, push 등) 은 공통된 인터페이스로 제공

특정 버전 관리 도구만의 고유 기능은 따로 shell 에서 수행해야 하는 한계는 있음


참고 (Version control): https://www.gnu.org/software/emacs/manual/html_node/emacs/Version-Control.html




2018년 12월 23일 일요일

Kill Ring


참고: https://www.gnu.org/software/emacs/manual/html_node/emacs/Kill-Ring.html

설명


Emacs 는 잘라내기나 복사한 문자열들을 kill ring 이라는 구조로 global 공간에 보관한다
  • 잘라내기 및 복사한 문자열을 여럿 저장하고 있다가 붙여넣기 할 수 있다

Kill ring 은 global 영역이기 때문에 하나의 버퍼에서 저장한 문자열을 다른 버퍼에서 붙여넣기 할 수 있다


복사 붙여넣기


M-d (단어 단위 삭제) 또는 C-k (줄 삭제) 등의 잘라내기 또는 M-w (선택 영역 복사) 등의 kill ring 에 데이터를 밀어 넣는 작업들 이후

C-y (붙여넣기) 동작으로 현재 버퍼에 이전 데이터를 붙여넣고 곧바로 M-y 를 통해 kill ring 에 저장된 데이터 들을 순차적으로 불러올 수 있다

예)

1. C-x b temp RET - 임시 버퍼 생성

  • 존재하지 않는 버퍼 이름을 입력하면 임시 버퍼를 만들어 줌
  • 임시 버퍼는 닫을 때 저장할지 물어보지 않기 때문에 필요시 명시적으로 저장(C-x C-s)

2. 예문 입력

Hello, Bob
Hello, John
Hello, Steve


3. Bob 과 John, Steve 를 M-d (커서 위치의 단어 잘라내기) 로 잘라내기

Hello,
Hello,
Hello,

4. 붙여넣기

  • 첫번째 줄의 Hello, 끝에 커서를 옮기고 C-y (붙여넣기) 시 Steve 이 표시됨
  • 곧바로 M-y (다음 kill ring) 시 John 이 표시됨
  • 다시 M-y 시 Bob 이 표시됨
  • 다시 M-y 시 Steve 이 표시됨 (다시 돌아옴)
  • 다시 M-y 시 John 이 표시됨


Hello, John
Hello,
Hello,

5. 붙여넣기

  • 두번째 줄의 Hello, 끝에 커서를 옮기고 C-y (붙여넣기) 시 John 이 표시됨
    • 마지막 붙여넣기 한 kill ring 의 위치에서 시작
  • M-y 시 Bob 이 표시됨

Hello, John
Hello, Bob
Hello,



Kill ring 에 넣지 않고 삭제


Backspace 로 지운 경우 kill ring 에 들어가지 않음

C-space (선택 모드) 후 커서를 이동하여 원하는 만큼 선택 후 backspace 로 선택 영역을 지우면 kill ring 에 저장하지 않고 삭제


결론



  • 잘라내기한 문자열들을 여럿 저장할 수 있기 때문에 여러 문자열을 다른 버퍼로 붙여넣을 때 유용
  • 저장한 문자열이 많으면 원하는 문자열을 만나기 위해 한참 M-y 를 눌러야 하는 경우 있음






Compilation


참고: https://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation.html


설명


컴파일 명령 수행을 위한 편리 기능


수행


M-x compile RET
Compile command: make -k

기본으로 make -k 가 제시되고 다른 명령어 수행시 다음 compile 에는 마지막 수행한 명령어가 기본으로 설정됨 (emacs 재시작시 make -k 로 초기화)

일반 shell 명령어 수행 가능


컴파일 버퍼


일반적으로 컴파일 명령은 shell 수행과 동일하나 컴파일 과정의 warning 또는 error 문구의 양식이 정해져 있기 때문에 emacs 는 출력 문구를 parsing 하여 warning 또는 error 문구에 문법 강조를 하고 navigation 할 수 있는 기능을 제공함

컴파일 버퍼에는 명령 수행의 시작 시간과 종료 시간, 명령 수행에 대한 결과 값이 성공 또는 실패로 버퍼에 표시해 주기 때문에 일반 명령의 경우도 해당 기능이 필요한 경우 용이함

warning 또는 error 문구 로 이동


  • M-n 또는 M-p - 커서를 warning 또는 error 문구들 사이로 이동
  • C-x ` - 화면에 새로운 창이 열리고 에러 문구에 해당하는 소스 파일의 위치로 커서를 이동
    • 연속 수행시 다음 warning 또는 error 문구에 해당하는 파일 위치로 이동


컴파일 중지


C-c C-k


컴파일 재시작


해당 화면에서 작업 중인 경우

g

다른 화면에서 작업 중인 경우

M-x recompile RET 으로 마지막 compile 동작 재수행


eshell

eshell


참고: https://www.gnu.org/software/emacs/manual/html_mono/eshell.html


설명


emacs shell 은 bash 또는 sh 과 다르게 emacs lisp 과 연계된 명령을 수행하거나 eshell 에서만 제공하는 기능들을 사용할 수 있음
물론 명령 수행의 기본적인 기능은 bash 나 sh 과 유사함


bash 등 일시 사용


필자는 eshell 에서 일시로 bash 에서 수행을 원하는 경우 해당 명령을 shell script 파일로 만들어서 사용하고 있음

예) 아래와 같이 파일 처음에 #! 로 스크립트 실행 환경을 명시

#!/bin/bash
for item in $(ls); do
    echo $item
done



자동 alias 추가 기능


eshell 에 없는 명령어를 세번 넘게 연속 입력하는 경우 해당 명령어를 alias 로 등록하도록 물어봄

예)
~/temp/test $ ll
ll: command not found
~/temp/test $ ll
ll: command not found
~/temp/test $ ll
ll: command not found
~/temp/test $ ll


4번째 ll 입력시 아래와 같이 alias 등록

Define alias for "ll": ls -asl

다음 ll 입력시 ls -asl 수행

~/temp/test $ ll
total 8
   4 drwxrwxr-x   2 tj             tj       4096 2018-12-23 20:35 .
   4 drwxrwxr-x   7 tj             tj       4096 2018-12-23 20:35 ..



lisp 수행


예)
$ (+ 1 2)
3



Dired mode

파일 관리




C-x C-f <폴더 경로> RET


폴더 경로의 경우 dired mode 로 버퍼를 열고 파일 및 폴더 목록을 표시
아래와 같은 단축키 사용 가능

  • n - 커서를 다음줄로 이동
  • p - 커서를 이전줄로 이동
  • m - 커서 위치의 항목 선택
  • u - 커서 위치의 항목 선택 해제
  • U - 모든 선택 해제
  • t - 선택 반전
  • ! - shell command 실행 (선택된 파일들을 명령어에 포함)
    • 예) tar xvf 만 입력하면 tar xvf <파일명> 을 입력한 것과 같은 동작
    • 예) 파일이 여러개이면 tar czvf test.tar.gz ** 은 여러 파일명으로 치환되어 실행됨
  • %-m <정규 패턴> RET - 정규 패턴의 파일들 일괄 선택
  • Q <찾을 문자열> RET <바꿀 문자열> RET - 선택된 파일들에 찾을 문자열을 바꿀 문자열로 일괄 변경
  • C <경로명> RET - 해당 경로명으로 파일 복사
  • R <경로명> RET - 해당 경로명으로 파일 이동 (파일명 수정 효과)
  • D - 파일 삭제 (폴더의 경우 yes/no 선택 물어봄)
  • + <폴더명> RET - 폴더 만들기
  • ^ - 상위 폴더로 이동
  • M - 파일 권한 수정
    • 예) M +x RETchmod +x <파일명> 과 같은 동작 (+x 는 실행 권한 추가)




2018년 12월 20일 목요일

창 및 버퍼 관리

창과 버퍼


  • 기본적으로 화면에 표시되는 1개의 창이 필요
  • 화면에 1개 이상의 창을 분할하여 사용할 수 있음
  • 창 하나에 하나의 버퍼가 표시됨
  • 파일을 열었다던가 디렉토리 탐색을 한다던가 여러 목적의 버퍼들이 다수 떠 있을 수 있지만 화면에 보이는 버퍼의 개수는 현재 표시되는 창의 개수로 한정됨

버퍼 관리



주로 보면 텍스트 편집류의 버퍼와 편리 기능성류의 버퍼들로 나뉘어 각 버퍼 특성에 따라 인터페이스가 공통된 성향을 보임

텍스트 편집류의 버퍼는 소스 코드나 텍스트 파일 등의 주로 내용을 변경하는 위주의 버퍼
키 입력이 기본으로 버퍼에 입력되며 C-<키> 또는 M-<키> 조합의 키로 확장 기능을 제공

편리 기능성의 버퍼는 디렉토리 탐색이나 컴파일 결과 등의 버퍼 내용을 변경하기 보다는 내용을 탐색하는 위주의 버퍼
버퍼 내용을 수정하는 것이 목적이 아니기 때문에 C-<키> 또는 M-<키> 조합이 아닌 일반 키 입력만으로 기능을 제공하는 경우가 많음


공통



  • C-x b <버퍼명> RET - 현재 창에 버퍼 변경
  • C-x C-b - 버퍼 목록 표시


주의) 아래는 개인적인 관점에서 나눈 것이며 실제 버퍼 특성에 따라 다를 수 있음


텍스트 편집류 버퍼


  • C-n - 커서를 이전 줄로 이동
  • C-p - 커서를 다음 줄로 이동
  • C-v - 페이지 다운
  • M-v - 페이지 업
  • C-f - 커서를 한글자 앞으로 이동
  • C-b - 커서를 한글자 뒤로 이동
  • C-a - 커서를 해당 줄의 맨 앞으로 이동
  • C-e - 커서를 해당 줄의 맨 뒤로 이동



편리 기능성 버퍼


  • n - 커서를 이전 줄로 이동
  • p - 커서를 다음 줄로 이동
  • q - 창 닫기 (버퍼는 없애지 않음)
  • m - 선택 (커서 위치의 항목)
  • u - 선택 해제 (커서 위치의 항목)
  • U - 모든 선택 해제
  • x - 수행
  • g - 화면 갱신



창 관리



일반적으로 창을 닫아도 버퍼는 없어지지 않음

단축키


  • C-x 2 - 가로로 분할 (위, 아래로 창 분할)
  • C-x 3 - 세로로 분할 (왼쪽 오른쪽으로 창 분할)
    • 참고로 필자는 잘 사용하지 않으며 창을 2개 넘게 분할해서 사용하는 경우는 별로 없음
  • C-x 0 - 현재 창 닫기
  • C-x 1 - 현재 창을 제외한 다른 모든 창 닫기
  • C-x o - 커서를 다른 창으로 이동
    • 왼쪽에서 오른쪽으로 이동하며 위쪽에서 아래쪽으로 이동



단축키 지정


.emacs 에 추가

(define-key global-map (kbd "ESC <up>") (lambda () (interactive) (other-window -1)))
(define-key global-map (kbd "ESC <down>") 'other-window)

(define-key global-map (kbd "<M-up>") (lambda () (interactive) (other-window -1)))
(define-key global-map (kbd "<M-down>") 'other-window)

  • Alt 키와 방향키 위/아래 로 창 이동


2018년 12월 10일 월요일

Input methods

https://www.gnu.org/software/emacs/manual/html_node/emacs/Input-Methods.html


한영 자판을 쓰는 경우 시스템 자판 설정을 사용할 수도 있지만 시스템과 별개로 emacs 내 입력 지원을 사용할 수 있고 어떤 경우 더 편리하다

예)
mac 을 사용하는 경우 시스템 전반에 입력 방식이 적용되어 한영 자판 변환이 자주 일어나는 경우 다른 윈도우로 변환시 헷갈리는 일도 잦고 입력하는 글이 한글과 영문이 많은 혼재 되어 있는 경우 번거롭지만 emacs 내 입력 방식 전환을 통해 시스템과 별개의 자판 환경을 갖게 되고 한영 변환도 빠르게 하고 지원하는 언어도 다양한 장점이 있다

단축키


C-\

기본 input method 변경


참고: https://emacs.stackexchange.com/a/419

아래와 같이 2가지 방법


.emacs 에 직접 추가


(setq default-input-method 'korean-hangul)


설정창


  1. M-x customize
  2. i18n 검색
  3. MULE -> Default input method 에서 Value Menu 를 string 으로 변환 후 korean-hangul 입력
  4. 저장 C-x C-s

주의) 설정창 이용하여 설정을 변경한 경우 .emacs 에 설정 코드가 들어가게 되어 직접 .emacs 에 추가한 코드가 무시될 수 도 있음

2018년 11월 24일 토요일

Package 설치

Emacs 24 버전 부터 emacs package 관리 기능 제공하여 손쉽게 package 를 설치하고 제거할 수 있음

Package 목록 보기


M-x package-list-packages

단축키 설명
  • i: 설치할 패키지 선택
  • d: 제거할 패키지 선택
  • u: 선택 해제
  • x: 선택한 명령 일괄 수행
  • U: 업그레이드 가능한 패키지 모두 선택

Package 제공 repository 추가


예) $HOME/.emacs 에 추가

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)



기본 ELPA repository 보다 다양한 package 를 제공하는 melpa repository 추가

팁) emacs 구동시 주로 사용하는 패키지 자동으로 설치


예)

;; install packages automatically on startup
(require 'cl-lib)
(defvar my-packages
  '(yasnippet yasnippet-snippets auto-complete web-mode virtualenvwrapper))
 

(defun my-packages-installed-p ()
  (cl-loop for p in my-packages
           when (not (package-installed-p p)) do (cl-return nil)
           finally (cl-return t)))

(unless (my-packages-installed-p)
  (package-refresh-contents)
  (dolist (p my-packages)
    (when (not (package-installed-p p))
      (package-install p))))



설명:
  • my-packages 변수: 자동으로 설치할 package 이름들 기술
  • my-packages-installed-p 함수: my-packages 목록의 package 들이 설치되었는지 확인




Backup 기능

Backup 파일


참고: https://www.gnu.org/software/emacs/manual/html_node/emacs/Backup.html

원래 파일명 뒤에 ~ 를 붙임

예)
README 는 README~ 파일이 자동 생성

make-backup-files 변수를 t 또는 nil 로 설정하여 emacs 동작 설정


예) $HOME/.emacs 파일에 추가


(setq make-backup-files nil) ; backup 기능 중지




2018년 11월 23일 금요일

Emacs 설치

최신 버전의 emacs 설치를 위해 소스를 받아 빌드

소스 다운로드

https://www.gnu.org/software/emacs/


Ubuntu


GUI toolkit 없이 사용


$ sudo apt install libxpm-dev libjpeg-dev libpng-dev libgif-dev libtiff-dev libgnutls-dev libncurses-dev
$ curl -OL http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-26.1.tar.gz
$ tar xvf emacs-26.1.tar.gz
$ cd emacs-26.1
$ ./configure --with-x-toolkit=no
$ make
$ sudo make install

Note)
  • Ubuntu 18.04 에서 libgnutls-dev 는 libgnutls28-dev 설치


GUI toolkit 사용시 gtk 패키지 설치 필요


$ sudo apt install libgtk2.0-dev

./configure 시 --with-x-toolkit=no 제거



바이너리 다운로드


바이너리 버전을 받으면 바로 실행 가능


Docker container 에서 빌드시 에러


참고: https://stackoverflow.com/a/37561793

**************************************************
Warning: Your system has a gap between BSS and the
heap (23758296 bytes).  This usually means that exec-shield
or something similar is in effect.  The dump may
fail because of this.  See the section about
exec-shield in etc/PROBLEMS for more information.
**************************************************

docker run 할 때 --security-opt seccomp=unconfined 옵션을 추가

예)
$ docker run --rm -it --security-opt seccomp=unconfined emacs-builder-image


Windows


빌드된 바이너리 emacs 를 받아 바로 사용 가능
emacs 다운로드 웹 페이지에서 다운로드



macosx


다운로드: https://emacsformacosx.com/

실행 바이너리 형태