Emacs is a powerful text editor. It has an embedded List dialect interpreter, called Emacs-Lisp and it has many extensions — called Emacs Modes — to work in various tasks, from programming tasks, IRC clients, MUAs and time organizing tasks. Many people says that Emacs works likely an Operating System, since it has a lot of applications mounted on top of Emacs Lisp. Python Mode (python-mode) in emacs has been extended and it can be used with various tools, turning your Emacs editor in a powerful IDE to work with Python.
Emacs is configured through the Lisp dialect Emacs-Lisp. Core configuration directives are processed from the ~/.emacs file. To enable the python-mode, you just need to load the python-mode each time that your Emacs editor opens a Python file.
;;; auto load python-mode (autoload 'python-mode "python-mode" "Mode for editing Python source files") ;;; enable python-mode on .py files (setq auto-mode-alist (append '(("\.py" . python-mode) ) auto-mode-alist)) ;; auto font lock mode (defvar font-lock-auto-mode-list (list 'python-mode))
Also i known that each Emacs Mode, has some hooks, and python-mode isn’t an exception. To customize the python-mode you can use the python-mode-hook variable:
(add-hook 'python-mode-hook 'dmw-python-mode-hook)
Where, in this case, dmw-python-mode-hook is a symbol pointing to a function called dmw-python-mode-hook:
;; python mode hook (defun dmw-python-mode-hook () (load "py-mode-ext") (load "pyp") (require 'pycomplete) (setq py-indent-offset 4) (setq py-smart-indentation t) (setq py-continuation-offset 4) (setq indent-tabs-mode nil) (setq py-pychecker-command "~/bin/pylint_etc_wrapper.py") (setq py-pychecker-command-args (quote (""))) (autoload 'pymacs-load "pymacs" nil t) (autoload 'pymacs-eval "pymacs" nil t) (autoload 'pymacs-apply "pymacs") (autoload 'pymacs-call "pymacs") (setq interpreter-mode-alist(cons '("python" . python-mode) interpreter-mode-alist)) (eldoc-mode 1) (define-key py-mode-map [f12] 'pyp) (define-key py-mode-map "C-cC-w" (lambda () (interactive) (command-execute 'py-pychecker-run))) (define-key py-mode-map [C-S-iso-lefttab] 'py-complete) )
This python-mode-hook function or hook function, enables a series of features for you python-mode. First, it loads py-mode-ext and pyp, and also loads pycomplete. Those tools are part of the PAGE – Python Automatic GUI Generator package. py-mode-ext adds some nice functions and commands, like py-call-pdb, to begin debugging Python. pyp adds a command/function that prints the current expression, or prompts for an expression to print, with the complete code hierarchy as prefix:
def main(): if len(sys.argv) != 3: print "No dialup numbern" txtmsg = sys.argv number = sys.argv number = number.strip() for n in [' ', '+', '(', ')', "s", "t", '-']: number = number.replace(n, ""); number = '+' + number skype = Skype4Py.Skype() skype.Attach() ### this line was generated with the pyp ### command that has the line ### (define-key py-mode-map [f12] 'pyp) on the ### python-mode-hook print 'main: skype =', skype # dmw pyp message = skype.CreateSms(Skype4Py.smsMessageTypeOutgoing, number) message.Body = txtmsg message.Send()
Finally the pycomplete module has a very nice tool to enable Python auto-completion. For example the following code:
class ParentObject: parent1 = None parent2 = None parent3 = None def __init__(self, m1, m2, m3): self.parent1 = m1 self.parent2 = m2 def child(self, m1, m2, m3): self.parent3 = ChildObject(m1, m2, m3) def nested(self, m1, m2, m3): self.parent3.child4 = NestedChild(m1, m2, m3) def subnested(self, m1): self.parent3.child4.nested4 = SubNestedChild(m1) ### here I press ctrl + s + tab ### this will run py-complete as the line ### (define-key py-mode-map [C-S-iso-lefttab] 'py-complete) ### is defined on the python-mode-hook str<Ctrl+S+Tab> def __repr__(self): return "n-> " + repr(self.__dict__)
This will display a window as follows — where you just need to press mouse-2 or the middle button on your mouse to select one completion:
Python static checkers are cool, also are tools that you must use in your daily Python programming tasks. For example, on the Emacs Wiki, you can find this article about using Emacs as Python IDE. There I’ve found the pylint_etc_wrapper.py script, which runs three Python static checkers at once: pylint, pychecker, pyflakes and pep8. Running the pychecker script using the ctrl + cctrl + w key sequence, you will obtain a window similar to the next one, will errors reported from those tools: