--- /dev/null
+;; 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)