Practice/Python

Emacs의 Python3 개발 환경

emacs의 python 개발 환경은 크게 두 가지가 유명하다.
하나는 elpy 나머지 하나는 anaconda이다.

이 두가지 중에 하나를 선택해서 사용한다.


elpy

한마디로, emacs에서 python 개발을 위한 all in one 패키지이다.
설치와 설정이 매우 쉬운면서 여느 IDE와 견주어도 꿀리지 않는 강력함이 있다.

(use-package elpy
  :ensure t
  :config
  (elpy-enable)
  (setq elpy-rpc-python-command "python3")
  (setq elpy-rpc-backend "jedi")
  (elpy-use-cpython (or (executable-find "python3")
                        (executable-find "/usr/bin/python3")
                        (executable-find "/usr/local/bin/python3")
                        "python3"))
  (elpy-use-ipython)
  (setq python-shell-interpreter-args "--simple-prompt -i")
  (add-hook 'python-mode-hook (lambda ()
                              (setq indent-tabs-mode nil))))

(use-package ein
  :ensure t)


anaconda

anaconda 최대한 작은 것을 지향한다.
elpy가 자동으로 해주던 것을 일일이 설치하고 설정해야 한다.

python-mode

(use-package python
  :mode ("\\.py\\'" . python-mode)
        ("\\.wsgi$" . python-mode)
  :interpreter ("python" . python-mode)

  :init
  (setq-default indent-tabs-mode nil)

  :config
  (setq python-indent-offset 4)
  ;; TODO pyvenv
  (setq flycheck-python-pycompile-executable
        (or (executable-find "python3")
            (executable-find "/usr/bin/python3")
            (executable-find "/usr/local/bin/python3")
            "python"))
  (setq flycheck-python-pylint-executable
        (or (executable-find "pylint3")
            (executable-find "/usr/bin/pylint3")
            (executable-find "/usr/local/bin/pylint3")
            "pyline"))
  (setq flycheck-python-flake8-executable
        (or (executable-find "flake8")
            (executable-find "/usr/bin/flake8")
            (executable-find "/usr/local/bin/flake8")
            "flake8")))

anaconda-mode

(use-package anaconda-mode
  :ensure t
  :diminish anaconda-mode
  :defer t
  :init (progn
          (add-hook 'python-mode-hook #'anaconda-mode)
          (add-hook 'python-mode-hook #'anaconda-eldoc-mode)))

(use-package company-anaconda
  :ensure t
  :commands (company-anaconda)
  :after company
  :init (add-to-list 'company-backends #'company-anaconda))

unit test

