PythonãEmacsã§æ¸ã+α
- ã¯ããã«
- ç°å¢
- python mode
- æ°ã«å ¥ã£ã¦ããããã±ã¼ã¸
- ä»å¾ãããã¨æã£ã¦ãè¨å®
- åè
ã¯ããã«
ãã®è¨äºãæ¸ãã¦ããæ©1å¹´ã æãªã¨ãã«ã¡ããã¡ããã¨ããã£ã¦ãããã¡ã«ãhelmãå°å ¥ããããtabbarãå ¥ãããã¨è²ã å¤ãã£ã¦ããã å ¨é¨æ¸ãã¦ããã¨å¤ãããã®ã§ãä¸ã§ãä¸çªå¤ãã£ãpythonãæ¸ãããã®è¨å®ã«ã¤ãã¦æ¸ãã å ãã¦æ°ã«å ¥ã£ã¦ããããã±ã¼ã¸ã«ã¤ãã¦ãæ¸ãã
å ¨ä½ã®è¨å®ã®githubã®ã¬ãã¸ããªã¯ãã¡ãã github.com elispã®ã³ã¼ããå¤å°æ¸ãããã©ããã®é¨åã ãã§ãªããcommon.elã«æ¸ãã¦ããé¨åããªãã¨åããªããã®ãããã¨æãã
- åç»ã¡ã¤ã³ã®è¨äºãæ¸ãã
ksknw.hatenablog.com
ç°å¢
python mode
1å¹´åã¯elpyã¨ã使ã£ã¦ãªãã¨ãããã¨ãpythonãæ¸ãã¦ããã ä»æãã¨ããé å¼µã£ã¦æ¸ãã¦ããªã£ã¦æãã ä»ã¯pythonãæ¸ãããã«ä¸»ã«ä»¥ä¸ã®ããã±ã¼ã¸ã«é ¼ã£ã¦ããã ãããã¯è£å®ãã³ã¼ãè¦ç´æºæ ãææ³ãã§ãã¯ããã³ãã¬ã¼ãå±éã®æ©è½ã
- jedi
- autopep8
- pyflakes
- yasnippet
以ä¸ã使ãããã«ã¯ã
$ sudo apt-get install pyflakes $ sudo pip install jedi epc autopep8
ãããå¿ è¦ãããã
jedi
jediã¯ãªã ãè£å®ãã¤ã¾ãææ³çãªé¨åãããç¨åº¦æ±²ãã ä¸ã§è£å®ããã¦ãããããã±ã¼ã¸ã è£å®ã ãã§ãªãé¢æ°ã®å®ç¾©ã«ã¸ã£ã³ãããæ©è½ãããã å ¬å¼ã¯ãã¡ã
ãã¡ãã®è¨å®ãåèã«ãã¦ãè¨å®ããã
(jedi:setup) (define-key jedi-mode-map (kbd "<C-tab>") nil) ;;C-tabã¯ã¦ã£ã³ãã¦ã®ç§»åã«ç¨ãã (setq jedi:complete-on-dot t) (setq ac-sources (delete 'ac-source-words-in-same-mode-buffers ac-sources)) ;;jediã®è£å®åè£ã ãã§ãã (add-to-list 'ac-sources 'ac-source-filename) (add-to-list 'ac-sources 'ac-source-jedi-direct) (define-key python-mode-map "\C-ct" 'jedi:goto-definition) (define-key python-mode-map "\C-cb" 'jedi:goto-definition-pop-marker) (define-key python-mode-map "\C-cr" 'helm-jedi-related-names)
ä½ãèããã«è¨å®ããã¨ãå ã ã®auto-completeã®è£å®ã表示ããã¦ãã¾ãã®ã§ããããã¯æ¶ãã¦ããã¨ããã¨æãã
ãããªæãã§è£å®ãããã
autopep8
ã³ã¼ããæ¸ãã¨ããæ¼ç®åã®ä¸¡å´ã«ã¹ãã¼ã¹ãå ¥ããã¨ããç¡é§ãªæ¹è¡ãå ¥ãéããªãã¨ããè²ã æ°ã«ãã¦ãªãã¨è¦ãç®ã«æ±ãã³ã¼ãã«ãªã£ã¦ãã¾ãã æã§ç´ãããããªãããåãããã¾ãããããã¨ãªããããããªããã©ãèªåã§ç´ãã¦ããããªãããã«è¶ãããã¨ã¯ãªãã autopep8ã¯pep8ã¨ããã³ã¼ãã£ã³ã°è¦ç´ã¨æ¯è¼ãã¦ãã¡ãªã¨ãããåæã«ä¿®æ£ãã¦ãããæ©è½ã
ä¾ãã°ãããªæãã®ã³ã¼ããæ¸ãã¦ä¿åããã¨
# -*- coding: utf-8 -*- def test(a): return a+1 if __name__ == '__main__': print test( 10)
åæã«ãã®ãããªã³ã¼ãã«å¤æããã¦ä¿åãããã
# -*- coding: utf-8 -*- def test(a): return a + 1 if __name__ == '__main__': print test(10)
ã¡ãªã¿ã«ã","ã®å¾ãã«ã¹ãã¼ã¹ãç½®ããã¨ã¯è¦ç´éåã§ã¯ãªãã®ã§ã ããã¯ä¿®æ£ããããã©ã
test(10, 20, 30) test(1 ,2 ,3)
ããããã®ã¯ä¿®æ£ãããªãã
test(10, 20, 30) test(1, 2, 3)
ã®ã§ã縦æ¹åã«ã¤ã³ãã³ããæãããã¨ãã¯ã¹ãã¼ã¹ãã©ãã«å ¥ããããã¡ãã£ã¨ã ãæ°ã«ããªãã¨ãããªãã
è¨å®ã¯ä»¥ä¸ãpep8ã®è¦å®ã«1è¡79å以å ã¨ããã®ããããããããã«å³ããããªããã¨æãã®ã§ã200åã«å¤ãã¦ããã
(require 'py-autopep8) (setq py-autopep8-options '("--max-line-length=200")) (setq flycheck-flake8-maximum-line-length 200) (py-autopep8-enable-on-save)
pyflakes (flymake-cursor)
pythonã¯ã³ã³ãã¤ã«ãä¸è¦ãªã®ã§ãéã«ã¨ã©ã¼ããã£ãã¨ãã¦ãããã®ç®æãå®è¡ãããã¾ã§ããããªãã pyflakesã¯ã¨ã¦ã便å©ã§ãã¨ã©ã¼ãwarningã表示ãã¦ãããã ãããEmacsããå¼ã¶ãã¨ã§ãç»é¢å ã«ã¨ã©ã¼ãªã©ã表示ã§ããã
(flymake-mode t) ;;errorãwarningã表示ãã (require 'flymake-python-pyflakes) (flymake-python-pyflakes-load)
ãããªæãã§pyflakesãåæã«å®è¡ãã¦çµæã表示ãã¦ãããã
yasnippet
ä»ã®ã¨ãã£ã¿ã«ãªããªã移ããªãåå ã®ä¸ç«¯ããã®æ©è½ã çããã¬ã¼ãºãå ¥åããå¾ãtabãæ¼ãã¨äºãç»é²ããããã¬ã¼ãºãæ¿å ¥ãã¦ãããã githubã®ã¬ãã¸ããªã¯ãã¡ãã åç´ãªãã¬ã¼ãºã®æ¿å ¥ã ãã§ãªãã
class $0:
def __init__(self, $1)
$2
ã¨ãæ¸ãã¦ããã¨ã$ã®ã¨ãããé çªã«ã«ã¼ã½ã«ç§»åããã¦ç©´åãã¿ãããªæãã§ã³ã¼ããæ¸ããã¨ãã§ããã
以ä¸ã®ãããªãã®ãããããç»é²ãã¦ããã
. + Tab
self.
np + Tab
import numpy as np
ifmain + Tab
if __name__ == '__main__':
æ°ã«å ¥ã£ã¦ããããã±ã¼ã¸
helm
1å¹´åã¯anythingã使ã£ã¦ããã anything-filelist+ã«ã¯å¤§å¤ãä¸è©±ã«ãªã£ããã ãã©ãhelmã«ã¯helm-locateã¨ãããã®ããã£ã¦(anythingã«ãããã®ãããããªãã)ããã£ã¡ã®ã»ãã便å©ããã ã£ãã®ã§ãhelmã«ä¹ãæããã helm-locateã¯ããã©ã«ãã§ã¯andæ¤ç´¢ãã§ããªãã¦ä¸ä¾¿ã ã£ãããã©ããã¡ãã®è¨å®ã使ãã¨ãandæ¤ç´¢ã§ããããã«ãªã£ã¦ãall.filelistã¨ããä½ããªãã¦ãããfilelist+ãããªããªã£ã¦ãªã£ãã
å ¨è¬çãªè¨å®ã¯ãã¡ããåèã«ãã ã
locateã¯ãã¡ã¤ã«ãä½ã£ãç´å¾ãªããã¯æ´æ°ããã¦ããªãã®ã§ã $ sudo updatedb ã¨ãããå¿ è¦ããã¾ã«ããã
è¦ãç®
æ¬è³ªçã§ã¯ãªããã©ããªãããããããããããã®ãä¸çªæ¥½ãããããããªãã
æè¿è¿½å ãããã®ã®ãªãã§Tabbarãããæãã ã£ãã ãã¡ã¤ã«éãã¨ãã¯ã ãããhelm使ã£ã¦ãããå¥ã«ãããªãã£ã¡ããããªããã©ã
;;tabãã¼ã追å ããã ; tabbar.el http://cloverrose.hateblo.jp/entry/2013/04/15/183839 (require 'tabbar) (tabbar-mode 1) ;; ã°ã«ã¼ãåããªã (setq tabbar-buffer-groups-function nil) ;;ç»åã¯ãããªã (setq tabbar-use-images nil) ;; å·¦ã«è¡¨ç¤ºããããã¿ã³ãç¡å¹å (dolist (btn '(tabbar-buffer-home-button tabbar-scroll-left-button tabbar-scroll-right-button)) (set btn (cons (cons "" nil) (cons "" nil)))) ;; ã¿ãå士ã®éé ;; http://ser1zw.hatenablog.com/entry/2012/12/31/022359 (setq tabbar-separator '(0.8)) (defun my-tabbar-buffer-list () (delq nil (mapcar #'(lambda (b) (cond ;; Always include the current buffer. ((eq (current-buffer) b) b) ((buffer-file-name b) b) ((char-equal ?\ (aref (buffer-name b) 0)) nil) ;; ((equal "*scratch*" (buffer-name b)) b) ; *scratch*ãããã¡ã¯è¡¨ç¤ºãã ((equal "*eww*" (buffer-name b)) b) ; *eww*ãããã¡ã¯è¡¨ç¤ºãã ((char-equal ?* (aref (buffer-name b) 0)) nil) ; ãã以å¤ã® * ã§å§ã¾ããããã¡ã¯è¡¨ç¤ºããªã ((buffer-live-p b) b))) (buffer-list)))) (setq tabbar-buffer-list-function 'my-tabbar-buffer-list) ;; tabbarå¤è¦³å¤æ´ (set-face-attribute 'tabbar-default nil :family (face-attribute 'default :family) :background (face-attribute 'mode-line-inactive :background) :height 1.0) (set-face-attribute 'tabbar-unselected nil :background (face-attribute 'mode-line-inactive :background) :foreground (face-attribute 'mode-line-inactive :foreground) :box nil) (set-face-attribute 'tabbar-selected nil :background (face-attribute 'mode-line :background) :foreground (face-attribute 'mode-line :foreground) :box nil)
ãã®ä»ç´°ã
ã¨è¨å®ãã¦ããããªæãã®è¦ãç®ã«ãªãã
Emacsãåèµ·åããã¨ãã«ãçµäºæã®ç¶æ ã«æ»ã
Emacsãèµ·åãã¦ãç»é¢ãåå²ãã¦ãæ¨æ¥éãã¦ãããã¡ã¤ã«ãéãã¦ã£ã¦ããã®ããã©ãããã ãã¡ããåèã«ãã¦ãdesktop-save-modeãè¨å®ããã 以ä¸ã¯è¨å®å¾ã«èªåçã«init.elã«è¿½å ããã¦ããã
;;åèµ·åæã«è²ã 復å (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(desktop-save-mode t)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. )
ä»å¾ãããã¨æã£ã¦ãè¨å®
quick run + pdb
Emacsä¸ã§pythonãèµ·åãã¦Emacsä¸ã§ãããã°ãããã ãã¹ã®è¨å®ã¨ãé¢åã§ã¾ã ãã£ã¦ãªãã
ein mode
ipython(jupyter) notebookãEmacsãã使ããã¤ãjupyterã®ãã¼ã¸ã§ã³ãä¸ãã£ããããä¸æã使ããªãã
åè
- GitHub - tkf/emacs-jedi: Python auto-completion for Emacs
- Jedi.el: jump to definition **and back again**
- pyflakes 1.4.0 : Python Package Index
- GitHub - joaotavora/yasnippet: A template system for Emacs
- NTEmacs @ ウィキ - helm を使うための設定
- Helm をストレスなく使うための個人的な設定 - あらびき日記
- tabbar.elでEmacsをタブエディタ化 (自動で最適な設定をしたい) - cloverrose's blog
- 年末なのでEmacsの設定ファイルを見直しますよ - ser1zw's blog
- Emacsの終了時の状態を保存する