If i select first option it will become
But as the completion candidate is function type, how can i make it to
so that i don't have to manually type parens?
Emacs Stack Exchange is a question and answer site for those using, extending or developing Emacs. It only takes a minute to sign up.Sign up to join this community
I'm not very familiar with the innards of Company, but here's how to do it with Ivy (you can re-use some code for Company as well, if you know how):
(defun counsel-jedi () "Python completion at point." (interactive) (let ((bnd (bounds-of-thing-at-point 'symbol))) (if bnd (progn (setq counsel-completion-beg (car bnd)) (setq counsel-completion-end (cdr bnd))) (setq counsel-completion-beg nil) (setq counsel-completion-end nil))) (deferred:sync! (jedi:complete-request)) (ivy-read "Symbol name: " (jedi:ac-direct-matches) :action #'counsel--py-action)) (defun counsel--py-action (symbol) "Insert SYMBOL, erasing the previous one." (when (stringp symbol) (when counsel-completion-beg (delete-region counsel-completion-beg counsel-completion-end)) (setq counsel-completion-beg (move-marker (make-marker) (point))) (insert symbol) (setq counsel-completion-end (move-marker (make-marker) (point))) (when (equal (get-text-property 0 'symbol symbol) "f") (insert "()") (backward-char 1))))
It will tricky to do this generally since company itself does not care about semantics of completion candidates as such the method to detect the whether a symbol is a function would be backend specific.
You can add a hook to
company-completion-finished-hook which inspects the candidate inserted and adds the parens if needed. As an example the following code will work with company-jedi
(defun my-setup-python-mode () ;; Make sure we add to hook locally so that we do not mess up completion in other major-modes (add-hook 'company-completion-finished-hook #'my-company-insert-parens-function t)) (defun my-company-insert-parens-function (candidate) ;; This part will be different for different backends (when (string= (plist-get (text-properties-at 0 candidate) :symbol) "f") (insert "()") (backward-char))) (add-hook 'python-mode #'my-setup-python-mode)