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 동작 재수행