forked from colonelpanic/dotfiles
82 lines
2.9 KiB
EmacsLisp
82 lines
2.9 KiB
EmacsLisp
|
;;; Complete symbols at point using Pymacs.
|
||
|
|
||
|
;; Copyright (C) 2007 Skip Montanaro
|
||
|
|
||
|
;; Author: Skip Montanaro
|
||
|
;; Maintainer: skip@pobox.com
|
||
|
;; Created: Oct 2004
|
||
|
;; Keywords: python pymacs emacs
|
||
|
|
||
|
;; This software is provided as-is, without express or implied warranty.
|
||
|
;; Permission to use, copy, modify, distribute or sell this software,
|
||
|
;; without fee, for any purpose and by any individual or organization, is
|
||
|
;; hereby granted, provided that the above copyright notice and this
|
||
|
;; paragraph appear in all copies.
|
||
|
|
||
|
;; Along with pycomplete.py this file allows programmers to complete Python
|
||
|
;; symbols within the current buffer. See pycomplete.py for the Python side
|
||
|
;; of things and a short description of what to expect.
|
||
|
|
||
|
(require 'pymacs)
|
||
|
|
||
|
(pymacs-load "pycomplete")
|
||
|
|
||
|
(defun py-symbol-near-point ()
|
||
|
"Return the first textual item to the nearest point."
|
||
|
;; alg stolen from etag.el
|
||
|
(save-excursion
|
||
|
(with-syntax-table py-dotted-expression-syntax-table
|
||
|
(if (or (bobp) (not (memq (char-syntax (char-before)) '(?w ?_))))
|
||
|
(while (not (looking-at "\\sw\\|\\s_\\|\\'"))
|
||
|
(forward-char 1)))
|
||
|
(while (looking-at "\\sw\\|\\s_")
|
||
|
(forward-char 1))
|
||
|
(if (re-search-backward "\\sw\\|\\s_" nil t)
|
||
|
(progn (forward-char 1)
|
||
|
(buffer-substring (point)
|
||
|
(progn (forward-sexp -1)
|
||
|
(while (looking-at "\\s'")
|
||
|
(forward-char 1))
|
||
|
(point))))
|
||
|
nil))))
|
||
|
|
||
|
(defun py-find-global-imports ()
|
||
|
(save-excursion
|
||
|
(let (first-class-or-def imports)
|
||
|
(goto-char (point-min))
|
||
|
(setq first-class-or-def
|
||
|
(re-search-forward "^ *\\(def\\|class\\) " nil t))
|
||
|
(goto-char (point-min))
|
||
|
(setq imports nil)
|
||
|
(while (re-search-forward
|
||
|
"^\\(import \\|from \\([A-Za-z_][A-Za-z_0-9]*\\) import \\).*"
|
||
|
nil t)
|
||
|
(setq imports (append imports
|
||
|
(list (buffer-substring
|
||
|
(match-beginning 0)
|
||
|
(match-end 0))))))
|
||
|
imports)))
|
||
|
|
||
|
(defun py-complete ()
|
||
|
(interactive)
|
||
|
(let* ((pymacs-forget-mutability t)
|
||
|
(symbol (py-symbol-near-point))
|
||
|
(completions
|
||
|
(pycomplete-pycomplete symbol
|
||
|
(py-find-global-imports))))
|
||
|
(cond ((null completions) ; no matching symbol
|
||
|
(message "Can't find completion for \"%s\"" symbol)
|
||
|
(ding))
|
||
|
((null (cdr completions))
|
||
|
(if (string= "" (car completions))
|
||
|
(tab-to-tab-stop)
|
||
|
;; sole completion
|
||
|
(insert (car completions))))
|
||
|
(t
|
||
|
(message "Making completion list...")
|
||
|
(with-output-to-temp-buffer "*PythonCompletions*"
|
||
|
(display-completion-list completions))
|
||
|
(message "Making completion list...%s" "done")))))
|
||
|
|
||
|
(provide 'pycomplete)
|