Created
February 7, 2013 05:35
-
-
Save artagnon/4728804 to your computer and use it in GitHub Desktop.
My Cython mode
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Cython mode | |
;; Load python-mode if available, otherwise use builtin emacs python package | |
(when (not(require 'python-mode nil t)) | |
(require 'python)) | |
(add-to-list 'auto-mode-alist '("\\.pyx\\'" . cython-mode)) | |
(add-to-list 'auto-mode-alist '("\\.pxd\\'" . cython-mode)) | |
(add-to-list 'auto-mode-alist '("\\.pxi\\'" . cython-mode)) | |
(defun cython-compile () | |
"Compile the file via Cython." | |
(interactive) | |
(let ((cy-buffer (current-buffer))) | |
(with-current-buffer | |
(compile compile-command) | |
(set (make-local-variable 'cython-buffer) cy-buffer) | |
(add-to-list (make-local-variable 'compilation-finish-functions) | |
'cython-compilation-finish))) | |
) | |
(defun cython-compilation-finish (buffer how) | |
"Called when Cython compilation finishes." | |
;; XXX could annotate source here | |
) | |
(defvar cython-mode-map | |
(let ((map (make-sparse-keymap))) | |
;; Will inherit from `python-mode-map' thanks to define-derived-mode. | |
(define-key map "\C-c\C-c" 'cython-compile) | |
map) | |
"Keymap used in `cython-mode'.") | |
(defvar cython-font-lock-keywords | |
`(;; new keywords in Cython language | |
(,(regexp-opt '("by" "cdef" "cimport" "cpdef" "ctypedef" "enum" "except?" | |
"extern" "gil" "include" "nogil" "property" "public" | |
"readonly" "struct" "union" "DEF" "IF" "ELIF" "ELSE") 'words) | |
1 font-lock-keyword-face) | |
;; C and Python types (highlight as builtins) | |
(,(regexp-opt '("NULL" "bint" "char" "dict" "double" "float" "int" "list" | |
"long" "object" "Py_ssize_t" "short" "size_t" "void") 'words) | |
1 font-lock-builtin-face) | |
;; cdef is used for more than functions, so simply highlighting the next | |
;; word is problematic. struct, enum and property work though. | |
("\\<\\(?:struct\\|enum\\)[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)" | |
1 py-class-name-face) | |
("\\<property[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)" | |
1 font-lock-function-name-face)) | |
"Additional font lock keywords for Cython mode.") | |
(define-derived-mode cython-mode python-mode "Cython" | |
"Major mode for Cython development, derived from Python mode. | |
\\{cython-mode-map}" | |
(setcar font-lock-defaults | |
(append python-font-lock-keywords cython-font-lock-keywords)) | |
(set (make-local-variable 'compile-command) | |
(concat "cython -a " buffer-file-name)) | |
(add-to-list (make-local-variable 'compilation-finish-functions) | |
'cython-compilation-finish) | |
) | |
(provide 'cython-mode) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment