2019년 1월 24일 목요일

virtualenvwrapper - python virtualenv 개발 환경

python virtualenv


독립된 python 환경을 만들고 activate / deactivate 과정으로 특정 환경으로 설정 및 해제

예)

$ virtualenv env
$ source env/bin/activate
(env) $ which python
~/env/bin/python
$ deactivate

virtualenvwrapper


원하는 virtualenv 환경으로 activate 와 deactivate 수행을 대신하여 emacs 종료 없이 virtualenv 를 바꿔가면서 작업할 수 있음

설치


Emacs package manager 이용


예)
M-x package-install RET virtualenvwrapper RET

설정


예)

(require 'virtualenvwrapper)
(venv-initialize-interactive-shells)
(venv-initialize-eshell)

(setq venv-location "/home/tj/env/")


필자의 경우 virtualenv 환경을 여럿 사용하고 있고 /home/tj/env 폴더에 여러 환경 폴더를 생성해서 사용하고 있기 때문에 여러 virtualenv 환경들이 있는 폴더를 지정하게 되면 virtualenvwrapper 가 해당 폴더 내에서 환경을 탐색해서 설정해 준다

virtualenv 환경 선택


예)

/home/tj/env/ 에 아래와 같이 virtualenv 환경 파일들을 생성했다면

~/env $ virtualenv --system-site-packages -p python2 python2
Running virtualenv with interpreter /usr/bin/python2
New python executable in /home/tj/env/python2/bin/python2
Also creating executable in /home/tj/env/python2/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
~/env $ virtualenv --system-site-packages -p python3 python3
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/tj/env/python3/bin/python3
Also creating executable in /home/tj/env/python3/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.




python2 환경으로 설정


M-x venv-workon RET python2 RET


eshell 에서 확인


M-x eshell RET
$ which python
/home/tj/env/python2/bin/python


python3 환경으로 설정


M-x venv-workon RET python3 RET
$ which python
/home/tj/env/python3/bin/python


설정 해제


M-x venv-deactivate RET



2019년 1월 23일 수요일

Package 설치 방법 + melpa 저장소 추가

emacs 25 버전 부터 package 관리 기능이 내장되었고 이전에 직접 emacs lisp 패키지를 다운받아 설치하고 설정하는 과정이 간단하게 바뀌었다

기본 저장소보다 melpa 저장소에 선택할 수 있는 package 들이 많아 melpa 저장소를 pakcage 저장소 목록에 추가하여 사용하고 있다

melpa 저장소




.emacs 추가


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

(package-initialize)


Package 관리


M-x package-list-packages RET

  • i - 설치하려는 항목 선택
  • u - 선택 해제
  • d - 삭제하려는 항목 선택
  • U - upgrade 가능한 항목들 일괄 선택
  • x - 선택한 동작 일괄 실행


설치한 패키지 활성화


패키지 마다 설정 방법들이 다를 수 있으며 해당 패키지의 웹사이트에서 설정 방법이나 사용법을 숙지 할 수 있다

예) yasnippet 패키지

.eamcs 추가


(require 'yasnippet)
(yas-global-mode 1)



2019년 1월 19일 토요일

version control

svn, git 등 여러 소스 버전 관리 시스템을 지원하며 vc mode 를 사용하는 동안 어떤 버전 관리 시스템을 사용하던 일관된 인터페이스를 제공하고 있음



C-x v d <path> RET - vc-dir 버퍼
n, p - 이동
m, M, u, U - 작업할 파일 선택 및 선택 해제
i - 선택 항목들 add
v - 선택된 파일들 commit 하기 위해 commit message 입력창
  • C-c C-c 로 commit 을 수행하고 C-c C-k 로 commit 작업 취소
l - 커서 위치의 파일 또는 디렉토리에 해당하는 로그 보기
=, d - 수정된 파일의 경우 변경된 내용 표시
편집된 파일을 열고 C-x v u 로 편집 전 상태로 복구
P - push
+ - pull


push 및 pull 의 경우 사용자 인증 과정이 제각각 달라 emacs 내에서 실패로만 뜨는 경우 있음

ssh 주소로 clone 을 받고 ssh 키를 등록해서 따로 인증 과정 없이 push 및 pull 할 수 있도록 하면 편리함


2019년 1월 12일 토요일

Emacs 기본 사용법



파일 편집


* 열기: C-x C-f
* 저장: C-x C-s
* 찾기: C-s <keyword>
* 복사: M-w
* 잘라내기: C-w
* 붙여넣기: C-y (이후 M-y 반복하여 kill-ring 순환)
* 실행취소(undo): C-- 또는 C-/
    * redo: 실행취소 하다가 다른 동작 후 실행취소
* 세로줄 삽입: C-x r t (M-x string-rectangle)
* 세로줄 삭제: C-x r k (M-x kill-rectangle)
* 입력 언어 전환: C-\
    * 한글은 korean-hangul
* 찾아 바꾸기: M-% <keyword> RET <replace> RET
* command shell 명령 수행 결과 입력: C-u M-!
* 파일 맨 처음: M-<
* 파일 맨 끝: M->
* page up: M-v
* page down: C-v

dired mode


* 갱신: g
* 복사: C
* 이동(이름변경): R
* 삭제: D
* 선택: m(항목 선택) t(선택 반전) u(항목 선택 취소) U(전체 선택 취소)
* cmd 명령 수행: !
* directory 생성: +
* 상위 directory 이동: ^

window


* 가로 나누기: C-x 2
* 세로 나누기: C-x 3
* 이동: C-x o
* 현재 window 만 남기기: C-x 1
* 현재 window 없애기: C-x 0


buffer


* 현재 window 에 다른 buffer 표시: C-x b <buffer>
    * buffer 이름이 없는 경우 임시 버퍼 생성되며 닫을 때 저장할지 물어보지 않음
* buffer 닫기: C-x C-k

.emacs


* emacs 시작할때 수행되는 파일로 매번 수행하는 동작 등을 기록
* emacs lisp 언어로 작성
* $HOME/.emacs 에 생성

예)

(setq make-backup-files nil)
(global-linum-mode 1)

2019년 1월 3일 목요일

GUI 환경과 다른 점

물론 Emacs GUI 인터페이스는 마우스 및 데스크탑 환경 정보를 이용가능하지만 텍스트 기반의 TUI 상에서 주로 작업하게 되었고 GUI 환경에서의 버릇으로 적응하는데 어려운 점이 있었으나 습관을 바꾸는 과정에서 얻게 된 이점이 많았음

스크롤


마우스 휠 스크롤을 이용해 자연스럽게 문서를 위 아래로 이동하고 스크롤바의 위치로 찾고자 하는 위치를 가늠하는 식의 행동이 습관화 되어있어서 emacs 사용시 마우스 및 스크롤바 지원이 약한 부분에서 늘 막다른 골목에 다다른 느낌이었다

적응하기 위해 방법을 찾다가 차츰 컨텐츠 내용과 줄번호를 지표로 원하는 위치를 찾는 습관을 들이게 됨

Emacs 확장 기능에 편의 기능이 존재할 수도 있겠으나 찾아보지는 않음

단점은 물론 직관적이지 않다고 할수 있겠으나 의외로 습관을 고쳐서 장점이 더 많다고 봄

예를 들어 GUI IDE 사용시 대부분 컴파일 에러 위치를 클릭하면 해당 소스로 곧바로 이동하게 되어 실제 에러 정보 상에 표시되는 기본 정보들을 소홀히 하는 경우가 많으나 해당 출력 정보를 유심히 보게 되면서 컴파일 출력 정보를 제대로 이해하는 것 하나로도 문제의 원인이나 해결 방법을 가늠할 수 있다는 점을 알게됨

