An unofficial TabNine (with TabNine Chat supported) package for Emacs.
If you want to use capf
only, disable tabnine-mode
.
TabNine is available on Melpa, you can install it with your favorite package manager.
Example for manual install
- Install
tabnine
.
Clone or download this repository and add to your load path:
(add-to-list 'load-path "<path-to-tabnine>")
(require 'tabnine)
- Other configurations, e.g. enable
tabnine-mode
inprog-mode
.
(with-eval-after-load 'company
;; disable inline previews
(delq 'company-preview-if-just-one-frontend company-frontends))
(with-eval-after-load 'tabnine
;; (kbd "TAB") is literal ctrl-I, (kbd "<tab>) is the actual tab key
(define-key tabnine-completion-map (kbd "TAB") #'tabnine-accept-completion)
(define-key tabnine-completion-map (kbd "<tab>") #'tabnine-accept-completion)
(define-key tabnine-completion-map (kbd "M-f") #'tabnine-accept-completion-by-word)
(define-key tabnine-completion-map (kbd "M-<return>") #'tabnine-accept-completion-by-line)
(define-key tabnine-completion-map (kbd "C-g") #'tabnine-clear-overlay)
(define-key tabnine-completion-map (kbd "M-[") #'tabnine-next-completion)
(define-key tabnine-completion-map (kbd "M-]") #'tabnine-previous-completion))
(add-hook 'prog-mode-hook #'tabnine-mode)
(add-hook 'kill-emacs-hook #'tabnine-kill-process)
- Run
M-x tabnine-install-binary
to install the TabNine binary for your system.
Example for use-package (straight)
(use-package tabnine
:commands (tabnine-start-process)
:hook (prog-mode . tabnine-mode)
:straight t
:diminish "⌬"
:custom
(tabnine-wait 1)
(tabnine-minimum-prefix-length 0)
:hook (kill-emacs . tabnine-kill-process)
:config
(add-to-list 'completion-at-point-functions #'tabnine-completion-at-point)
(tabnine-start-process)
:bind
(:map tabnine-completion-map
("<tab>" . tabnine-accept-completion)
("TAB" . tabnine-accept-completion)
("M-f" . tabnine-accept-completion-by-word)
("M-<return>" . tabnine-accept-completion-by-line)
("C-g" . tabnine-clear-overlay)
("M-[" . tabnine-previous-completion)
("M-]" . tabnine-next-completion)))
Example for Doom Emacs
- Add package definition to ~/.doom.d/packages.el:
(package! tabnine)
- Configure tabnine in ~/.doom.d/config.el:
(use-package! tabnine
:hook ((prog-mode . tabnine-mode)
(kill-emacs . tabnine-kill-process))
:config
(add-to-list 'completion-at-point-functions #'tabnine-completion-at-point)
(tabnine-start-process)
:bind
(:map tabnine-completion-map
("<tab>" . tabnine-accept-completion)
("TAB" . tabnine-accept-completion)
("M-f" . tabnine-accept-completion-by-word)
("M-<return>" . tabnine-accept-completion-by-line)
("C-g" . tabnine-clear-overlay)
("M-[" . tabnine-previous-completion)
("M-]" . tabnine-next-completion)))
Example for Spacemacs
Edit your ~/.spacemacs:
;; ===================
;; dotspacemacs/layers
;; ===================
;; add or uncomment the auto-completion layer
dotspacemacs-configuration-layers
'(
...
auto-completion
...
)
;; add tabnine to additional packages
dotspacemacs-additional-packages
'((tabnine))
;; ========================
;; dotspacemacs/user-config
;; ========================
;; accept completion from tabnine and fallback to company
(with-eval-after-load 'company
;; disable inline previews
(delq 'company-preview-if-just-one-frontend company-frontends))
(with-eval-after-load 'tabnine
(define-key tabnine-completion-map (kbd "TAB") #'tabnine-accept-completion)
(define-key tabnine-completion-map (kbd "<tab>") #'tabnine-accept-completion)
(define-key tabnine-completion-map (kbd "M-f") #'tabnine-accept-completion-by-word)
(define-key tabnine-completion-map (kbd "M-<return>") #'tabnine-accept-completion-by-line)
(define-key tabnine-completion-map (kbd "C-g") #'tabnine-clear-overlay)
(define-key tabnine-completion-map (kbd "M-[") #'tabnine-next-completion)
(define-key tabnine-completion-map (kbd "M-]") #'tabnine-previous-completion))
(add-hook 'prog-mode-hook 'tabnine-mode)
(add-hook 'kill-emacs-hook #'tabnine-kill-process)
After installing the TabNine package, you should finish the installation by executing the interactive command tabnine-install-binary
.
The advanced features (e.g. advanced completions, TabNine Chat) require a TabNine Pro
account. Use tabnine-login
command to login your TabNine account.
Command | Prompt |
---|---|
tabnine-chat-explain-code | Explain the selected code |
tabnine-chat-generate-test-for-code | Write tests for the selected code |
tabnine-chat-document-code | Add documentation for the selected code |
tabnine-chat-fix-code | Find errors in the selected code and fix them |
TabNine can automatically balance parentheses, by removing and adding closing parentheses after the cursor. See the examples here.
None.
Key | Action |
---|---|
TAB | tabnine-accept-completion |
C-g | tabnine-clear-overlay |
M-f | tabnine-accept-completion-by-word |
M-<return> | tabnine-accept-completion-by-line |
M-[ | tabnine-previous-completion |
M-] | tabnine-next-completion |
Key | Action |
---|---|
C-c RET | tabnine-chat-send |
- TabNine’s local deep learning completion might be enabled by default. It is very CPU-intensive if your device can’t handle it. You can check by typing “TabNine::config” in any buffer (your browser should then automatically open to TabNine’s config page) and disable Deep TabNine Local (you will lose local deep learning completion). More details here.
If candidate icons of tabnine are displayed wrongly capf icon error, try to set kind-icon-mapping
for tabnine:
- With all-the-icons
(add-to-list 'kind-icon-mapping '(tabnine "ai" :icon "cloud" :face shadow) t)
- With all-the-icons-nerd-fonts
(add-to-list 'kind-icon-mapping `(tabnine ,(nerd-icons-codicon "nf-cod-hubot") :face font-lock-warning-face) t)
- Emacs 27.1 or later
Thanks to the great work of Tommy Xiang, zerolfx and karthink.
These projects helped me a lot:
https://github.com/TommyX12/company-tabnine
https://github.com/50ways2sayhard/tabnine-capf
https://github.com/zerolfx/copilot.el
https://github.com/karthink/gptel
Licensed under GPLv3.