aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes
diff options
context:
space:
mode:
authorjave2014-12-31 12:24:10 +0100
committerjave2014-12-31 12:24:10 +0100
commitbaba9e039136e183e055169ddd7ca1e983fc734f (patch)
tree9168fb077980351a25ea3a112f2abd105a11099a /lisp/progmodes
parent4105b6a93047045553e10795742a808b805c85b7 (diff)
parent25346768fac53687c97c213fb99ff18fa805b073 (diff)
downloademacs-baba9e039136e183e055169ddd7ca1e983fc734f.tar.gz
emacs-baba9e039136e183e055169ddd7ca1e983fc734f.zip
merge upstream
Diffstat (limited to 'lisp/progmodes')
-rw-r--r--lisp/progmodes/elisp-mode.el95
-rw-r--r--lisp/progmodes/etags.el5
-rw-r--r--lisp/progmodes/js.el2
-rw-r--r--lisp/progmodes/python.el591
-rw-r--r--lisp/progmodes/sh-script.el2
-rw-r--r--lisp/progmodes/xref.el28
6 files changed, 521 insertions, 202 deletions
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index ef619f0899a..c6cab1257a5 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -418,40 +418,19 @@ It can be quoted, or be inside a quoted form."
418 (match-string 0 doc)))) 418 (match-string 0 doc))))
419 419
420(declare-function find-library-name "find-func" (library)) 420(declare-function find-library-name "find-func" (library))
421 421(declare-function find-function-library "find-func" (function &optional l-o v))
422(defvar elisp--identifier-types '(defun defvar feature defface))
423
424(defun elisp--identifier-location (type sym)
425 (pcase (cons type sym)
426 (`(defun . ,(pred fboundp))
427 (find-definition-noselect sym nil))
428 (`(defvar . ,(pred boundp))
429 (find-definition-noselect sym 'defvar))
430 (`(defface . ,(pred facep))
431 (find-definition-noselect sym 'defface))
432 (`(feature . ,(pred featurep))
433 (require 'find-func)
434 (cons (find-file-noselect (find-library-name
435 (symbol-name sym)))
436 1))))
437 422
438(defun elisp--company-location (str) 423(defun elisp--company-location (str)
439 (catch 'res 424 (let ((sym (intern-soft str)))
440 (let ((sym (intern-soft str))) 425 (cond
441 (when sym 426 ((fboundp sym) (find-definition-noselect sym nil))
442 (dolist (type elisp--identifier-types) 427 ((boundp sym) (find-definition-noselect sym 'defvar))
443 (let ((loc (elisp--identifier-location type sym))) 428 ((featurep sym)
444 (and loc (throw 'res loc)))))))) 429 (require 'find-func)
445 430 (cons (find-file-noselect (find-library-name
446(defvar elisp--identifier-completion-table 431 (symbol-name sym)))
447 (apply-partially #'completion-table-with-predicate 432 0))
448 obarray 433 ((facep sym) (find-definition-noselect sym 'defface)))))
449 (lambda (sym)
450 (or (boundp sym)
451 (fboundp sym)
452 (featurep sym)
453 (symbol-plist sym)))
454 'strict))
455 434
456(defun elisp-completion-at-point () 435(defun elisp-completion-at-point ()
457 "Function used for `completion-at-point-functions' in `emacs-lisp-mode'." 436 "Function used for `completion-at-point-functions' in `emacs-lisp-mode'."
@@ -493,8 +472,13 @@ It can be quoted, or be inside a quoted form."
493 :company-docsig #'elisp--company-doc-string 472 :company-docsig #'elisp--company-doc-string
494 :company-location #'elisp--company-location)) 473 :company-location #'elisp--company-location))
495 ((elisp--form-quoted-p beg) 474 ((elisp--form-quoted-p beg)
496 ;; Don't include all symbols (bug#16646). 475 (list nil obarray
497 (list nil elisp--identifier-completion-table 476 ;; Don't include all symbols (bug#16646).
477 :predicate (lambda (sym)
478 (or (boundp sym)
479 (fboundp sym)
480 (featurep sym)
481 (symbol-plist sym)))
498 :annotation-function 482 :annotation-function
499 (lambda (str) (if (fboundp (intern-soft str)) " <f>")) 483 (lambda (str) (if (fboundp (intern-soft str)) " <f>"))
500 :company-doc-buffer #'elisp--company-doc-buffer 484 :company-doc-buffer #'elisp--company-doc-buffer
@@ -572,11 +556,12 @@ It can be quoted, or be inside a quoted form."
572 556
573;;; Xref backend 557;;; Xref backend
574 558
575(declare-function xref-make-buffer-location "xref" (buffer position)) 559(declare-function xref-make-elisp-location "xref" (symbol type file))
576(declare-function xref-make-bogus-location "xref" (message)) 560(declare-function xref-make-bogus-location "xref" (message))
577(declare-function xref-make "xref" (description location)) 561(declare-function xref-make "xref" (description location))
578 562
579(defun elisp-xref-find (action id) 563(defun elisp-xref-find (action id)
564 (require 'find-func)
580 (pcase action 565 (pcase action
581 (`definitions 566 (`definitions
582 (let ((sym (intern-soft id))) 567 (let ((sym (intern-soft id)))
@@ -585,16 +570,34 @@ It can be quoted, or be inside a quoted form."
585 (`apropos 570 (`apropos
586 (elisp--xref-find-apropos id)))) 571 (elisp--xref-find-apropos id))))
587 572
573(defun elisp--xref-identifier-location (type sym)
574 (let ((file
575 (pcase type
576 (`defun (when (fboundp sym)
577 (let ((fun-lib
578 (find-function-library sym)))
579 (setq sym (car fun-lib))
580 (cdr fun-lib))))
581 (`defvar (when (boundp sym)
582 (or (symbol-file sym 'defvar)
583 (help-C-file-name sym 'var))))
584 (`feature (when (featurep sym)
585 (ignore-errors
586 (find-library-name (symbol-name sym)))))
587 (`defface (when (facep sym)
588 (symbol-file sym 'defface))))))
589 (when file
590 (when (string-match-p "\\.elc\\'" file)
591 (setq file (substring file 0 -1)))
592 (xref-make-elisp-location sym type file))))
593
588(defun elisp--xref-find-definitions (symbol) 594(defun elisp--xref-find-definitions (symbol)
589 (save-excursion 595 (save-excursion
590 (let (lst) 596 (let (lst)
591 (dolist (type elisp--identifier-types) 597 (dolist (type '(feature defface defvar defun))
592 (let ((loc 598 (let ((loc
593 (condition-case err 599 (condition-case err
594 (let ((buf-pos (elisp--identifier-location type symbol))) 600 (elisp--xref-identifier-location type symbol)
595 (when buf-pos
596 (xref-make-buffer-location (car buf-pos)
597 (or (cdr buf-pos) 1))))
598 (error 601 (error
599 (xref-make-bogus-location (error-message-string err)))))) 602 (xref-make-bogus-location (error-message-string err))))))
600 (when loc 603 (when loc
@@ -611,8 +614,18 @@ It can be quoted, or be inside a quoted form."
611 (push (elisp--xref-find-definitions sym) lst)) 614 (push (elisp--xref-find-definitions sym) lst))
612 (nreverse lst)))) 615 (nreverse lst))))
613 616
617(defvar elisp--xref-identifier-completion-table
618 (apply-partially #'completion-table-with-predicate
619 obarray
620 (lambda (sym)
621 (or (boundp sym)
622 (fboundp sym)
623 (featurep sym)
624 (facep sym)))
625 'strict))
626
614(defun elisp--xref-identifier-completion-table () 627(defun elisp--xref-identifier-completion-table ()
615 elisp--identifier-completion-table) 628 elisp--xref-identifier-completion-table)
616 629
617;;; Elisp Interaction mode 630;;; Elisp Interaction mode
618 631
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 0be99794356..be0dabf17b2 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -975,6 +975,7 @@ onto a ring and may be popped back to with \\[pop-tag-mark].
975Contrast this with the ring of marks gone to by the command. 975Contrast this with the ring of marks gone to by the command.
976 976
977See documentation of variable `tags-file-name'." 977See documentation of variable `tags-file-name'."
978 (declare (obsolete xref-find-definitions-other-window "25.1"))
978 (interactive (find-tag-interactive "Find tag other window: ")) 979 (interactive (find-tag-interactive "Find tag other window: "))
979 980
980 ;; This hair is to deal with the case where the tag is found in the 981 ;; This hair is to deal with the case where the tag is found in the
@@ -1015,6 +1016,7 @@ onto a ring and may be popped back to with \\[pop-tag-mark].
1015Contrast this with the ring of marks gone to by the command. 1016Contrast this with the ring of marks gone to by the command.
1016 1017
1017See documentation of variable `tags-file-name'." 1018See documentation of variable `tags-file-name'."
1019 (declare (obsolete xref-find-definitions-other-frame "25.1"))
1018 (interactive (find-tag-interactive "Find tag other frame: ")) 1020 (interactive (find-tag-interactive "Find tag other frame: "))
1019 (let ((pop-up-frames t)) 1021 (let ((pop-up-frames t))
1020 (find-tag-other-window tagname next-p))) 1022 (find-tag-other-window tagname next-p)))
@@ -1037,6 +1039,7 @@ onto a ring and may be popped back to with \\[pop-tag-mark].
1037Contrast this with the ring of marks gone to by the command. 1039Contrast this with the ring of marks gone to by the command.
1038 1040
1039See documentation of variable `tags-file-name'." 1041See documentation of variable `tags-file-name'."
1042 (declare (obsolete xref-find-apropos "25.1"))
1040 (interactive (find-tag-interactive "Find tag regexp: " t)) 1043 (interactive (find-tag-interactive "Find tag regexp: " t))
1041 ;; We go through find-tag-other-window to do all the display hair there. 1044 ;; We go through find-tag-other-window to do all the display hair there.
1042 (funcall (if other-window 'find-tag-other-window 'find-tag) 1045 (funcall (if other-window 'find-tag-other-window 'find-tag)
@@ -1786,6 +1789,7 @@ Two variables control the processing we do on each file: the value of
1786interesting (it returns non-nil if so) and `tags-loop-operate' is a form to 1789interesting (it returns non-nil if so) and `tags-loop-operate' is a form to
1787evaluate to operate on an interesting file. If the latter evaluates to 1790evaluate to operate on an interesting file. If the latter evaluates to
1788nil, we exit; otherwise we scan the next file." 1791nil, we exit; otherwise we scan the next file."
1792 (declare (obsolete "use `xref-find-definitions' interface instead." "25.1"))
1789 (interactive) 1793 (interactive)
1790 (let (new 1794 (let (new
1791 ;; Non-nil means we have finished one file 1795 ;; Non-nil means we have finished one file
@@ -1929,6 +1933,7 @@ directory specification."
1929;;;###autoload 1933;;;###autoload
1930(defun tags-apropos (regexp) 1934(defun tags-apropos (regexp)
1931 "Display list of all tags in tags table REGEXP matches." 1935 "Display list of all tags in tags table REGEXP matches."
1936 (declare (obsolete xref-find-apropos "25.1"))
1932 (interactive "sTags apropos (regexp): ") 1937 (interactive "sTags apropos (regexp): ")
1933 (with-output-to-temp-buffer "*Tags List*" 1938 (with-output-to-temp-buffer "*Tags List*"
1934 (princ "Click mouse-2 to follow tags.\n\nTags matching regexp `") 1939 (princ "Click mouse-2 to follow tags.\n\nTags matching regexp `")
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 45074d338d3..f6a9440610e 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -1673,7 +1673,7 @@ This performs fontification according to `js--class-styles'."
1673 ;; We can probably just add +, -, !, <, >, %, ^, ~, |, &, ?, : at which 1673 ;; We can probably just add +, -, !, <, >, %, ^, ~, |, &, ?, : at which
1674 ;; point I think only * and / would be missing which could also be added, 1674 ;; point I think only * and / would be missing which could also be added,
1675 ;; but need care to avoid affecting the // and */ comment markers. 1675 ;; but need care to avoid affecting the // and */ comment markers.
1676 ("\\(?:^\\|[=([{,:;]\\)\\(?:[ \t]\\)*\\(/\\)[^/*]" 1676 ("\\(?:^\\|[=([{,:;]\\|\\_<return\\_>\\)\\(?:[ \t]\\)*\\(/\\)[^/*]"
1677 (1 (ignore 1677 (1 (ignore
1678 (forward-char -1) 1678 (forward-char -1)
1679 (when (or (not (memq (char-after (match-beginning 0)) '(?\s ?\t))) 1679 (when (or (not (memq (char-after (match-beginning 0)) '(?\s ?\t)))
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 35e24e14e1c..c46c5d68019 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -69,7 +69,7 @@
69;; Besides that only the standard CPython (2.x and 3.x) shell and 69;; Besides that only the standard CPython (2.x and 3.x) shell and
70;; IPython are officially supported out of the box, the interaction 70;; IPython are officially supported out of the box, the interaction
71;; should support any other readline based Python shells as well 71;; should support any other readline based Python shells as well
72;; (e.g. Jython and Pypy have been reported to work). You can change 72;; (e.g. Jython and PyPy have been reported to work). You can change
73;; your default interpreter and commandline arguments by setting the 73;; your default interpreter and commandline arguments by setting the
74;; `python-shell-interpreter' and `python-shell-interpreter-args' 74;; `python-shell-interpreter' and `python-shell-interpreter-args'
75;; variables. This example enables IPython globally: 75;; variables. This example enables IPython globally:
@@ -119,18 +119,24 @@
119;; modify its behavior. 119;; modify its behavior.
120 120
121;; Shell completion: hitting tab will try to complete the current 121;; Shell completion: hitting tab will try to complete the current
122;; word. Shell completion is implemented in such way that if you 122;; word. The two built-in mechanisms depend on Python's readline
123;; change the `python-shell-interpreter' it should be possible to 123;; module: the "native" completion is tried first and is activated
124;; integrate custom logic to calculate completions. To achieve this 124;; when `python-shell-completion-native-enable' is non-nil, the
125;; you just need to set `python-shell-completion-setup-code' and 125;; current `python-shell-interpreter' is not a member of the
126;; `python-shell-completion-string-code'. The default provided code, 126;; `python-shell-completion-native-disabled-interpreters' variable and
127;; enables autocompletion for both CPython and IPython (and ideally 127;; `python-shell-completion-native-setup' succeeds; the "fallback" or
128;; any readline based Python shell). This code depends on the 128;; "legacy" mechanism works by executing Python code in the background
129;; readline module, so if you are using some Operating System that 129;; and enables auto-completion for shells that do not support
130;; bundles Python without it (like Windows), installing pyreadline 130;; receiving escape sequences (with some limitations, i.e. completion
131;; from URL `http://ipython.scipy.org/moin/PyReadline/Intro' should 131;; in blocks does not work). The code executed for the "fallback"
132;; suffice. To troubleshoot why you are not getting any completions 132;; completion can be found in `python-shell-completion-setup-code' and
133;; you can try the following in your Python shell: 133;; `python-shell-completion-string-code' variables. Their default
134;; values enable completion for both CPython and IPython, and probably
135;; any readline based shell (it's known to work with PyPy). If your
136;; Python installation lacks readline (like CPython for Windows),
137;; installing pyreadline (URL `http://ipython.org/pyreadline.html')
138;; should suffice. To troubleshoot why you are not getting any
139;; completions, you can try the following in your Python shell:
134 140
135;; >>> import readline, rlcompleter 141;; >>> import readline, rlcompleter
136 142
@@ -256,6 +262,7 @@
256(defvar outline-heading-end-regexp) 262(defvar outline-heading-end-regexp)
257 263
258(autoload 'comint-mode "comint") 264(autoload 'comint-mode "comint")
265(autoload 'help-function-arglist "help-fns")
259 266
260;;;###autoload 267;;;###autoload
261(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode)) 268(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode))
@@ -395,7 +402,18 @@
395 (* ?\\ ?\\) (any ?\' ?\"))) 402 (* ?\\ ?\\) (any ?\' ?\")))
396 (* ?\\ ?\\) 403 (* ?\\ ?\\)
397 ;; Match single or triple quotes of any kind. 404 ;; Match single or triple quotes of any kind.
398 (group (or "\"" "\"\"\"" "'" "'''")))))) 405 (group (or "\"" "\"\"\"" "'" "'''")))))
406 (coding-cookie . ,(rx line-start ?# (* space)
407 (or
408 ;; # coding=<encoding name>
409 (: "coding" (or ?: ?=) (* space) (group-n 1 (+ (or word ?-))))
410 ;; # -*- coding: <encoding name> -*-
411 (: "-*-" (* space) "coding:" (* space)
412 (group-n 1 (+ (or word ?-))) (* space) "-*-")
413 ;; # vim: set fileencoding=<encoding name> :
414 (: "vim:" (* space) "set" (+ space)
415 "fileencoding" (* space) ?= (* space)
416 (group-n 1 (+ (or word ?-))) (* space) ":")))))
399 "Additional Python specific sexps for `python-rx'") 417 "Additional Python specific sexps for `python-rx'")
400 418
401 (defmacro python-rx (&rest regexps) 419 (defmacro python-rx (&rest regexps)
@@ -1206,12 +1224,18 @@ the line will be re-indented automatically if needed."
1206 (eolp) 1224 (eolp)
1207 ;; Avoid re-indenting on extra colon 1225 ;; Avoid re-indenting on extra colon
1208 (not (equal ?: (char-before (1- (point))))) 1226 (not (equal ?: (char-before (1- (point)))))
1209 (not (python-syntax-comment-or-string-p)) 1227 (not (python-syntax-comment-or-string-p)))
1210 ;; Never re-indent at beginning of defun 1228 ;; Just re-indent dedenters
1211 (not (save-excursion 1229 (let ((dedenter-pos (python-info-dedenter-statement-p))
1212 (python-nav-beginning-of-statement) 1230 (current-pos (point)))
1213 (python-info-looking-at-beginning-of-defun)))) 1231 (when dedenter-pos
1214 (python-indent-line))))) 1232 (save-excursion
1233 (goto-char dedenter-pos)
1234 (python-indent-line)
1235 (unless (= (line-number-at-pos dedenter-pos)
1236 (line-number-at-pos current-pos))
1237 ;; Reindent region if this is a multiline statement
1238 (python-indent-region dedenter-pos current-pos)))))))))
1215 1239
1216 1240
1217;;; Navigation 1241;;; Navigation
@@ -2087,36 +2111,18 @@ and `python-shell-output-prompt-regexp' using the values from
2087 2111
2088(defun python-shell-get-process-name (dedicated) 2112(defun python-shell-get-process-name (dedicated)
2089 "Calculate the appropriate process name for inferior Python process. 2113 "Calculate the appropriate process name for inferior Python process.
2090If DEDICATED is t and the variable `buffer-file-name' is non-nil 2114If DEDICATED is t returns a string with the form
2091returns a string with the form 2115`python-shell-buffer-name'[`buffer-name'] else returns the value
2092`python-shell-buffer-name'[variable `buffer-file-name'] else 2116of `python-shell-buffer-name'."
2093returns the value of `python-shell-buffer-name'." 2117 (if dedicated
2094 (let ((process-name 2118 (format "%s[%s]" python-shell-buffer-name (buffer-name))
2095 (if (and dedicated 2119 python-shell-buffer-name))
2096 buffer-file-name)
2097 (format "%s[%s]" python-shell-buffer-name buffer-file-name)
2098 (format "%s" python-shell-buffer-name))))
2099 process-name))
2100 2120
2101(defun python-shell-internal-get-process-name () 2121(defun python-shell-internal-get-process-name ()
2102 "Calculate the appropriate process name for Internal Python process. 2122 "Calculate the appropriate process name for Internal Python process.
2103The name is calculated from `python-shell-global-buffer-name' and 2123The name is calculated from `python-shell-global-buffer-name' and
2104a hash of all relevant global shell settings in order to ensure 2124the `buffer-name'."
2105uniqueness for different types of configurations." 2125 (format "%s[%s]" python-shell-internal-buffer-name (buffer-name)))
2106 (format "%s [%s]"
2107 python-shell-internal-buffer-name
2108 (md5
2109 (concat
2110 python-shell-interpreter
2111 python-shell-interpreter-args
2112 python-shell--prompt-calculated-input-regexp
2113 python-shell--prompt-calculated-output-regexp
2114 (mapconcat #'symbol-value python-shell-setup-codes "")
2115 (mapconcat #'identity python-shell-process-environment "")
2116 (mapconcat #'identity python-shell-extra-pythonpaths "")
2117 (mapconcat #'identity python-shell-exec-path "")
2118 (or python-shell-virtualenv-root "")
2119 (mapconcat #'identity python-shell-exec-path "")))))
2120 2126
2121(defun python-shell-calculate-command () 2127(defun python-shell-calculate-command ()
2122 "Calculate the string used to execute the inferior Python process." 2128 "Calculate the string used to execute the inferior Python process."
@@ -2256,11 +2262,9 @@ Avoids `recenter' calls until OUTPUT is completely sent."
2256 "Execute the forms in BODY with the shell buffer temporarily current. 2262 "Execute the forms in BODY with the shell buffer temporarily current.
2257Signals an error if no shell buffer is available for current buffer." 2263Signals an error if no shell buffer is available for current buffer."
2258 (declare (indent 0) (debug t)) 2264 (declare (indent 0) (debug t))
2259 (let ((shell-buffer (make-symbol "shell-buffer"))) 2265 (let ((shell-process (make-symbol "shell-process")))
2260 `(let ((,shell-buffer (python-shell-get-buffer))) 2266 `(let ((,shell-process (python-shell-get-process-or-error)))
2261 (when (not ,shell-buffer) 2267 (with-current-buffer (process-buffer ,shell-process)
2262 (error "No inferior Python buffer available."))
2263 (with-current-buffer ,shell-buffer
2264 ,@body)))) 2268 ,@body))))
2265 2269
2266(defvar python-shell--font-lock-buffer nil) 2270(defvar python-shell--font-lock-buffer nil)
@@ -2472,12 +2476,12 @@ variable.
2472 (python-shell-accept-process-output 2476 (python-shell-accept-process-output
2473 (get-buffer-process (current-buffer)))) 2477 (get-buffer-process (current-buffer))))
2474 2478
2475(defun python-shell-make-comint (cmd proc-name &optional pop internal) 2479(defun python-shell-make-comint (cmd proc-name &optional show internal)
2476 "Create a Python shell comint buffer. 2480 "Create a Python shell comint buffer.
2477CMD is the Python command to be executed and PROC-NAME is the 2481CMD is the Python command to be executed and PROC-NAME is the
2478process name the comint buffer will get. After the comint buffer 2482process name the comint buffer will get. After the comint buffer
2479is created the `inferior-python-mode' is activated. When 2483is created the `inferior-python-mode' is activated. When
2480optional argument POP is non-nil the buffer is shown. When 2484optional argument SHOW is non-nil the buffer is shown. When
2481optional argument INTERNAL is non-nil this process is run on a 2485optional argument INTERNAL is non-nil this process is run on a
2482buffer with a name that starts with a space, following the Emacs 2486buffer with a name that starts with a space, following the Emacs
2483convention for temporary/internal buffers, and also makes sure 2487convention for temporary/internal buffers, and also makes sure
@@ -2506,16 +2510,13 @@ killed."
2506 (mapconcat #'identity args " "))) 2510 (mapconcat #'identity args " ")))
2507 (with-current-buffer buffer 2511 (with-current-buffer buffer
2508 (inferior-python-mode)) 2512 (inferior-python-mode))
2509 (and pop (pop-to-buffer buffer t)) 2513 (when show (display-buffer buffer))
2510 (and internal (set-process-query-on-exit-flag process nil)))) 2514 (and internal (set-process-query-on-exit-flag process nil))))
2511 proc-buffer-name))) 2515 proc-buffer-name)))
2512 2516
2513;;;###autoload 2517;;;###autoload
2514(defun run-python (&optional cmd dedicated show) 2518(defun run-python (&optional cmd dedicated show)
2515 "Run an inferior Python process. 2519 "Run an inferior Python process.
2516Input and output via buffer named after
2517`python-shell-buffer-name'. If there is a process already
2518running in that buffer, just switch to it.
2519 2520
2520Argument CMD defaults to `python-shell-calculate-command' return 2521Argument CMD defaults to `python-shell-calculate-command' return
2521value. When called interactively with `prefix-arg', it allows 2522value. When called interactively with `prefix-arg', it allows
@@ -2523,6 +2524,11 @@ the user to edit such value and choose whether the interpreter
2523should be DEDICATED for the current buffer. When numeric prefix 2524should be DEDICATED for the current buffer. When numeric prefix
2524arg is other than 0 or 4 do not SHOW. 2525arg is other than 0 or 4 do not SHOW.
2525 2526
2527For a given buffer and same values of DEDICATED, if a process is
2528already running for it, it will do nothing. This means that if
2529the current buffer is using a global process, the user is still
2530able to switch it to use a dedicated one.
2531
2526Runs the hook `inferior-python-mode-hook' after 2532Runs the hook `inferior-python-mode-hook' after
2527`comint-mode-hook' is run. (Type \\[describe-mode] in the 2533`comint-mode-hook' is run. (Type \\[describe-mode] in the
2528process buffer for a list of commands.)" 2534process buffer for a list of commands.)"
@@ -2533,10 +2539,10 @@ process buffer for a list of commands.)"
2533 (y-or-n-p "Make dedicated process? ") 2539 (y-or-n-p "Make dedicated process? ")
2534 (= (prefix-numeric-value current-prefix-arg) 4)) 2540 (= (prefix-numeric-value current-prefix-arg) 4))
2535 (list (python-shell-calculate-command) nil t))) 2541 (list (python-shell-calculate-command) nil t)))
2536 (python-shell-make-comint 2542 (get-buffer-process
2537 (or cmd (python-shell-calculate-command)) 2543 (python-shell-make-comint
2538 (python-shell-get-process-name dedicated) show) 2544 (or cmd (python-shell-calculate-command))
2539 dedicated) 2545 (python-shell-get-process-name dedicated) show)))
2540 2546
2541(defun run-python-internal () 2547(defun run-python-internal ()
2542 "Run an inferior Internal Python process. 2548 "Run an inferior Internal Python process.
@@ -2579,6 +2585,21 @@ If current buffer is in `inferior-python-mode', return it."
2579 "Return inferior Python process for current buffer." 2585 "Return inferior Python process for current buffer."
2580 (get-buffer-process (python-shell-get-buffer))) 2586 (get-buffer-process (python-shell-get-buffer)))
2581 2587
2588(defun python-shell-get-process-or-error (&optional interactivep)
2589 "Return inferior Python process for current buffer or signal error.
2590When argument INTERACTIVEP is non-nil, use `user-error' instead
2591of `error' with a user-friendly message."
2592 (or (python-shell-get-process)
2593 (if interactivep
2594 (user-error
2595 "Start a Python process first with `M-x run-python' or `%s'."
2596 ;; Get the binding.
2597 (key-description
2598 (where-is-internal
2599 #'run-python overriding-local-map t)))
2600 (error
2601 "No inferior Python process running."))))
2602
2582(defun python-shell-get-or-create-process (&optional cmd dedicated show) 2603(defun python-shell-get-or-create-process (&optional cmd dedicated show)
2583 "Get or create an inferior Python process for current buffer and return it. 2604 "Get or create an inferior Python process for current buffer and return it.
2584Arguments CMD, DEDICATED and SHOW are those of `run-python' and 2605Arguments CMD, DEDICATED and SHOW are those of `run-python' and
@@ -2594,6 +2615,11 @@ be asked for their values."
2594 (run-python cmd dedicated show))) 2615 (run-python cmd dedicated show)))
2595 (or shell-process (python-shell-get-process)))) 2616 (or shell-process (python-shell-get-process))))
2596 2617
2618(make-obsolete
2619 #'python-shell-get-or-create-process
2620 "Instead call `python-shell-get-process' and create one if returns nil."
2621 "25.1")
2622
2597(defvar python-shell-internal-buffer nil 2623(defvar python-shell-internal-buffer nil
2598 "Current internal shell buffer for the current buffer. 2624 "Current internal shell buffer for the current buffer.
2599This is really not necessary at all for the code to work but it's 2625This is really not necessary at all for the code to work but it's
@@ -2606,12 +2632,10 @@ there for compatibility with CEDET.")
2606 2632
2607(defun python-shell-internal-get-or-create-process () 2633(defun python-shell-internal-get-or-create-process ()
2608 "Get or create an inferior Internal Python process." 2634 "Get or create an inferior Internal Python process."
2609 (let* ((proc-name (python-shell-internal-get-process-name)) 2635 (let ((proc-name (python-shell-internal-get-process-name)))
2610 (proc-buffer-name (format " *%s*" proc-name))) 2636 (if (process-live-p proc-name)
2611 (when (not (process-live-p proc-name)) 2637 (get-process proc-name)
2612 (run-python-internal) 2638 (run-python-internal))))
2613 (setq python-shell-internal-buffer proc-buffer-name))
2614 (get-buffer-process proc-buffer-name)))
2615 2639
2616(define-obsolete-function-alias 2640(define-obsolete-function-alias
2617 'python-proc 'python-shell-internal-get-or-create-process "24.3") 2641 'python-proc 'python-shell-internal-get-or-create-process "24.3")
@@ -2628,20 +2652,24 @@ there for compatibility with CEDET.")
2628 (concat (file-remote-p default-directory) "/tmp") 2652 (concat (file-remote-p default-directory) "/tmp")
2629 temporary-file-directory)) 2653 temporary-file-directory))
2630 (temp-file-name (make-temp-file "py")) 2654 (temp-file-name (make-temp-file "py"))
2631 (coding-system-for-write 'utf-8)) 2655 (coding-system-for-write (python-info-encoding)))
2632 (with-temp-file temp-file-name 2656 (with-temp-file temp-file-name
2633 (insert "# -*- coding: utf-8 -*-\n") ;Not needed for Python-3.
2634 (insert string) 2657 (insert string)
2635 (delete-trailing-whitespace)) 2658 (delete-trailing-whitespace))
2636 temp-file-name)) 2659 temp-file-name))
2637 2660
2638(defun python-shell-send-string (string &optional process) 2661(defun python-shell-send-string (string &optional process msg)
2639 "Send STRING to inferior Python PROCESS." 2662 "Send STRING to inferior Python PROCESS.
2640 (interactive "sPython command: ") 2663When optional argument MSG is non-nil, forces display of a
2641 (let ((process (or process (python-shell-get-or-create-process)))) 2664user-friendly message if there's no process running; defaults to
2665t when called interactively."
2666 (interactive
2667 (list (read-string "Python command: ") nil t))
2668 (let ((process (or process (python-shell-get-process-or-error msg))))
2642 (if (string-match ".\n+." string) ;Multiline. 2669 (if (string-match ".\n+." string) ;Multiline.
2643 (let* ((temp-file-name (python-shell--save-temp-file string))) 2670 (let* ((temp-file-name (python-shell--save-temp-file string))
2644 (python-shell-send-file temp-file-name process temp-file-name t)) 2671 (file-name (or (buffer-file-name) temp-file-name)))
2672 (python-shell-send-file file-name process temp-file-name t))
2645 (comint-send-string process string) 2673 (comint-send-string process string)
2646 (when (or (not (string-match "\n\\'" string)) 2674 (when (or (not (string-match "\n\\'" string))
2647 (string-match "\n[ \t].*\n?\\'" string)) 2675 (string-match "\n[ \t].*\n?\\'" string))
@@ -2680,7 +2708,7 @@ detecting a prompt at the end of the buffer."
2680(defun python-shell-send-string-no-output (string &optional process) 2708(defun python-shell-send-string-no-output (string &optional process)
2681 "Send STRING to PROCESS and inhibit output. 2709 "Send STRING to PROCESS and inhibit output.
2682Return the output." 2710Return the output."
2683 (let ((process (or process (python-shell-get-or-create-process))) 2711 (let ((process (or process (python-shell-get-process-or-error)))
2684 (comint-preoutput-filter-functions 2712 (comint-preoutput-filter-functions
2685 '(python-shell-output-filter)) 2713 '(python-shell-output-filter))
2686 (python-shell-output-filter-in-progress t) 2714 (python-shell-output-filter-in-progress t)
@@ -2717,12 +2745,6 @@ Returns the output. See `python-shell-send-string-no-output'."
2717(define-obsolete-function-alias 2745(define-obsolete-function-alias
2718 'python-send-string 'python-shell-internal-send-string "24.3") 2746 'python-send-string 'python-shell-internal-send-string "24.3")
2719 2747
2720(defvar python--use-fake-loc nil
2721 "If non-nil, use `compilation-fake-loc' to trace errors back to the buffer.
2722If nil, regions of text are prepended by the corresponding number of empty
2723lines and Python is told to output error messages referring to the whole
2724source file.")
2725
2726(defun python-shell-buffer-substring (start end &optional nomain) 2748(defun python-shell-buffer-substring (start end &optional nomain)
2727 "Send buffer substring from START to END formatted for shell. 2749 "Send buffer substring from START to END formatted for shell.
2728This is a wrapper over `buffer-substring' that takes care of 2750This is a wrapper over `buffer-substring' that takes care of
@@ -2732,27 +2754,32 @@ the python shell:
2732 \"if __name__ == '__main__'\" block will be removed. 2754 \"if __name__ == '__main__'\" block will be removed.
2733 2. When a subregion of the buffer is sent, it takes care of 2755 2. When a subregion of the buffer is sent, it takes care of
2734 appending extra empty lines so tracebacks are correct. 2756 appending extra empty lines so tracebacks are correct.
2735 3. Wraps indented regions under an \"if True:\" block so the 2757 3. When the region sent is a substring of the current buffer, a
2758 coding cookie is added.
2759 4. Wraps indented regions under an \"if True:\" block so the
2736 interpreter evaluates them correctly." 2760 interpreter evaluates them correctly."
2737 (let ((substring (buffer-substring-no-properties start end)) 2761 (let* ((substring (buffer-substring-no-properties start end))
2738 (fillstr (unless python--use-fake-loc 2762 (starts-at-point-min-p (save-restriction
2739 (make-string (1- (line-number-at-pos start)) ?\n))) 2763 (widen)
2740 (toplevel-block-p (save-excursion 2764 (= (point-min) start)))
2741 (goto-char start) 2765 (encoding (python-info-encoding))
2742 (or (zerop (line-number-at-pos start)) 2766 (fillstr (when (not starts-at-point-min-p)
2743 (progn 2767 (concat
2744 (python-util-forward-comment 1) 2768 (format "# -*- coding: %s -*-\n" encoding)
2745 (zerop (current-indentation))))))) 2769 (make-string
2770 ;; Substract 2 because of the coding cookie.
2771 (- (line-number-at-pos start) 2) ?\n))))
2772 (toplevel-block-p (save-excursion
2773 (goto-char start)
2774 (or (zerop (line-number-at-pos start))
2775 (progn
2776 (python-util-forward-comment 1)
2777 (zerop (current-indentation)))))))
2746 (with-temp-buffer 2778 (with-temp-buffer
2747 (python-mode) 2779 (python-mode)
2748 (if fillstr (insert fillstr)) 2780 (if fillstr (insert fillstr))
2749 (insert substring) 2781 (insert substring)
2750 (goto-char (point-min)) 2782 (goto-char (point-min))
2751 (unless python--use-fake-loc
2752 ;; python-shell--save-temp-file adds an extra coding line, which would
2753 ;; throw off the line-counts, so let's try to compensate here.
2754 (if (looking-at "[ \t]*[#\n]")
2755 (delete-region (point) (line-beginning-position 2))))
2756 (when (not toplevel-block-p) 2783 (when (not toplevel-block-p)
2757 (insert "if True:") 2784 (insert "if True:")
2758 (delete-region (point) (line-end-position))) 2785 (delete-region (point) (line-end-position)))
@@ -2763,53 +2790,65 @@ the python shell:
2763 (when (python-nav-if-name-main) 2790 (when (python-nav-if-name-main)
2764 (cons (point) 2791 (cons (point)
2765 (progn (python-nav-forward-sexp-safe) 2792 (progn (python-nav-forward-sexp-safe)
2793 ;; Include ending newline
2794 (forward-line 1)
2766 (point))))))) 2795 (point)))))))
2767 ;; Oh destructuring bind, how I miss you. 2796 ;; Oh destructuring bind, how I miss you.
2768 (if-name-main-start (car if-name-main-start-end)) 2797 (if-name-main-start (car if-name-main-start-end))
2769 (if-name-main-end (cdr if-name-main-start-end))) 2798 (if-name-main-end (cdr if-name-main-start-end))
2799 (fillstr (make-string
2800 (- (line-number-at-pos if-name-main-end)
2801 (line-number-at-pos if-name-main-start)) ?\n)))
2770 (when if-name-main-start-end 2802 (when if-name-main-start-end
2771 (goto-char if-name-main-start) 2803 (goto-char if-name-main-start)
2772 (delete-region if-name-main-start if-name-main-end) 2804 (delete-region if-name-main-start if-name-main-end)
2773 (insert 2805 (insert fillstr))))
2774 (make-string 2806 ;; Ensure there's only one coding cookie in the generated string.
2775 (- (line-number-at-pos if-name-main-end) 2807 (goto-char (point-min))
2776 (line-number-at-pos if-name-main-start)) ?\n))))) 2808 (when (looking-at-p (python-rx coding-cookie))
2809 (forward-line 1)
2810 (when (looking-at-p (python-rx coding-cookie))
2811 (delete-region
2812 (line-beginning-position) (line-end-position))))
2777 (buffer-substring-no-properties (point-min) (point-max))))) 2813 (buffer-substring-no-properties (point-min) (point-max)))))
2778 2814
2779(declare-function compilation-fake-loc "compile" 2815(defun python-shell-send-region (start end &optional send-main msg)
2780 (marker file &optional line col)) 2816 "Send the region delimited by START and END to inferior Python process.
2781 2817When optional argument SEND-MAIN is non-nil, allow execution of
2782(defun python-shell-send-region (start end &optional nomain) 2818code inside blocks delimited by \"if __name__== '__main__':\".
2783 "Send the region delimited by START and END to inferior Python process." 2819When called interactively SEND-MAIN defaults to nil, unless it's
2784 (interactive "r") 2820called with prefix argument. When optional argument MSG is
2785 (let* ((python--use-fake-loc 2821non-nil, forces display of a user-friendly message if there's no
2786 (or python--use-fake-loc (not buffer-file-name))) 2822process running; defaults to t when called interactively."
2787 (string (python-shell-buffer-substring start end nomain)) 2823 (interactive
2788 (process (python-shell-get-or-create-process)) 2824 (list (region-beginning) (region-end) current-prefix-arg t))
2789 (_ (string-match "\\`\n*\\(.*\\)" string))) 2825 (let* ((string (python-shell-buffer-substring start end (not send-main)))
2790 (message "Sent: %s..." (match-string 1 string)) 2826 (process (python-shell-get-process-or-error msg))
2791 (let* ((temp-file-name (python-shell--save-temp-file string)) 2827 (original-string (buffer-substring-no-properties start end))
2792 (file-name (or (buffer-file-name) temp-file-name))) 2828 (_ (string-match "\\`\n*\\(.*\\)" original-string)))
2793 (python-shell-send-file file-name process temp-file-name t) 2829 (message "Sent: %s..." (match-string 1 original-string))
2794 (unless python--use-fake-loc 2830 (python-shell-send-string string process)))
2795 (with-current-buffer (process-buffer process) 2831
2796 (compilation-fake-loc (copy-marker start) temp-file-name 2832(defun python-shell-send-buffer (&optional send-main msg)
2797 2)) ;; Not 1, because of the added coding line.
2798 ))))
2799
2800(defun python-shell-send-buffer (&optional arg)
2801 "Send the entire buffer to inferior Python process. 2833 "Send the entire buffer to inferior Python process.
2802With prefix ARG allow execution of code inside blocks delimited 2834When optional argument SEND-MAIN is non-nil, allow execution of
2803by \"if __name__== '__main__':\"." 2835code inside blocks delimited by \"if __name__== '__main__':\".
2804 (interactive "P") 2836When called interactively SEND-MAIN defaults to nil, unless it's
2837called with prefix argument. When optional argument MSG is
2838non-nil, forces display of a user-friendly message if there's no
2839process running; defaults to t when called interactively."
2840 (interactive (list current-prefix-arg t))
2805 (save-restriction 2841 (save-restriction
2806 (widen) 2842 (widen)
2807 (python-shell-send-region (point-min) (point-max) (not arg)))) 2843 (python-shell-send-region (point-min) (point-max) send-main msg)))
2808 2844
2809(defun python-shell-send-defun (arg) 2845(defun python-shell-send-defun (&optional arg msg)
2810 "Send the current defun to inferior Python process. 2846 "Send the current defun to inferior Python process.
2811When argument ARG is non-nil do not include decorators." 2847When argument ARG is non-nil do not include decorators. When
2812 (interactive "P") 2848optional argument MSG is non-nil, forces display of a
2849user-friendly message if there's no process running; defaults to
2850t when called interactively."
2851 (interactive (list current-prefix-arg t))
2813 (save-excursion 2852 (save-excursion
2814 (python-shell-send-region 2853 (python-shell-send-region
2815 (progn 2854 (progn
@@ -2825,42 +2864,60 @@ When argument ARG is non-nil do not include decorators."
2825 (progn 2864 (progn
2826 (or (python-nav-end-of-defun) 2865 (or (python-nav-end-of-defun)
2827 (end-of-line 1)) 2866 (end-of-line 1))
2828 (point-marker))))) 2867 (point-marker))
2868 nil ;; noop
2869 msg)))
2829 2870
2830(defun python-shell-send-file (file-name &optional process temp-file-name 2871(defun python-shell-send-file (file-name &optional process temp-file-name
2831 delete) 2872 delete msg)
2832 "Send FILE-NAME to inferior Python PROCESS. 2873 "Send FILE-NAME to inferior Python PROCESS.
2833If TEMP-FILE-NAME is passed then that file is used for processing 2874If TEMP-FILE-NAME is passed then that file is used for processing
2834instead, while internally the shell will continue to use FILE-NAME. 2875instead, while internally the shell will continue to use
2835If DELETE is non-nil, delete the file afterwards." 2876FILE-NAME. If TEMP-FILE-NAME and DELETE are non-nil, then
2836 (interactive "fFile to send: ") 2877TEMP-FILE-NAME is deleted after evaluation is performed. When
2837 (let* ((process (or process (python-shell-get-or-create-process))) 2878optional argument MSG is non-nil, forces display of a
2879user-friendly message if there's no process running; defaults to
2880t when called interactively."
2881 (interactive
2882 (list
2883 (read-file-name "File to send: ") ; file-name
2884 nil ; process
2885 nil ; temp-file-name
2886 nil ; delete
2887 t)) ; msg
2888 (let* ((process (or process (python-shell-get-process-or-error msg)))
2889 (encoding (with-temp-buffer
2890 (insert-file-contents
2891 (or temp-file-name file-name))
2892 (python-info-encoding)))
2893 (file-name (expand-file-name
2894 (or (file-remote-p file-name 'localname)
2895 file-name)))
2838 (temp-file-name (when temp-file-name 2896 (temp-file-name (when temp-file-name
2839 (expand-file-name 2897 (expand-file-name
2840 (or (file-remote-p temp-file-name 'localname) 2898 (or (file-remote-p temp-file-name 'localname)
2841 temp-file-name)))) 2899 temp-file-name)))))
2842 (file-name (or (when file-name
2843 (expand-file-name
2844 (or (file-remote-p file-name 'localname)
2845 file-name)))
2846 temp-file-name)))
2847 (when (not file-name)
2848 (error "If FILE-NAME is nil then TEMP-FILE-NAME must be non-nil"))
2849 (python-shell-send-string 2900 (python-shell-send-string
2850 (format 2901 (format
2851 (concat "__pyfile = open('''%s''');" 2902 (concat
2852 "exec(compile(__pyfile.read(), '''%s''', 'exec'));" 2903 "import codecs, os;"
2853 "__pyfile.close()%s") 2904 "__pyfile = codecs.open('''%s''', encoding='''%s''');"
2854 (or temp-file-name file-name) file-name 2905 "__code = __pyfile.read().encode('''%s''');"
2855 (if delete (format "; import os; os.remove('''%s''')" 2906 "__pyfile.close();"
2856 (or temp-file-name file-name)) 2907 (when (and delete temp-file-name)
2857 "")) 2908 (format "os.remove('''%s''');" temp-file-name))
2909 "exec(compile(__code, '''%s''', 'exec'));")
2910 (or temp-file-name file-name) encoding encoding file-name)
2858 process))) 2911 process)))
2859 2912
2860(defun python-shell-switch-to-shell () 2913(defun python-shell-switch-to-shell (&optional msg)
2861 "Switch to inferior Python process buffer." 2914 "Switch to inferior Python process buffer.
2862 (interactive) 2915When optional argument MSG is non-nil, forces display of a
2863 (process-buffer (python-shell-get-or-create-process)) t) 2916user-friendly message if there's no process running; defaults to
2917t when called interactively."
2918 (interactive "p")
2919 (pop-to-buffer
2920 (process-buffer (python-shell-get-process-or-error msg)) nil t))
2864 2921
2865(defun python-shell-send-setup-code () 2922(defun python-shell-send-setup-code ()
2866 "Send all setup code for shell. 2923 "Send all setup code for shell.
@@ -2947,6 +3004,194 @@ the full statement in the case of imports."
2947 "25.1" 3004 "25.1"
2948 "Completion string code must work for (i)pdb.") 3005 "Completion string code must work for (i)pdb.")
2949 3006
3007(defcustom python-shell-completion-native-disabled-interpreters
3008 ;; PyPy's readline cannot handle some escape sequences yet.
3009 (list "pypy")
3010 "List of disabled interpreters.
3011When a match is found, native completion is disabled."
3012 :type '(repeat string))
3013
3014(defcustom python-shell-completion-native-enable t
3015 "Enable readline based native completion."
3016 :type 'boolean)
3017
3018(defcustom python-shell-completion-native-output-timeout 0.01
3019 "Time in seconds to wait for completion output before giving up."
3020 :type 'float)
3021
3022(defvar python-shell-completion-native-redirect-buffer
3023 " *Python completions redirect*"
3024 "Buffer to be used to redirect output of readline commands.")
3025
3026(defun python-shell-completion-native-interpreter-disabled-p ()
3027 "Return non-nil if interpreter has native completion disabled."
3028 (when python-shell-completion-native-disabled-interpreters
3029 (string-match
3030 (regexp-opt python-shell-completion-native-disabled-interpreters)
3031 (file-name-nondirectory python-shell-interpreter))))
3032
3033(defun python-shell-completion-native-try ()
3034 "Return non-nil if can trigger native completion."
3035 (let ((python-shell-completion-native-enable t))
3036 (python-shell-completion-native-get-completions
3037 (get-buffer-process (current-buffer))
3038 nil "int")))
3039
3040(defun python-shell-completion-native-setup ()
3041 "Try to setup native completion, return non-nil on success."
3042 (let ((process (python-shell-get-process)))
3043 (python-shell-send-string
3044 (funcall
3045 'mapconcat
3046 #'identity
3047 (list
3048 "try:"
3049 " import readline, rlcompleter"
3050 ;; Remove parens on callables as it breaks completion on
3051 ;; arguments (e.g. str(Ari<tab>)).
3052 " class Completer(rlcompleter.Completer):"
3053 " def _callable_postfix(self, val, word):"
3054 " return word"
3055 " readline.set_completer(Completer().complete)"
3056 " if readline.__doc__ and 'libedit' in readline.__doc__:"
3057 " readline.parse_and_bind('bind ^I rl_complete')"
3058 " else:"
3059 " readline.parse_and_bind('tab: complete')"
3060 " print ('python.el: readline is available')"
3061 "except:"
3062 " print ('python.el: readline not available')")
3063 "\n")
3064 process)
3065 (python-shell-accept-process-output process)
3066 (when (save-excursion
3067 (re-search-backward
3068 (regexp-quote "python.el: readline is available") nil t 1))
3069 (python-shell-completion-native-try))))
3070
3071(defun python-shell-completion-native-turn-off (&optional msg)
3072 "Turn off shell native completions.
3073With argument MSG show deactivation message."
3074 (interactive "p")
3075 (python-shell-with-shell-buffer
3076 (set (make-local-variable 'python-shell-completion-native-enable) nil)
3077 (when msg
3078 (message "Shell native completion is disabled, using fallback"))))
3079
3080(defun python-shell-completion-native-turn-on (&optional msg)
3081 "Turn on shell native completions.
3082With argument MSG show deactivation message."
3083 (interactive "p")
3084 (python-shell-with-shell-buffer
3085 (set (make-local-variable 'python-shell-completion-native-enable) t)
3086 (python-shell-completion-native-turn-on-maybe msg)))
3087
3088(defun python-shell-completion-native-turn-on-maybe (&optional msg)
3089 "Turn on native completions if enabled and available.
3090With argument MSG show activation/deactivation message."
3091 (interactive "p")
3092 (python-shell-with-shell-buffer
3093 (when python-shell-completion-native-enable
3094 (cond
3095 ((python-shell-completion-native-interpreter-disabled-p)
3096 (python-shell-completion-native-turn-off msg))
3097 ((python-shell-completion-native-setup)
3098 (when msg
3099 (message "Shell native completion is enabled.")))
3100 (t (lwarn
3101 '(python python-shell-completion-native-turn-on-maybe)
3102 :warning
3103 (concat
3104 "Your `python-shell-interpreter' doesn't seem to "
3105 "support readline, yet `python-shell-completion-native' "
3106 (format "was `t' and %S is not part of the "
3107 (file-name-nondirectory python-shell-interpreter))
3108 "`python-shell-completion-native-disabled-interpreters' "
3109 "list. Native completions have been disabled locally. "))
3110 (python-shell-completion-native-turn-off msg))))))
3111
3112(defun python-shell-completion-native-turn-on-maybe-with-msg ()
3113 "Like `python-shell-completion-native-turn-on-maybe' but force messages."
3114 (python-shell-completion-native-turn-on-maybe t))
3115
3116(add-hook 'inferior-python-mode-hook
3117 #'python-shell-completion-native-turn-on-maybe-with-msg)
3118
3119(defun python-shell-completion-native-toggle (&optional msg)
3120 "Toggle shell native completion.
3121With argument MSG show activation/deactivation message."
3122 (interactive "p")
3123 (python-shell-with-shell-buffer
3124 (if python-shell-completion-native-enable
3125 (python-shell-completion-native-turn-off msg)
3126 (python-shell-completion-native-turn-on msg))
3127 python-shell-completion-native-enable))
3128
3129(defun python-shell-completion-native-get-completions (process import input)
3130 "Get completions using native readline for PROCESS.
3131When IMPORT is non-nil takes precedence over INPUT for
3132completion."
3133 (when (and python-shell-completion-native-enable
3134 (python-util-comint-last-prompt)
3135 (>= (point) (cdr (python-util-comint-last-prompt))))
3136 (let* ((input (or import input))
3137 (original-filter-fn (process-filter process))
3138 (redirect-buffer (get-buffer-create
3139 python-shell-completion-native-redirect-buffer))
3140 (separators (python-rx
3141 (or whitespace open-paren close-paren)))
3142 (trigger "\t\t\t")
3143 (new-input (concat input trigger))
3144 (input-length
3145 (save-excursion
3146 (+ (- (point-max) (comint-bol)) (length new-input))))
3147 (delete-line-command (make-string input-length ?\b))
3148 (input-to-send (concat new-input delete-line-command)))
3149 ;; Ensure restoring the process filter, even if the user quits
3150 ;; or there's some other error.
3151 (unwind-protect
3152 (with-current-buffer redirect-buffer
3153 ;; Cleanup the redirect buffer
3154 (delete-region (point-min) (point-max))
3155 ;; Mimic `comint-redirect-send-command', unfortunately it
3156 ;; can't be used here because it expects a newline in the
3157 ;; command and that's exactly what we are trying to avoid.
3158 (let ((comint-redirect-echo-input nil)
3159 (comint-redirect-verbose nil)
3160 (comint-redirect-perform-sanity-check nil)
3161 (comint-redirect-insert-matching-regexp nil)
3162 ;; Feed it some regex that will never match.
3163 (comint-redirect-finished-regexp "^\\'$")
3164 (comint-redirect-output-buffer redirect-buffer))
3165 ;; Compatibility with Emacs 24.x. Comint changed and
3166 ;; now `comint-redirect-filter' gets 3 args. This
3167 ;; checks which version of `comint-redirect-filter' is
3168 ;; in use based on its args and uses `apply-partially'
3169 ;; to make it up for the 3 args case.
3170 (if (= (length
3171 (help-function-arglist 'comint-redirect-filter)) 3)
3172 (set-process-filter
3173 process (apply-partially
3174 #'comint-redirect-filter original-filter-fn))
3175 (set-process-filter process #'comint-redirect-filter))
3176 (process-send-string process input-to-send)
3177 (accept-process-output
3178 process
3179 python-shell-completion-native-output-timeout)
3180 ;; XXX: can't use `python-shell-accept-process-output'
3181 ;; here because there are no guarantees on how output
3182 ;; ends. The workaround here is to call
3183 ;; `accept-process-output' until we don't find anything
3184 ;; else to accept.
3185 (while (accept-process-output
3186 process
3187 python-shell-completion-native-output-timeout))
3188 (cl-remove-duplicates
3189 (split-string
3190 (buffer-substring-no-properties
3191 (point-min) (point-max))
3192 separators t))))
3193 (set-process-filter process original-filter-fn)))))
3194
2950(defun python-shell-completion-get-completions (process import input) 3195(defun python-shell-completion-get-completions (process import input)
2951 "Do completion at point using PROCESS for IMPORT or INPUT. 3196 "Do completion at point using PROCESS for IMPORT or INPUT.
2952When IMPORT is non-nil takes precedence over INPUT for 3197When IMPORT is non-nil takes precedence over INPUT for
@@ -3004,11 +3249,15 @@ using that one instead of current buffer's process."
3004 last-prompt-end 3249 last-prompt-end
3005 (forward-char (length (match-string-no-properties 0))) 3250 (forward-char (length (match-string-no-properties 0)))
3006 (point)))) 3251 (point))))
3007 (end (point))) 3252 (end (point))
3253 (completion-fn
3254 (if python-shell-completion-native-enable
3255 #'python-shell-completion-native-get-completions
3256 #'python-shell-completion-get-completions)))
3008 (list start end 3257 (list start end
3009 (completion-table-dynamic 3258 (completion-table-dynamic
3010 (apply-partially 3259 (apply-partially
3011 #'python-shell-completion-get-completions 3260 completion-fn
3012 process import-statement))))) 3261 process import-statement)))))
3013 3262
3014(define-obsolete-function-alias 3263(define-obsolete-function-alias
@@ -4155,6 +4404,32 @@ operator."
4155 (* whitespace) line-end)) 4404 (* whitespace) line-end))
4156 (string-equal "" (match-string-no-properties 1)))) 4405 (string-equal "" (match-string-no-properties 1))))
4157 4406
4407(defun python-info-encoding-from-cookie ()
4408 "Detect current buffer's encoding from its coding cookie.
4409Returns the enconding as a symbol."
4410 (let ((first-two-lines
4411 (save-excursion
4412 (save-restriction
4413 (widen)
4414 (goto-char (point-min))
4415 (forward-line 2)
4416 (buffer-substring-no-properties
4417 (point)
4418 (point-min))))))
4419 (when (string-match (python-rx coding-cookie) first-two-lines)
4420 (intern (match-string-no-properties 1 first-two-lines)))))
4421
4422(defun python-info-encoding ()
4423 "Return encoding for file.
4424Try `python-info-encoding-from-cookie', if none is found then
4425default to utf-8."
4426 ;; If no enconding is defined, then it's safe to use UTF-8: Python 2
4427 ;; uses ASCII as default while Python 3 uses UTF-8. This means that
4428 ;; in the worst case escenario python.el will make things work for
4429 ;; Python 2 files with unicode data and no encoding defined.
4430 (or (python-info-encoding-from-cookie)
4431 'utf-8))
4432
4158 4433
4159;;; Utility functions 4434;;; Utility functions
4160 4435
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index 524749d6266..904e9dfc289 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -2374,7 +2374,7 @@ Calls the value of `sh-set-shell-hook' if set."
2374 (sh-make-vars-local)) 2374 (sh-make-vars-local))
2375 (message "Indentation setup for shell type %s" sh-shell)) 2375 (message "Indentation setup for shell type %s" sh-shell))
2376 (message "No indentation for this shell type.") 2376 (message "No indentation for this shell type.")
2377 (setq indent-line-function 'sh-basic-indent-line)) 2377 (setq-local indent-line-function 'sh-basic-indent-line))
2378 (when font-lock-mode 2378 (when font-lock-mode
2379 (setq font-lock-set-defaults nil) 2379 (setq font-lock-set-defaults nil)
2380 (font-lock-set-defaults) 2380 (font-lock-set-defaults)
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 21c0d6aa6a4..f3dc4bd4cfd 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -136,6 +136,31 @@ actual location is not known.")
136 136
137(defmethod xref-location-group ((_ xref-bogus-location)) "(No location)") 137(defmethod xref-location-group ((_ xref-bogus-location)) "(No location)")
138 138
139;; This should be in elisp-mode.el, but it's preloaded, and we can't
140;; preload defclass and defmethod (at least, not yet).
141(defclass xref-elisp-location (xref-location)
142 ((symbol :type symbol :initarg :symbol)
143 (type :type symbol :initarg :type)
144 (file :type string :initarg :file
145 :reader xref-location-group))
146 :documentation "Location of an Emacs Lisp symbol definition.")
147
148(defun xref-make-elisp-location (symbol type file)
149 (make-instance 'xref-elisp-location :symbol symbol :type type :file file))
150
151(defmethod xref-location-marker ((l xref-elisp-location))
152 (with-slots (symbol type file) l
153 (let ((buffer-point
154 (pcase type
155 (`defun (find-function-search-for-symbol symbol nil file))
156 ((or `defvar `defface)
157 (find-function-search-for-symbol symbol type file))
158 (`feature
159 (cons (find-file-noselect file) 1)))))
160 (with-current-buffer (car buffer-point)
161 (goto-char (or (cdr buffer-point) (point-min)))
162 (point-marker)))))
163
139 164
140;;; Cross-reference 165;;; Cross-reference
141 166
@@ -442,7 +467,8 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
442;;;###autoload 467;;;###autoload
443(defun xref-find-definitions (identifier) 468(defun xref-find-definitions (identifier)
444 "Find the definition of the identifier at point. 469 "Find the definition of the identifier at point.
445With prefix argument, prompt for the identifier." 470With prefix argument or when there's no identifier at point,
471prompt for it."
446 (interactive (list (xref--read-identifier "Find definitions of: "))) 472 (interactive (list (xref--read-identifier "Find definitions of: ")))
447 (xref--find-definitions identifier nil)) 473 (xref--find-definitions identifier nil))
448 474