특히 개발 경험이 적을 때 IDE 로 개발하는 경우 컴파일 경고 및 에러 문구 필터링 기능을 이용해 경고 문구는 무시하도록 설정해 놓고 컴파일 에러만 집중해서 수정하는 관습을 갖는 경우를 많이 보이는데 실제 일반 사용자에게 프로그램을 배포해 보거나 집중 테스트 수행시 찾아낸 많은 문제들이 컴파일 경고를 적절하게 처리하지 않아 발생하는 문제들이 많이 있음

컴파일 경고는 실행에 문제 없으니 괜찮으면 넘어가라는 관용의 문구가 아니라 어떻게 처리할지 모르겠으니 당신이 고민하라는 지시로 여기게 됨

컴파일 에러 및 경고 문구에는 문제의 종류 및 문제가 발생한 소스 코드의 위치, 호출 순서 등의 정보를 담고 있음

문제의 종류는 일반적으로 사람이 읽을 수 있는 문구나 에러 번호로 출력되고 해당 문구나 에러 번호를 인터넷에 검색하면 다른 사람들이 이미 겪은 문제에 대한 해답을 찾을 수 있음

여기서 이미 문제 해결에 대한 많은 실마리가 풀리는 경우가 많았고 소스 코드를 보거나 하는 경우는 본인의 문제로 스스로 해결해야 하는 부분

IDE 에 익숙한 동료를 보면 컴파일 에러 또는 사용자 이슈 보고서의 에러 구문을 통한 문제를 직면했을 때 컴퓨터가 출력한 로그의 내용을 파악하기 보다는 먼저 문제가 발생한 소스로 이동해 소스 코드 상의 앞뒤를 살피는 일부터 하는 경우를 많이 보게됨

여기서 문제는 방법이 잘못된 것이 아니라 순서가 잘못된 것이고 컴퓨터 전원 플러그를 꽂지도 않고 전원 버튼의 원리와 전자 기기 전문 서적을 뒤져보느라 시간 낭비하는 식의 경우가 반복되는 사례

결론적으로 편리한 기능인 스크롤에 길들여져 있는 습관에서 벗어나 출력문에 충실하고 컴파일러 수행이 순차적으로 동작한다는 기본 전제를 다시금 새롭게 인식하게 되었으며 개발하는데 수월함을 얻는 또다른 방법을 터득하게 됨


마우스 클릭 및 선택


마우스로 해당 위치를 클릭하고 끌어서 놓기 동작으로 문구를 선택하고 복사 붙여넣기 하는 일은 직관적이며 자주 수행하는 동작

그러나 늘 클릭한 위치는 원하는 위치에서 한자 앞 또는 뒤에 클릭이 되고 선택은 정교하지 않고 결국 마우스로 대강 끌어놓고 키보드로 한자 앞 뒤로 이동하는 식의 방법까지 사용

이 부분에 있어서는 커서를 위치시키고 선택하는데 있어서는 분명히 emacs 처럼 키보드 조작만으로 수행하는 편이 손도 덜 왔다 갔다 하며 정확하고 빠르게 작업할 수 있음

단, 한가지 들여야 할 습관은 컨텐츠 내용으로 문서의 원하는 위치를 찾아가는 습관과 줄번호 등의 수치적 정보를 활용한 컨텐츠 탐색 방법을 습득해야 더 빠르게 작업할 수 있음

참고: C-Space - 선택 모드 토글

예를 들어 단어 단위 이동 M-fM-b 페이지 단위 이동 C-vM-v 줄 맨 앞 또는 맨 위로 이동 C-aC-e 그리고 앞에 여백 무시하고 첫 글자로 이동 M-m 등의 단축키 사용에 익숙해 지면 좋음

선택 모드 상태에서 C-s <검색 키워드> 로 찾기 동작시 해당 위치까지 선택되는 등 선택 모드 상태와 여타 동작 연계를 터득하게 되면 오히려 마우스로 무언가 선택하는 일이 부담스러워 짐