(use-package nose
  :commands (nosetests-one
             nosetests-pdb-one
             nosetests-all
             nosetests-pdb-all
             nosetests-module
             nosetests-pdb-module
             nosetests-suite
             nosetests-pdb-suite)
  :config
  (progn
    (add-to-list 'nose-project-root-files "setup.cfg")
    (setq nose-use-verbose nil)))

(use-package pytest
  :commands (pytest-one
             pytest-pdb-one
             pytest-all
             pytest-pdb-all
             pytest-module
             pytest-pdb-module)
  :config (add-to-list 'pytest-project-root-files "setup.cfg"))

virtualenv

(use-package pyenv-mode
  :if (executable-find "pyenv")
  :commands (pyenv-mode-versions))

(use-package pyvenv
  :defer t)


저작자 표시 변경 금지
신고

'Practice > Python' 카테고리의 다른 글

Emacs의 Python3 개발 환경  (0) 2017.12.14
Practice/Emacs

Emacs의 Programming 관련 공통 설정

elpa

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(add-to-list 'package-archives
             '("melpa-stable" . "http://melpa-stable.milkbox.net/packages/"))
(setq package-enable-at-startup nil)
(setq package-archive-priorities '(("melpa-stable" . 1)))
(package-initialize)

use-package

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(setq use-package-verbose t)
(setq use-package-always-bin "melpa-stable")

(eval-when-compile
  (require 'use-package))

flycheck

(use-package flycheck
  :ensure t
  :diminish flycheck-mode
  :commands flycheck-mode
  :init (global-flycheck-mode)
  :config
  (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)
        flycheck-idle-change-delay 5.0))

helm

(use-package helm
  :ensure t
  :diminish helm-mode
  :bind (("C-c h" . helm-mini)
         ("C-h a" . helm-apropos)
         ;; ("C-x C-b" . helm-buffers-list)
         ;; ("C-x b" . helm-buffers-list)
         ("M-y" . helm-show-kill-ring)
         ("M-x" . helm-M-x)
         ("C-x c o" . helm-occur)
         ("C-x c s" . helm-swoop)
         ("C-x c y" . helm-yas-complete)
         ("C-x c Y" . helm-yas-create-snippet-on-region)
         ("C-x c b" . my/helm-do-grep-book-notes)
         ("C-x c SPC" . helm-all-mark-rings)
         ("C-x C-o" . ffap))
  :init
  (require 'helm-config)
  (setq helm-candidate-number-limit 100)
  (setq helm-yas-display-key-on-candidate t)
  ;; for pretty fast updates when hitting RET too quickly
  ;; after typing fast:
  (setq helm-idle-delay 0.0 ; update fast sources immediately (doesn't).
        helm-input-idle-delay 0.01  ; this actually updates things
                                        ; reeeelatively quickly.
        helm-quick-update t
        helm-M-x-requires-pattern nil
        helm-ff-skip-boring-files t)
  :config
  (use-package helm-descbinds
    :ensure t
    :config (helm-descbinds-mode)))

projectile

(use-package projectile
  :ensure t
  :diminish projectile-mode
  :config
  (setq projectile-enable-caching t
        projectile-indexing-method 'alien
        projectile-completion-system 'helm
        projectile-switch-project-action 'helm-projectile)
  ;; https://github.com/bbatsov/projectile/issues/1183
  (setq projectile-mode-line
        '(:eval (format " Projectile[%s]"
                        (projectile-project-name))))
  (projectile-global-mode))

(use-package helm-projectile
  :ensure t
  :commands (helm-projectile)
  :after helm
  :config (helm-projectile-on))

company

(use-package company
  :ensure t
  :diminish company-mode
  :commands (company-complete company-mode)
  :bind (([remap dabbrev-expand] . company-complete)
         :map prog-mode-map
         ([tab] . company-indent-or-complete-common))
  :init (if (fboundp 'evil-declare-change-repeat)
            (mapc #'evil-declare-change-repeat
                  '(company-complete-common
                    company-select-next
                    company-select-previous
                    company-complete-selection
                    company-complete-number)))
  ;; (add-hook 'after-init-hook 'global-company-mode)
  :config
  (use-package company-statistics
              :ensure t
              :init
              (company-statistics-mode))
  (setq company-idle-delay 0)
  (setq company-show-numbers "on")
  (add-hook 'prog-mode-hook 'company-mode))
저작자 표시 변경 금지
신고
Practice/Scala

Emacs의 Scala 개발 환경

sbt 설치

Ubuntu에서 sbt 0.13.15 설치하기

curl -L -o sbt.deb http://dl.bintray.com/sbt/debian/sbt-0.13.15.deb
sudo dpkg -i sbt.deb
sudo apt-get update
sudo apt-get install sbt

sbt 설정하기

~/.sbt/0.13/plugins/plugins.sbt 파일을 편집한다.

addSbtPlugin("org.ensime" % "sbt-ensime" % "1.12.14")


프로젝트 만들기

편의상, 프로젝트 디렉토리를 '~/my-project'로 가정한다.
'~/my-project/project/build.properties' 파일에 프로젝트에 sbt 버젼을 명시한다.

sbt.version=0.13.15

아래 명령으로 프로젝트를 위한 '.ensime' 파일을 생성한다.

cd ~/my-project
sbt ensimeConfig


Emacs 설정

Emacs의 Programming 관련 공통 설정

(use-package ensime
  :ensure t)

(use-package scala-mode
  :interpreter
  ("scala" . scala-mode)
  :config
  (add-hook 'scala-mode-hook 'ensime-scala-mode-hook))

(use-package sbt-mode
  :commands sbt-start sbt-command
  :config
  ;; WORKAROUND: https://github.com/ensime/emacs-sbt-mode/issues/31
  ;; allows using SPACE when in the minibuffer
  (substitute-key-definition 'minibuffer-complete-word
                             'self-insert-command
                             minibuffer-local-completion-map))


Ensime 시작하기

프로젝트의 파일이나 디렉토리에서, 아래 이맥스 명령어를 입력한다.

M-x ensime


참고 링크


저작자 표시 변경 금지
신고

'Practice > Scala' 카테고리의 다른 글

Emacs의 Scala 개발 환경  (0) 2017.12.14
Practice/C & C++

C++에서 언제 어떻게 struct를 사용하는가?

C++로 코딩할 때에 class와 struct 중에 무엇을 사용할 지 고민을 할 때가 있다.
내가 C++에서 struct를 선택하는 기준은 다음과 같다.

  • 분해하면 모든 멤버 변수가 scala data type이다.
    멤버 변수가 scala data type이거나, 조건에 부합하는 compound data type이어야 한다.
    compound data type은 고정 길이 array, union, struct 이며, 위 조건을 만족한다.
    여기에 해당이 안되면, 즉, 포인터나 가변 길이 배열, class를 포함하고 있다면 class를 사용한다.
  • 구조체를 이진 데이타로 고스란히 pack/unpack 해야 한다.
    struct는 메모리 형태 그대로 데이터로 상호 변환 가능함으로 개발하기 편하다.
    굳이 별도의 pack/unpack 함수를 작성할 필요가 없다.
    이와 같은 용도의 struct를 만들 때에는, 데이터 구조체 정렬(data structure alignment)를 주의한다.[각주:1]
  • 모든 멤버 변수를 외부에 공개할 수 있다.
    반대로 외부에 공개할 필요가 없는-예를 들여, 구현의 변경에 따라서 얼마든지 바뀔 수 있는 구현 의존적인- 멤버 변수가 있다면 class로의 구현을 고민한다.[각주:2]


비록 C++의 struct가 기본 접근 속성이 다른 class의 변종 정도지만,
되도록 C의 그것과 동일한 의미로 사용되도록 작성하는 편이다.
그렇게 하기 위해서는 아래 제약 사항을 지켜야 한다.

  • 상속(inheritance)을 받지 않았다.
    상속은 메모리 구성을 보장하지 않는다.
    상속이 필요하면 구성(composition)으로 해결한다.
    상속받을 struct를 대개 첫번째 멤버 변수로 등록한다.
  • 멤버 함수를 만들지 않는다.
    생성, 초기화, 복사, 할당은 대개 변수의 선언이나 메모리 초기화/복사 등으로 구현한다.
    다른 연관 함수들은 전역 함수 내지는 별도의 구현 class를 이용하여 작성한다.


  1. 이에 관해서는 "<a href="http://unipro.tistory.com/197" target="_blank">C언어에서 struct 정의 그대로 이진 데이터로 만들기</a>"를 참고한다. [본문으로]
  2. 외부 공개용 struct와 내부 구현용 struct/class로 분리하는 전략도 있음으로 반드시 class를 선택할 필요는 없다. [본문으로]
저작자 표시 변경 금지
신고
  1. Favicon of http://moneycoach.kr/ 소액결제 현금화 M/D Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  2. Favicon of http://www.joyalba.com 알바 . M/D Reply

    관리자의 승인을 기다리고 있는 댓글입니다

Practice/Lisp

Lisp 비교 : Emacs의 개발 환경

Emacs의 Programming 관련 공통 설정

Lisp 공통 설정

(use-package paredit
  :ensure t
  :diminish paredit-mode
  :init
  (use-package paredit-everywhere
    :ensure t))


Common Lisp

Common Lisp의 major-mode는 'lisp-mode'이다.
보통 확장자 '*.lisp'나 '*.l'와 연결되어 있다.[각주:1]
SLIME이라는 강력한 REPL 도구가 있다.

Common Lisp 설정 예[각주:2]:

(add-hook 'lisp-mode-hook (lambda ()
                            (setq indent-tabs-mode nil)
                            (paredit-mode t)
                            (helm-gtags-mode 1)))

(use-package slime
  :ensure t
  :commands slime
  :init
  (setq inferior-lisp-program (or (executable-find "sbcl")
                                  (executable-find "/usr/bin/sbcl")
                                  (executable-find "/usr/local/bin/sbcl")
                                  "sbcl"))
  :config
  (require 'slime-autoloads)
  (slime-setup '(slime-fancy))
  (add-hook 'slime-repl-mode-hook (lambda () (paredit-mode t))))


Scheme

Scheme의 major-mode는 'scheme-mode'이다.
확장자 '*.scm'을 사용하면 이 모드와 자동으로 연결된다.
Common Lisp의 SLIME에 비슷한 것으로는 geiser가 있다.

Scheme 설정 예:

(add-hook 'scheme-mode-hook (lambda ()
                              (setq indent-tabs-mode nil)
                              (paredit-mode t)
                              (helm-gtags-mode 1)))

(use-package geiser
  :ensure t
  :init
  (setq geiser-active-implementations '(guile))
  (setq geiser-guile-binary (or (executable-find "guile")
                                (executable-find "/usr/bin/guile")
                                (executable-find "/usr/local/bin/guile")
                                "guile")))


Clojure

최근 주목받고 있는 Lisp 변종인 Clojure의 major-mode는 'clojure-mode'이다.
'*.clj' 파일을 열거나 만들면 이 모드에서 작업할 수 있다.
Clojure 역시 CIDER라는 강력한 REPL 도구를 제공한다.

Clojure 설정 예:

(use-package clojure-mode
  :ensure t
  :init
  (use-package flycheck-clojure
    :ensure t
    :config (flycheck-clojure-setup))
  :config
  (add-hook 'clojure-mode-hook (lambda ()
                                 (setq indent-tabs-mode nil)
                                 (paredit-mode t)
                                 (subword-mode t))))

(use-package cider
  :ensure t
  :commands (cider cider-connect cider-jack-in)
  :config
  (add-hook 'cider-mode-hook 'eldoc-mode)
  (add-hook 'cider-repl-mode-hook (lambda ()
                                    (paredit-mode t)
                                    (subword-mode t))))


Emacs Lisp

emacs는 emacs lisp로 만들어졌음으로 당연히 훌륭한 major 모드를 제공한다.
'*.el', '.elisp' 또는 '.emacs' 파일을 열면 자동으로 'emacs-lisp-mode'에 들어간다.
'ielm'은 Emacs Lisp를 위한 훌륭한 REPL 도구이다.

Emacs Lisp 설정 예:

(add-hook 'emacs-lisp-mode-hook (lambda ()
                                  (setq indent-tabs-mode nil)
                                  (turn-on-eldoc-mode)
                                  (eldoc-add-command
                                   'paredit-backward-delete
                                   'paredit-close-round)
                                  (paredit-mode t)))
(add-hook 'lisp-interaction-mode-hook (lambda () (paredit-mode t)))
(add-hook 'ielm-mode-hook (lambda () (paredit-mode t)))


  1. 명시적인 지정이 없으면 파일의 확장자(auto-mode-alist 변수에 명시된 확장자)나 내용(shebangs, magic-mode-alist 명시된 파일의 내용 패턴)을 보고 자동으로 major-mode를 결정한다. [본문으로]
  2. 나의 Emacs 설정 파일 Github: <a href="http://github.com/unipro/.emacs.d">http://github.com/unipro/.emacs.d</a> [본문으로]
저작자 표시 변경 금지
신고

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 72
Yesterday : 341
Total : 179,324