6

The command xref-find-definitions is no longer working for me in Python buffers (with elpy-mode enabled. Its companions, such as xref-find-references, are also not working in Python buffers. Specifically, when I press M-. I get No definition found in the minibuffer. xref was previously working perfectly in Python buffers. Since it worked, I have updated my installed emacs packages, and also set up ggtags & GNU Global to work in cc-mode. Note that xref still works like a charm in elisp files (such as my .emacs file), so I believe the problem to be elpy-specific.

Due to the interaction of several packages, I am not sure how to approach debugging and resolving this issue. How do I get M-. working in Python buffers once more?

Steps to reproduce

In my_file.py write:

def func():
    print("hi")

func()

Move point to the second occurrence of func and hit M-. to receive No definition found message.

My configuration

I am running MacOS Catalina (10.15.7)

In python buffers, I have:

xref-backend-functions set to (buffer local) (elpy--xref-backend t). When I try to run, in turn, elpy--xref-backend, I learn that this function takes no arguments (though it was given one). When I run it with no arguments, I get (elpy--xref-backend) returning elpy.

Result of (elpy-config)

Elpy Configuration

Emacs.............: 26.3
Elpy..............: 1.35.0
Virtualenv........: python38 (/usr/local/Caskroom/miniconda/base/envs/python38)
Interactive Python: python 3.8.5 (/usr/local/Caskroom/miniconda/base/envs/python38/bin/python)
RPC virtualenv....: python38 (/usr/local/Caskroom/miniconda/base/envs/python38)
 Python...........: python 3.8.5 (/usr/local/Caskroom/miniconda/base/envs/python38/bin/python)
 Jedi.............: 0.18.0
 Rope.............: Not found (0.18.0 available)
 Autopep8.........: 1.5.4
 Yapf.............: 0.30.0
 Black............: 20.8b1
Syntax checker....: flake8 (/usr/local/Caskroom/miniconda/base/envs/python38/bin/flake8)

Elpy configuration in my .emacs

(use-package elpy
  ;;:diminish elpy-mode
  :ensure t
  :defer t
  :init
  (pyvenv-activate "/usr/local/Caskroom/miniconda/base/envs/python38")
  (advice-add 'python-mode :before 'elpy-enable)
  :config
  (remove-hook 'elpy-modules 'elpy-module-flymake)
  (define-key elpy-mode-map (kbd "C-c C-n") 'flycheck-next-error)
  (define-key elpy-mode-map (kbd "C-c C-p") 'flycheck-previous-error)
  (define-key elpy-mode-map (kbd "s-<down>") 'elpy-nav-forward-block)
  (define-key elpy-mode-map (kbd "s-<up>") 'elpy-nav-backward-block)
  (define-key elpy-mode-map (kbd "s-<right>") 'elpy-nav-forward-indent)
  (define-key elpy-mode-map (kbd "s-<left>") 'elpy-nav-backward-indent)
  )

And in the custom-set-variables call I have

 '(elpy-rpc-timeout 2)
 '(elpy-rpc-virtualenv-path "/usr/local/Caskroom/miniconda/base/envs/python38")

Backtrace

I used debug-on-entry on xref-find-definitions and I'm getting the following clip that will hopefully be enlightening to someone more savvy with the guts of elpy

Debugger entered--returning value: nil
  elpy-rpc--default-error-callback(((message . "Object of type PosixPath is not JSON serializable") (code . 500) (data (traceback . "Traceback (most recent call last):\n  File \"/Users/uname/.emacs.d/elpa/elpy-20201115.1811/elpy/rpc.py\", line 104, in handle_request\n    self.write_json(result=result,\n  File \"/Users/uname/.emacs.d/elpa/elpy-20201115.1811/elpy/rpc.py\", line 77, in write_json\n    self.stdout.write(json.dumps(kwargs) + \"\\n\")\n  File \"/usr/local/Caskroom/miniconda/base/envs/python38/lib/python3.8/json/__init__.py\", line 231, in dumps\n    return _default_encoder.encode(obj)\n  File \"/usr/local/Caskroom/miniconda/base/envs/python38/lib/python3.8/json/encoder.py\", line 199, in encode\n    chunks = self.iterencode(o, _one_shot=True)\n  File \"/usr/local/Caskroom/miniconda/base/envs/python38/lib/python3.8/json/encoder.py\", line 257, in iterencode\n    return _iterencode(o, 0)\n  File \"/usr/local/Caskroom/miniconda/base/envs/python38/lib/python3.8/json/encoder.py\", line 179, in default\n    raise TypeError(f'Object of type {o.__class__.__name__} '\nTypeError: Object of type PosixPath is not JSON serializable\n"))))
* elpy-rpc--call-blocking("get_definition" ("/Users/uname/tmp/tmp.py" #("def func(x):\n    return \"hi\"\n\n\ndef hello():\n    func(1)\n    return\n" 0 3 (fontified t face font-lock-keyword-face) 3 4 (fontified t) 4 8 (fontified t face font-lock-function-name-face) 8 11 (fontified t) 11 12 (fontified t composition (0 1 [32 65 57708]) prettify-symbols-start 12 prettify-symbols-end 13) 12 17 (fontified t) 17 23 (fontified t face font-lock-keyword-face) 23 24 (fontified t) 24 25 (syntax-table (15) fontified t face font-lock-string-face) 25 27 (fontified t face font-lock-string-face) 27 28 (syntax-table (15) fontified t face font-lock-string-face) 28 31 (fontified t) 31 34 (fontified t face font-lock-keyword-face) 34 35 (fontified t) 35 40 (fontified t face font-lock-function-name-face) 40 42 (fontified t) 42 43 (fontified t composition (0 1 [32 65 57708]) prettify-symbols-start 43 prettify-symbols-end 44) 43 44 (fontified t) 44 56 (fontified t) 56 60 (fontified t) 60 66 (fontified t face font-lock-keyword-face) 66 67 (fontified t)) 48))
* elpy-rpc("get_definition" ("/Users/uname/tmp/tmp.py" #("def func(x):\n    return \"hi\"\n\n\ndef hello():\n    func(1)\n    return\n" 0 3 (fontified t face font-lock-keyword-face) 3 4 (fontified t) 4 8 (fontified t face font-lock-function-name-face) 8 11 (fontified t) 11 12 (fontified t composition (0 1 [32 65 57708]) prettify-symbols-start 12 prettify-symbols-end 13) 12 17 (fontified t) 17 23 (fontified t face font-lock-keyword-face) 23 24 (fontified t) 24 25 (syntax-table (15) fontified t face font-lock-string-face) 25 27 (fontified t face font-lock-string-face) 27 28 (syntax-table (15) fontified t face font-lock-string-face) 28 31 (fontified t) 31 34 (fontified t face font-lock-keyword-face) 34 35 (fontified t) 35 40 (fontified t face font-lock-function-name-face) 40 42 (fontified t) 42 43 (fontified t composition (0 1 [32 65 57708]) prettify-symbols-start 43 prettify-symbols-end 44) 43 44 (fontified t) 44 56 (fontified t) 56 60 (fontified t) 60 66 (fontified t face font-lock-keyword-face) 66 67 (fontified t)) 48) nil nil)
* elpy-rpc-get-definition()
* elpy-xref--definitions("6: func")
...
1
  • There is an update to this issue here, but it's still not clear to me what the error is. – bashfuloctopus Feb 25 at 17:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.