Compare commits
17
Commits
50d8e3f455
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0835c1a06 | ||
|
|
98cf182406 | ||
|
|
16321c0c4f | ||
|
|
9d7b1f5850 | ||
|
|
3c5fbbf581 | ||
|
|
a38b5d1e15 | ||
|
|
f223178f39 | ||
|
|
33f22e6471 | ||
|
|
b21b6d2462 | ||
|
|
795f2aad5b | ||
|
|
cf156ca80b | ||
|
|
a282e01692 | ||
|
|
88f9e2e408 | ||
|
|
a208f458c1 | ||
|
|
d488a323da | ||
|
|
9cc18db3ba | ||
|
|
88dc203b9f |
@@ -169,7 +169,7 @@
|
|||||||
;; -----------------------------------------
|
;; -----------------------------------------
|
||||||
;; Recentf
|
;; Recentf
|
||||||
|
|
||||||
(elpaca nil (setup recentf ; built-in
|
(elpaca-nil (setup recentf ; built-in
|
||||||
(:require recentf)
|
(:require recentf)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq recentf-auto-cleanup 'never)
|
(setq recentf-auto-cleanup 'never)
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
|
|
||||||
(super-save-mode)))
|
(super-save-mode)))
|
||||||
|
|
||||||
(elpaca nil (setup desktop ; built-in
|
(elpaca-nil (setup desktop ; built-in
|
||||||
(:require desktop)
|
(:require desktop)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq desktop-base-file-name "state")
|
(setq desktop-base-file-name "state")
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
;; Adding to project.el project directory detection
|
;; Adding to project.el project directory detection
|
||||||
;; https://michael.stapelberg.ch/posts/2021-04-02-emacs-project-override/
|
;; https://michael.stapelberg.ch/posts/2021-04-02-emacs-project-override/
|
||||||
|
|
||||||
(elpaca nil (setup project ; built-in
|
(elpaca-nil (setup project ; built-in
|
||||||
(setq project-list-file (expand-file-name "projects" dot-cache-dir))
|
(setq project-list-file (expand-file-name "projects" dot-cache-dir))
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
|
|
||||||
@@ -144,7 +144,11 @@
|
|||||||
"Return project name."
|
"Return project name."
|
||||||
(let ((project (project-current)))
|
(let ((project (project-current)))
|
||||||
(if project
|
(if project
|
||||||
(file-name-nondirectory (directory-file-name (project-root project)))
|
(let* ((project (file-truename (directory-file-name (project-root (project-current)))))
|
||||||
|
(parent-dir-full (file-name-directory (directory-file-name project)))
|
||||||
|
(parent-dir (file-name-nondirectory (substring parent-dir-full 0 -1)))
|
||||||
|
(filename (file-name-nondirectory project)))
|
||||||
|
(concat filename "/" parent-dir))
|
||||||
"-")))
|
"-")))
|
||||||
|
|
||||||
(defun dot/project-save-project-buffers ()
|
(defun dot/project-save-project-buffers ()
|
||||||
@@ -159,12 +163,12 @@
|
|||||||
|
|
||||||
;; Enable color escape codes.
|
;; Enable color escape codes.
|
||||||
|
|
||||||
(elpaca nil (setup ansi-color ; built-in
|
(elpaca-nil (setup ansi-color ; built-in
|
||||||
(:with-mode compilation-filter (:hook ansi-color-compilation-filter))
|
(:with-mode compilation-filter (:hook ansi-color-compilation-filter))
|
||||||
;; :hook (compilation-filter . ansi-color-compilation-filter)
|
;; :hook (compilation-filter . ansi-color-compilation-filter)
|
||||||
(:when-loaded (setq ansi-color-bold-is-bright t))))
|
(:when-loaded (setq ansi-color-bold-is-bright t))))
|
||||||
|
|
||||||
(elpaca nil (setup compile ; built-in
|
(elpaca-nil (setup compile ; built-in
|
||||||
(defun dot/compile-disable-underline () ""
|
(defun dot/compile-disable-underline () ""
|
||||||
(face-remap-add-relative 'underline :underline nil))
|
(face-remap-add-relative 'underline :underline nil))
|
||||||
(:with-mode comint-mode (:hook dot/compile-disable-underline))
|
(:with-mode comint-mode (:hook dot/compile-disable-underline))
|
||||||
@@ -192,9 +196,11 @@
|
|||||||
c++-mode ; clangd
|
c++-mode ; clangd
|
||||||
php-mode ; nodejs-intelephense
|
php-mode ; nodejs-intelephense
|
||||||
csharp-mode ; omnisharp-roslyn-bin
|
csharp-mode ; omnisharp-roslyn-bin
|
||||||
|
go-mode ; gopls
|
||||||
|
kotlin-mode ; kotlin-language-server
|
||||||
lua-mode ; lua-language-server
|
lua-mode ; lua-language-server
|
||||||
latex-mode ; texlab
|
latex-mode ; texlab
|
||||||
kotlin-mode ; kotlin-language-server
|
swift-mode ; swift-bin
|
||||||
web-mode)
|
web-mode)
|
||||||
(:hook lsp-deferred))
|
(:hook lsp-deferred))
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
@@ -307,7 +313,7 @@
|
|||||||
|
|
||||||
;;; C/C++
|
;;; C/C++
|
||||||
|
|
||||||
(elpaca nil (setup c-mode ; built-in
|
(elpaca-nil (setup c-mode ; built-in
|
||||||
;; C++ // line comment style in c-mode
|
;; C++ // line comment style in c-mode
|
||||||
(defun dot/c-mode-comment-style () ""
|
(defun dot/c-mode-comment-style () ""
|
||||||
(c-toggle-comment-style -1))
|
(c-toggle-comment-style -1))
|
||||||
@@ -323,7 +329,7 @@
|
|||||||
;; - omnisharp-roslyn-bin
|
;; - omnisharp-roslyn-bin
|
||||||
;; - netcoredbg (edit PKGBUILD to detect dotnet -6.0 dependencies)
|
;; - netcoredbg (edit PKGBUILD to detect dotnet -6.0 dependencies)
|
||||||
|
|
||||||
(elpaca nil (setup csharp-mode)) ; built-in
|
(elpaca-nil (setup csharp-mode)) ; built-in
|
||||||
|
|
||||||
;;; CMake
|
;;; CMake
|
||||||
|
|
||||||
@@ -333,7 +339,7 @@
|
|||||||
|
|
||||||
;;; Emacs Lisp
|
;;; Emacs Lisp
|
||||||
|
|
||||||
(elpaca nil (setup emacs-lisp ; built-in
|
(elpaca-nil (setup emacs-lisp ; built-in
|
||||||
(defun dot/elisp-init () ""
|
(defun dot/elisp-init () ""
|
||||||
(setq-local indent-tabs-mode nil))
|
(setq-local indent-tabs-mode nil))
|
||||||
(:hook dot/elisp-init)))
|
(:hook dot/elisp-init)))
|
||||||
@@ -342,9 +348,15 @@
|
|||||||
|
|
||||||
(elpaca-setup glsl-mode)
|
(elpaca-setup glsl-mode)
|
||||||
|
|
||||||
|
;;; Golang
|
||||||
|
|
||||||
|
(elpaca-setup go-mode)
|
||||||
|
|
||||||
;;; HTML
|
;;; HTML
|
||||||
|
|
||||||
(elpaca-setup web-mode)
|
(elpaca-setup web-mode
|
||||||
|
(:file-match "\\.ts")
|
||||||
|
(:file-match "\\.vue"))
|
||||||
|
|
||||||
;;; Kotlin
|
;;; Kotlin
|
||||||
|
|
||||||
@@ -363,16 +375,26 @@
|
|||||||
(:hook dot/php-mode-init))
|
(:hook dot/php-mode-init))
|
||||||
|
|
||||||
(elpaca-setup restclient)
|
(elpaca-setup restclient)
|
||||||
|
(elpaca-setup restclient-jq
|
||||||
|
(:load-after restclient))
|
||||||
|
|
||||||
;;; Python
|
;;; Python
|
||||||
|
|
||||||
(elpaca nil (setup python-mode ; built-in
|
(elpaca-nil (setup python-mode ; built-in
|
||||||
(defun dot/python-mode-init () ""
|
(defun dot/python-mode-init () ""
|
||||||
(setq-local indent-tabs-mode t)
|
(setq-local indent-tabs-mode t)
|
||||||
(setq-local tab-width (default-value 'tab-width))
|
(setq-local tab-width (default-value 'tab-width))
|
||||||
(setq python-indent-offset (default-value 'tab-width)))
|
(setq python-indent-offset (default-value 'tab-width)))
|
||||||
(:hook dot/python-mode-init)))
|
(:hook dot/python-mode-init)))
|
||||||
|
|
||||||
|
;;; Swift
|
||||||
|
|
||||||
|
(elpaca-setup swift-mode)
|
||||||
|
(elpaca-setup lsp-sourcekit
|
||||||
|
(:load-after lsp-mode)
|
||||||
|
(:when-loaded
|
||||||
|
(setq lsp-sourcekit-executable "/usr/bin/sourcekit-lsp")))
|
||||||
|
|
||||||
;;; YAML
|
;;; YAML
|
||||||
|
|
||||||
(elpaca-setup yaml-mode)
|
(elpaca-setup yaml-mode)
|
||||||
@@ -424,7 +446,7 @@
|
|||||||
|
|
||||||
;;; Flyspell
|
;;; Flyspell
|
||||||
|
|
||||||
(elpaca nil (setup ispell ; built-in
|
(elpaca-nil (setup ispell ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq ispell-program-name "/usr/bin/hunspell")
|
(setq ispell-program-name "/usr/bin/hunspell")
|
||||||
(ispell-set-spellchecker-params)
|
(ispell-set-spellchecker-params)
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
;; -----------------------------------------
|
;; -----------------------------------------
|
||||||
|
|
||||||
;; Elpaca bootstrap
|
;; Elpaca bootstrap
|
||||||
(defvar elpaca-installer-version 0.6)
|
(defvar elpaca-installer-version 0.8)
|
||||||
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
|
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
|
||||||
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
|
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
|
||||||
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
|
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
|
||||||
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
|
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
|
||||||
:ref nil
|
:ref nil :depth 1
|
||||||
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
|
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
|
||||||
:build (:not elpaca--activate-package)))
|
:build (:not elpaca--activate-package)))
|
||||||
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
|
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
|
||||||
@@ -26,16 +26,18 @@
|
|||||||
(make-directory repo t)
|
(make-directory repo t)
|
||||||
(when (< emacs-major-version 28) (require 'subr-x))
|
(when (< emacs-major-version 28) (require 'subr-x))
|
||||||
(condition-case-unless-debug err
|
(condition-case-unless-debug err
|
||||||
(if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
|
(if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
|
||||||
((zerop (call-process "git" nil buffer t "clone"
|
((zerop (apply #'call-process `("git" nil ,buffer t "clone"
|
||||||
(plist-get order :repo) repo)))
|
,@(when-let* ((depth (plist-get order :depth)))
|
||||||
((zerop (call-process "git" nil buffer t "checkout"
|
(list (format "--depth=%d" depth) "--no-single-branch"))
|
||||||
(or (plist-get order :ref) "--"))))
|
,(plist-get order :repo) ,repo))))
|
||||||
(emacs (concat invocation-directory invocation-name))
|
((zerop (call-process "git" nil buffer t "checkout"
|
||||||
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
|
(or (plist-get order :ref) "--"))))
|
||||||
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
|
(emacs (concat invocation-directory invocation-name))
|
||||||
((require 'elpaca))
|
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
|
||||||
((elpaca-generate-autoloads "elpaca" repo)))
|
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
|
||||||
|
((require 'elpaca))
|
||||||
|
((elpaca-generate-autoloads "elpaca" repo)))
|
||||||
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
|
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
|
||||||
(error "%s" (with-current-buffer buffer (buffer-string))))
|
(error "%s" (with-current-buffer buffer (buffer-string))))
|
||||||
((error) (warn "%s" err) (delete-directory repo 'recursive))))
|
((error) (warn "%s" err) (delete-directory repo 'recursive))))
|
||||||
@@ -46,8 +48,14 @@
|
|||||||
(add-hook 'after-init-hook #'elpaca-process-queues)
|
(add-hook 'after-init-hook #'elpaca-process-queues)
|
||||||
(elpaca `(,@elpaca-order))
|
(elpaca `(,@elpaca-order))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defmacro elpaca-nil (body)
|
||||||
|
"Defer execution until all Elpaca queues have been processed."
|
||||||
|
(declare (indent 1))
|
||||||
|
`(add-hook 'elpaca-after-init-hook (lambda () (,@body)) 1))
|
||||||
|
|
||||||
;; Stop coping with startup time, its done loading when its done loading
|
;; Stop coping with startup time, its done loading when its done loading
|
||||||
(add-hook 'elpaca-after-init-hook (lambda () (setq after-init-time (current-time))))
|
(elpaca-nil (setq after-init-time (current-time)))
|
||||||
|
|
||||||
(provide 'dot-elpaca)
|
(provide 'dot-elpaca)
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ Vim equivalence: <C-D>"
|
|||||||
"Shift line right, retains cursor position.
|
"Shift line right, retains cursor position.
|
||||||
Vim equivalence: <Tab>"
|
Vim equivalence: <Tab>"
|
||||||
(interactive)
|
(interactive)
|
||||||
(when (not (yas-expand))
|
(unless (yas-expand)
|
||||||
(insert "\t")))
|
(insert "\t")))
|
||||||
|
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ Vim equivalence: >gv"
|
|||||||
|
|
||||||
;; Evil command aliases.
|
;; Evil command aliases.
|
||||||
|
|
||||||
(elpaca nil (setup evil-ex ; evil-ex.el is part of evil
|
(elpaca-nil (setup evil-ex ; evil-ex.el is part of evil
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(evil-ex-define-cmd "W" "w")
|
(evil-ex-define-cmd "W" "w")
|
||||||
(evil-ex-define-cmd "Q" "q")
|
(evil-ex-define-cmd "Q" "q")
|
||||||
|
|||||||
@@ -35,26 +35,27 @@
|
|||||||
|
|
||||||
;; Disable keybinds of native modes that clash with other custom keybinds.
|
;; Disable keybinds of native modes that clash with other custom keybinds.
|
||||||
|
|
||||||
(elpaca nil (setup emacs
|
(elpaca-nil (setup emacs
|
||||||
(:global
|
(:global
|
||||||
"M-h" nil
|
"M-h" nil
|
||||||
"M-j" nil
|
"M-j" nil
|
||||||
"M-k" nil
|
"M-k" nil
|
||||||
"M-l" nil
|
"M-l" nil
|
||||||
|
"<pinch>" nil ; Do not scale text when pinching touchpad
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup org
|
(elpaca-nil (setup org
|
||||||
(:bind "M-h" nil
|
(:bind "M-h" nil
|
||||||
"C-M-h" nil
|
"C-M-h" nil
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup cc-mode
|
(elpaca-nil (setup cc-mode
|
||||||
(:bind-into c-mode-base-map
|
(:bind-into c-mode-base-map
|
||||||
"M-j" nil
|
"M-j" nil
|
||||||
"C-M-h" nil
|
"C-M-h" nil
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup nxml-mode
|
(elpaca-nil (setup nxml-mode
|
||||||
(:bind "M-h" nil
|
(:bind "M-h" nil
|
||||||
)))
|
)))
|
||||||
|
|
||||||
@@ -63,16 +64,16 @@
|
|||||||
|
|
||||||
;; Disable keybinds of installed packages that clash with other custom keybinds.
|
;; Disable keybinds of installed packages that clash with other custom keybinds.
|
||||||
|
|
||||||
(elpaca nil (setup evil-states
|
(elpaca-nil (setup evil-states
|
||||||
(:bind-into evil-motion-state-map dot/leader-key nil
|
(:bind-into evil-motion-state-map dot/leader-key nil
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup magit
|
(elpaca-nil (setup magit
|
||||||
(:evil-bind normal
|
(:evil-bind normal
|
||||||
;; Do not close magit when pressing escape
|
;; Do not close magit when pressing escape
|
||||||
"<escape>" nil)))
|
"<escape>" nil)))
|
||||||
|
|
||||||
(elpaca nil (setup php-mode
|
(elpaca-nil (setup php-mode
|
||||||
(:bind "M-j" nil
|
(:bind "M-j" nil
|
||||||
"C-M-h" nil
|
"C-M-h" nil
|
||||||
)))
|
)))
|
||||||
@@ -84,7 +85,7 @@
|
|||||||
|
|
||||||
;;; Set Native Global Keybinds
|
;;; Set Native Global Keybinds
|
||||||
|
|
||||||
(elpaca nil (setup emacs
|
(elpaca-nil (setup emacs
|
||||||
(:global
|
(:global
|
||||||
;; Buffers
|
;; Buffers
|
||||||
"C-x C-b" ibuffer
|
"C-x C-b" ibuffer
|
||||||
@@ -111,21 +112,21 @@
|
|||||||
;;; Set Native Mode Keybinds
|
;;; Set Native Mode Keybinds
|
||||||
|
|
||||||
;; Dired
|
;; Dired
|
||||||
(elpaca nil (setup dired
|
(elpaca-nil (setup dired
|
||||||
(:bind
|
(:bind
|
||||||
[remap dired-find-file] dot/dired-find-file
|
[remap dired-find-file] dot/dired-find-file
|
||||||
[remap dired-up-directory] dot/dired-up-directory
|
[remap dired-up-directory] dot/dired-up-directory
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Org
|
;; Org
|
||||||
(elpaca nil (setup org
|
(elpaca-nil (setup org
|
||||||
(:bind "M-c" org-edit-special
|
(:bind "M-c" org-edit-special
|
||||||
)))
|
)))
|
||||||
(elpaca nil (setup org-src
|
(elpaca-nil (setup org-src
|
||||||
(:bind "M-c" org-edit-src-exit
|
(:bind "M-c" org-edit-src-exit
|
||||||
"M-k" org-edit-src-abort
|
"M-k" org-edit-src-abort
|
||||||
)))
|
)))
|
||||||
(elpaca nil (setup org-capture
|
(elpaca-nil (setup org-capture
|
||||||
(:bind "M-c" org-capture-finalize
|
(:bind "M-c" org-capture-finalize
|
||||||
"M-w" org-capture-refile
|
"M-w" org-capture-refile
|
||||||
"M-k" org-capture-kill
|
"M-k" org-capture-kill
|
||||||
@@ -136,7 +137,7 @@
|
|||||||
|
|
||||||
;; Set keybinds to functionality of installed packages.
|
;; Set keybinds to functionality of installed packages.
|
||||||
|
|
||||||
(elpaca nil (setup emacs
|
(elpaca-nil (setup emacs
|
||||||
(:global
|
(:global
|
||||||
;; Buffers
|
;; Buffers
|
||||||
"M-h" centaur-tabs-backward-tab
|
"M-h" centaur-tabs-backward-tab
|
||||||
@@ -151,7 +152,7 @@
|
|||||||
"M-x" dot/M-x
|
"M-x" dot/M-x
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup company
|
(elpaca-nil (setup company
|
||||||
(:bind-into company-active-map
|
(:bind-into company-active-map
|
||||||
;; Company completion selection
|
;; Company completion selection
|
||||||
"M-n" nil
|
"M-n" nil
|
||||||
@@ -163,7 +164,7 @@
|
|||||||
"<escape>" company-abort
|
"<escape>" company-abort
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup evil-ex
|
(elpaca-nil (setup evil-ex
|
||||||
(:bind-into evil-ex-completion-map
|
(:bind-into evil-ex-completion-map
|
||||||
;; Evil command history selection
|
;; Evil command history selection
|
||||||
"M-h" abort-recursive-edit
|
"M-h" abort-recursive-edit
|
||||||
@@ -172,7 +173,7 @@
|
|||||||
"M-l" exit-minibuffer
|
"M-l" exit-minibuffer
|
||||||
)))
|
)))
|
||||||
|
|
||||||
(elpaca nil (setup emacs
|
(elpaca-nil (setup emacs
|
||||||
(:global
|
(:global
|
||||||
;; flyspell-correct
|
;; flyspell-correct
|
||||||
[remap ispell-word] flyspell-correct-at-point ; z=
|
[remap ispell-word] flyspell-correct-at-point ; z=
|
||||||
@@ -189,26 +190,26 @@
|
|||||||
(which-key-add-key-based-replacements "C-h o" "describe-symbol-at-point")))))
|
(which-key-add-key-based-replacements "C-h o" "describe-symbol-at-point")))))
|
||||||
|
|
||||||
;; LSP
|
;; LSP
|
||||||
(elpaca nil (setup lsp-mode
|
(elpaca-nil (setup lsp-mode
|
||||||
(:bind-into lsp-signature-mode-map
|
(:bind-into lsp-signature-mode-map
|
||||||
"M-j" lsp-signature-next
|
"M-j" lsp-signature-next
|
||||||
"M-k" lsp-signature-previous
|
"M-k" lsp-signature-previous
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Magit
|
;; Magit
|
||||||
(elpaca nil (setup magit
|
(elpaca-nil (setup magit
|
||||||
(:bind-into magit-log-select-mode-map
|
(:bind-into magit-log-select-mode-map
|
||||||
"M-c" magit-log-select-pick
|
"M-c" magit-log-select-pick
|
||||||
"M-k" magit-log-select-quit
|
"M-k" magit-log-select-quit
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Org-roam
|
;; Org-roam
|
||||||
(elpaca nil (setup org-roam
|
(elpaca-nil (setup org-roam
|
||||||
(:bind [down-mouse-1] org-roam-visit-thing
|
(:bind [down-mouse-1] org-roam-visit-thing
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Minibuffer completion selection
|
;; Minibuffer completion selection
|
||||||
(elpaca nil (setup minibuffer
|
(elpaca-nil (setup minibuffer
|
||||||
(:bind-into minibuffer-local-map
|
(:bind-into minibuffer-local-map
|
||||||
"M-J" next-history-element
|
"M-J" next-history-element
|
||||||
"M-K" previous-history-element
|
"M-K" previous-history-element
|
||||||
@@ -223,7 +224,7 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; with-editor
|
;; with-editor
|
||||||
(elpaca nil (setup with-editor
|
(elpaca-nil (setup with-editor
|
||||||
(:bind
|
(:bind
|
||||||
"M-c" with-editor-finish
|
"M-c" with-editor-finish
|
||||||
"M-k" with-editor-cancel
|
"M-k" with-editor-cancel
|
||||||
@@ -231,7 +232,7 @@
|
|||||||
|
|
||||||
;;; Global evil keymap
|
;;; Global evil keymap
|
||||||
|
|
||||||
(elpaca nil (setup evil
|
(elpaca-nil (setup evil
|
||||||
(:bind-into evil-normal-state-map
|
(:bind-into evil-normal-state-map
|
||||||
"C-n" neotree-toggle-in-project-root
|
"C-n" neotree-toggle-in-project-root
|
||||||
"C-S-p" evil-paste-pop-next
|
"C-S-p" evil-paste-pop-next
|
||||||
@@ -256,13 +257,13 @@
|
|||||||
;;; Other evil state-related keybinds
|
;;; Other evil state-related keybinds
|
||||||
|
|
||||||
;; Custom (M-x customize)
|
;; Custom (M-x customize)
|
||||||
(elpaca nil (setup cus-edit
|
(elpaca-nil (setup cus-edit
|
||||||
(:evil-bind-into normal custom-mode-map
|
(:evil-bind-into normal custom-mode-map
|
||||||
[down-mouse-1] widget-button-click
|
[down-mouse-1] widget-button-click
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Dashboard
|
;; Dashboard
|
||||||
(elpaca nil (setup dashboard
|
(elpaca-nil (setup dashboard
|
||||||
(:evil-bind normal
|
(:evil-bind normal
|
||||||
[down-mouse-1] widget-button-click
|
[down-mouse-1] widget-button-click
|
||||||
"g" dashboard-refresh-buffer
|
"g" dashboard-refresh-buffer
|
||||||
@@ -272,13 +273,13 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Dap
|
;; Dap
|
||||||
(elpaca nil (setup dap-ui
|
(elpaca-nil (setup dap-ui
|
||||||
(:evil-bind-into normal dap-ui-session-mode-map
|
(:evil-bind-into normal dap-ui-session-mode-map
|
||||||
"D" dap-ui-delete-session
|
"D" dap-ui-delete-session
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Deft
|
;; Deft
|
||||||
(elpaca nil (setup deft
|
(elpaca-nil (setup deft
|
||||||
(:evil-bind normal
|
(:evil-bind normal
|
||||||
[down-mouse-1] widget-button-click
|
[down-mouse-1] widget-button-click
|
||||||
"+" deft-new-file-named
|
"+" deft-new-file-named
|
||||||
@@ -296,7 +297,7 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Elfeed
|
;; Elfeed
|
||||||
(elpaca nil (setup elfeed
|
(elpaca-nil (setup elfeed
|
||||||
(:evil-bind-into normal elfeed-search-mode-map
|
(:evil-bind-into normal elfeed-search-mode-map
|
||||||
"b" elfeed-search-browse-url
|
"b" elfeed-search-browse-url
|
||||||
"c" elfeed-search-clear-filter
|
"c" elfeed-search-clear-filter
|
||||||
@@ -316,14 +317,14 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Magit
|
;; Magit
|
||||||
(elpaca nil (setup magit
|
(elpaca-nil (setup magit
|
||||||
(:evil-bind (normal visual)
|
(:evil-bind (normal visual)
|
||||||
"{" magit-section-backward-sibling
|
"{" magit-section-backward-sibling
|
||||||
"}" magit-section-forward-sibling
|
"}" magit-section-forward-sibling
|
||||||
)))
|
)))
|
||||||
|
|
||||||
;; Minibuffer
|
;; Minibuffer
|
||||||
(elpaca nil (setup minibuffer
|
(elpaca-nil (setup minibuffer
|
||||||
(:evil-bind-into normal minibuffer-local-map
|
(:evil-bind-into normal minibuffer-local-map
|
||||||
"TAB" vertico-insert
|
"TAB" vertico-insert
|
||||||
"j" vertico-next
|
"j" vertico-next
|
||||||
@@ -336,7 +337,7 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Mu4e
|
;; Mu4e
|
||||||
(elpaca nil (setup mu4e
|
(elpaca-nil (setup mu4e
|
||||||
(:evil-bind-into normal mu4e-compose-mode-map
|
(:evil-bind-into normal mu4e-compose-mode-map
|
||||||
"q" mu4e-message-kill-buffer
|
"q" mu4e-message-kill-buffer
|
||||||
"M-c" message-send-and-exit
|
"M-c" message-send-and-exit
|
||||||
@@ -344,7 +345,7 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Neotree
|
;; Neotree
|
||||||
(elpaca nil (setup neotree
|
(elpaca-nil (setup neotree
|
||||||
(:evil-bind normal
|
(:evil-bind normal
|
||||||
"RET" neotree-enter
|
"RET" neotree-enter
|
||||||
"<backtab>" neotree-collapse-all ; <S-tab>
|
"<backtab>" neotree-collapse-all ; <S-tab>
|
||||||
@@ -362,7 +363,7 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Org
|
;; Org
|
||||||
(elpaca nil (setup org
|
(elpaca-nil (setup org
|
||||||
(:evil-bind normal
|
(:evil-bind normal
|
||||||
"RET" dot/org-ret-at-point
|
"RET" dot/org-ret-at-point
|
||||||
)
|
)
|
||||||
@@ -374,7 +375,7 @@
|
|||||||
)))
|
)))
|
||||||
|
|
||||||
;; Wdired
|
;; Wdired
|
||||||
(elpaca nil (setup wdired
|
(elpaca-nil (setup wdired
|
||||||
(:evil-bind (normal insert)
|
(:evil-bind (normal insert)
|
||||||
"M-c" wdired-finish-edit
|
"M-c" wdired-finish-edit
|
||||||
"M-k" wdired-abort-changes
|
"M-k" wdired-abort-changes
|
||||||
@@ -387,7 +388,7 @@
|
|||||||
|
|
||||||
;;; Global Leader
|
;;; Global Leader
|
||||||
|
|
||||||
(elpaca nil (setup general
|
(elpaca-nil (setup general
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(general-create-definer space-leader
|
(general-create-definer space-leader
|
||||||
:prefix dot/leader-key
|
:prefix dot/leader-key
|
||||||
@@ -485,6 +486,12 @@
|
|||||||
"n r r" '(org-roam-buffer-toggle :which-key "Toggle buffer")
|
"n r r" '(org-roam-buffer-toggle :which-key "Toggle buffer")
|
||||||
"n r s" '(org-roam-ui-mode :which-key "Toggle server")
|
"n r s" '(org-roam-ui-mode :which-key "Toggle server")
|
||||||
|
|
||||||
|
;; Org
|
||||||
|
"o" '(:ignore t :which-key "org")
|
||||||
|
"o i" '(dot/org-clock-in :which-key "Clock in")
|
||||||
|
"o o" '(dot/org-clock-out :which-key "Clock out")
|
||||||
|
"o s" '(dot/org-switch-task :which-key "Switch task")
|
||||||
|
|
||||||
;; Project
|
;; Project
|
||||||
"p" '(:keymap project-prefix-map :which-key "project")
|
"p" '(:keymap project-prefix-map :which-key "project")
|
||||||
"p b" '(consult-project-buffer :which-key "project-switch-buffer")
|
"p b" '(consult-project-buffer :which-key "project-switch-buffer")
|
||||||
@@ -593,7 +600,7 @@
|
|||||||
|
|
||||||
;;; Local Leader
|
;;; Local Leader
|
||||||
|
|
||||||
(elpaca nil (setup general
|
(elpaca-nil (setup general
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(general-create-definer local-leader
|
(general-create-definer local-leader
|
||||||
:prefix dot/localleader-key
|
:prefix dot/localleader-key
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
;; Key bindings
|
;; Key bindings
|
||||||
;; [https://www.djcbsoftware.nl/code/mu/mu4e/MSGV-Keybindings.html#MSGV-Keybindings]
|
;; [https://www.djcbsoftware.nl/code/mu/mu4e/MSGV-Keybindings.html#MSGV-Keybindings]
|
||||||
|
|
||||||
(elpaca nil (setup mu4e ; loaded from AUR package
|
(elpaca-nil (setup mu4e ; loaded from AUR package
|
||||||
(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
|
(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
|
||||||
(:autoload mu4e mu4e-update-index)
|
(:autoload mu4e mu4e-update-index)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
@@ -114,7 +114,7 @@
|
|||||||
|
|
||||||
;; Sending mail.
|
;; Sending mail.
|
||||||
|
|
||||||
(elpaca nil (setup smtpmail ; built-in
|
(elpaca-nil (setup smtpmail ; built-in
|
||||||
(setq smtpmail-default-smtp-server "mail.riyyi.com")
|
(setq smtpmail-default-smtp-server "mail.riyyi.com")
|
||||||
(:load-after mu4e)
|
(:load-after mu4e)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
@@ -124,11 +124,11 @@
|
|||||||
(setq smtpmail-stream-type 'starttls)
|
(setq smtpmail-stream-type 'starttls)
|
||||||
(setq smtpmail-queue-mail nil))))
|
(setq smtpmail-queue-mail nil))))
|
||||||
|
|
||||||
(elpaca nil (setup sendmail ; built-in
|
(elpaca-nil (setup sendmail ; built-in
|
||||||
(:load-after mu4e)
|
(:load-after mu4e)
|
||||||
(:when-loaded (setq send-mail-function 'smtpmail-send-it))))
|
(:when-loaded (setq send-mail-function 'smtpmail-send-it))))
|
||||||
|
|
||||||
(elpaca nil (setup message ; built-in
|
(elpaca-nil (setup message ; built-in
|
||||||
(:load-after mu4e)
|
(:load-after mu4e)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq message-kill-buffer-on-exit t)
|
(setq message-kill-buffer-on-exit t)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
;; -----------------------------------------
|
;; -----------------------------------------
|
||||||
;; LaTeX Configuration
|
;; LaTeX Configuration
|
||||||
|
|
||||||
(elpaca nil (setup tex-mode ; built-in
|
(elpaca-nil (setup tex-mode ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(defun dot/tex-mode-init () ""
|
(defun dot/tex-mode-init () ""
|
||||||
(setq indent-tabs-mode t)
|
(setq indent-tabs-mode t)
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
;; Base Org.
|
;; Base Org.
|
||||||
|
|
||||||
(elpaca nil (setup org ; built-in
|
(elpaca-nil (setup org ; built-in
|
||||||
(setq org-directory (expand-file-name "documents/org" (getenv "HOME")))
|
(setq org-directory (expand-file-name "documents/org" (getenv "HOME")))
|
||||||
(setq org-default-notes-file (expand-file-name "notes.org" org-directory))
|
(setq org-default-notes-file (expand-file-name "notes.org" org-directory))
|
||||||
(:with-mode before-save
|
(:with-mode before-save
|
||||||
@@ -46,6 +46,51 @@
|
|||||||
(add-to-list 'org-structure-template-alist
|
(add-to-list 'org-structure-template-alist
|
||||||
'("el" . "src emacs-lisp"))
|
'("el" . "src emacs-lisp"))
|
||||||
|
|
||||||
|
(defun dot/org-find-or-create-heading (heading level)
|
||||||
|
"Find or create heading"
|
||||||
|
(if (re-search-forward (format org-complex-heading-regexp-format
|
||||||
|
(regexp-quote heading))
|
||||||
|
nil t)
|
||||||
|
(beginning-of-line)
|
||||||
|
(goto-char (point-max))
|
||||||
|
(unless (bolp) (insert "\n"))
|
||||||
|
(insert (concat (make-string level ?*) " ") heading "\n")
|
||||||
|
(beginning-of-line 0)))
|
||||||
|
|
||||||
|
(defun dot/org-find-month-week-day ()
|
||||||
|
"Find or create the journal tree for the current week under current month"
|
||||||
|
(unless (derived-mode-p 'org-mode)
|
||||||
|
(error "Target buffer \"%s\" for dot/find-org-week should be in Org mode"
|
||||||
|
(current-buffer)))
|
||||||
|
(org-capture-put-target-region-and-position)
|
||||||
|
(widen)
|
||||||
|
(goto-char (point-min))
|
||||||
|
(dot/org-find-or-create-heading "Worklog" 1)
|
||||||
|
(org-narrow-to-subtree)
|
||||||
|
(dot/org-find-or-create-heading (format-time-string "%B") 2) ;; month
|
||||||
|
(org-narrow-to-subtree)
|
||||||
|
(dot/org-find-or-create-heading (format-time-string "Week %W") 3)
|
||||||
|
(org-narrow-to-subtree)
|
||||||
|
(dot/org-find-or-create-heading (format-time-string "%A") 4) ;; day
|
||||||
|
(org-end-of-subtree))
|
||||||
|
|
||||||
|
;; Capture templates
|
||||||
|
(setq org-capture-templates
|
||||||
|
`(("i" "Clock in" plain (file+function ,(expand-file-name "worklog.org" org-directory) dot/org-find-month-week-day)
|
||||||
|
"| %<%Y-%m-%d> | IN | %<%H:%M> | %^{Location|Office|Home|Office|Visit} |\n===================================%?"
|
||||||
|
:immediate-finish t)
|
||||||
|
("o" "Clock out" plain (file+function ,(expand-file-name "worklog.org" org-directory) dot/org-find-month-week-day)
|
||||||
|
"===================================\n| %<%Y-%m-%d> | OUT | %<%H:%M> |%?"
|
||||||
|
:immediate-finish t)
|
||||||
|
("s" "Switch task" plain (file+function ,(expand-file-name "worklog.org" org-directory) dot/org-find-month-week-day)
|
||||||
|
"| %<%Y-%m-%d> | %<%H:%M> | %^{Item ID} | X | %^{Description|-} |%?"
|
||||||
|
:immediate-finish t)))
|
||||||
|
|
||||||
|
;; Keybind functions
|
||||||
|
(defun dot/org-clock-in () (interactive) (org-capture nil "i"))
|
||||||
|
(defun dot/org-clock-out () (interactive) (org-capture nil "o"))
|
||||||
|
(defun dot/org-switch-task () (interactive) (org-capture nil "s"))
|
||||||
|
|
||||||
(with-eval-after-load 'evil-commands
|
(with-eval-after-load 'evil-commands
|
||||||
(defun dot/org-ret-at-point ()
|
(defun dot/org-ret-at-point ()
|
||||||
"Org return key at point.
|
"Org return key at point.
|
||||||
@@ -97,7 +142,7 @@ When ANYWHERE is non-nil, search beyond the preamble."
|
|||||||
|
|
||||||
;; Org agenda.
|
;; Org agenda.
|
||||||
|
|
||||||
(elpaca nil (setup org-agenda ; built-in
|
(elpaca-nil (setup org-agenda ; built-in
|
||||||
(:load-after evil org)
|
(:load-after evil org)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq org-agenda-files `(,org-directory ,user-emacs-directory))
|
(setq org-agenda-files `(,org-directory ,user-emacs-directory))
|
||||||
@@ -107,26 +152,26 @@ When ANYWHERE is non-nil, search beyond the preamble."
|
|||||||
|
|
||||||
;; Org capture.
|
;; Org capture.
|
||||||
|
|
||||||
(elpaca nil (setup org-capture ; built-in
|
(elpaca-nil (setup org-capture ; built-in
|
||||||
;; Org-capture in new tab, rather than split window
|
;; Org-capture in new tab, rather than split window
|
||||||
(:hook delete-other-windows)))
|
(:hook delete-other-windows)))
|
||||||
|
|
||||||
;; Org keys.
|
;; Org keys.
|
||||||
|
|
||||||
(elpaca nil (setup org-keys ; built-in
|
(elpaca-nil (setup org-keys ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq org-return-follows-link t))))
|
(setq org-return-follows-link t))))
|
||||||
|
|
||||||
;; Org links.
|
;; Org links.
|
||||||
|
|
||||||
(elpaca nil (setup ol ; built-in
|
(elpaca-nil (setup ol ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
;; Do not open links to .org files in a split window
|
;; Do not open links to .org files in a split window
|
||||||
(add-to-list 'org-link-frame-setup '(file . find-file)))))
|
(add-to-list 'org-link-frame-setup '(file . find-file)))))
|
||||||
|
|
||||||
;; Org source code blocks.
|
;; Org source code blocks.
|
||||||
|
|
||||||
(elpaca nil (setup org-src ; built-in
|
(elpaca-nil (setup org-src ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq org-edit-src-content-indentation 0)
|
(setq org-edit-src-content-indentation 0)
|
||||||
(setq org-src-fontify-natively t)
|
(setq org-src-fontify-natively t)
|
||||||
@@ -136,15 +181,16 @@ When ANYWHERE is non-nil, search beyond the preamble."
|
|||||||
|
|
||||||
;; Org exporter.
|
;; Org exporter.
|
||||||
|
|
||||||
(elpaca nil (setup ox ; built-in
|
(elpaca-nil (setup ox ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
(setq org-export-coding-system 'utf-8-unix))))
|
(setq org-export-coding-system 'utf-8-unix))))
|
||||||
|
|
||||||
;; Org latex exporter.
|
;; Org latex exporter.
|
||||||
|
|
||||||
(elpaca nil (setup ox-latex ; built-in
|
(elpaca-nil (setup ox-latex ; built-in
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
;; Define how minted (highlighted src code) is added to src code blocks
|
;; Define how minted (highlighted src code) is added to src code blocks
|
||||||
|
;; Requires packages: texlive-bin, texlive-latexextra and python-pygments
|
||||||
(setq org-latex-listings 'minted)
|
(setq org-latex-listings 'minted)
|
||||||
(setq org-latex-minted-options '(("frame" "lines") ("linenos=true")))
|
(setq org-latex-minted-options '(("frame" "lines") ("linenos=true")))
|
||||||
;; Set 'Table of Contents' layout
|
;; Set 'Table of Contents' layout
|
||||||
@@ -233,7 +279,7 @@ When ANYWHERE is non-nil, search beyond the preamble."
|
|||||||
|
|
||||||
;; Enable https://www.orgroam.com/manual.html#org_002droam_002dprotocol, needed to process org-protocol:// links
|
;; Enable https://www.orgroam.com/manual.html#org_002droam_002dprotocol, needed to process org-protocol:// links
|
||||||
|
|
||||||
(elpaca nil (setup org-roam-protocol ; org-roam-protocol.el is part of org-roam
|
(elpaca-nil (setup org-roam-protocol ; org-roam-protocol.el is part of org-roam
|
||||||
(:load-after org-roam)
|
(:load-after org-roam)
|
||||||
(:when-loaded
|
(:when-loaded
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
(setq vertico-previous-directory nil)))
|
(setq vertico-previous-directory nil)))
|
||||||
(advice-add 'vertico--update-candidates :after #'dot/vertico-dired-goto-last-visited))
|
(advice-add 'vertico--update-candidates :after #'dot/vertico-dired-goto-last-visited))
|
||||||
|
|
||||||
(elpaca nil (setup vertico-mouse ; vertico-mouse.el is part of vertico
|
(elpaca-nil (setup vertico-mouse ; vertico-mouse.el is part of vertico
|
||||||
(:load-after vertico)
|
(:load-after vertico)
|
||||||
(:when-loaded (vertico-mouse-mode))))
|
(:when-loaded (vertico-mouse-mode))))
|
||||||
|
|
||||||
|
|||||||
@@ -7,3 +7,11 @@
|
|||||||
[user]
|
[user]
|
||||||
name = Riyyi
|
name = Riyyi
|
||||||
email = riyyi3@gmail.com
|
email = riyyi3@gmail.com
|
||||||
|
[diff]
|
||||||
|
tool = nvimdiff
|
||||||
|
[merge]
|
||||||
|
tool = nvimdiff
|
||||||
|
conflictstyle = diff3
|
||||||
|
[mergetool]
|
||||||
|
prompt = false
|
||||||
|
keepBackup = false
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
pinentry-program /usr/bin/pinentry
|
pinentry-program /usr/bin/pinentry-gtk
|
||||||
|
|
||||||
default-cache-ttl 900
|
default-cache-ttl 900
|
||||||
max-cache-ttl 7200
|
max-cache-ttl 7200
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
[dmenu]
|
[dmenu]
|
||||||
dmenu_command = /usr/bin/rofi -dmenu -i
|
dmenu_command = /usr/bin/rofi -dmenu -i
|
||||||
pinentry = /usr/bin/pinentry
|
pinentry = /usr/bin/pinentry-gtk
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
database_1 = ~/documents/password.kdbx
|
database_1 = ~/documents/password.kdbx
|
||||||
|
keyfile_1 =
|
||||||
pw_cache_period_min = 60
|
pw_cache_period_min = 60
|
||||||
|
autotype_default = {USERNAME}{TAB}{PASSWORD}{ENTER}
|
||||||
|
|
||||||
gui_editor = emacsclient
|
gui_editor = emacsclient
|
||||||
editor = vim
|
editor = vim
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- when opening a .lua file, this file gets executed
|
||||||
|
vim.opt.expandtab = false
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
require("core")
|
||||||
|
require("packages").setup({
|
||||||
|
require("ui"),
|
||||||
|
require("selection"),
|
||||||
|
require("editor"),
|
||||||
|
require("development"),
|
||||||
|
require("git"),
|
||||||
|
})
|
||||||
|
require("keybinds").setup()
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
|
||||||
|
"LuaSnip": { "branch": "master", "commit": "33b06d72d220aa56a7ce80a0dd6f06c70cd82b9d" },
|
||||||
|
"auto-save.nvim": { "branch": "main", "commit": "b58948445c43e6903987a9bb97c82e66fdcc0786" },
|
||||||
|
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
|
||||||
|
"cmp-nvim-lsp": { "branch": "main", "commit": "99290b3ec1322070bcfb9e846450a46f6efa50f0" },
|
||||||
|
"cmp-nvim-lua": { "branch": "main", "commit": "f12408bdb54c39c23e67cab726264c10db33ada8" },
|
||||||
|
"cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
|
||||||
|
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
||||||
|
"dashboard-nvim": { "branch": "master", "commit": "ae309606940d26d8c9df8b048a6e136b6bbec478" },
|
||||||
|
"diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" },
|
||||||
|
"friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" },
|
||||||
|
"gitsigns.nvim": { "branch": "main", "commit": "5f808b5e4fef30bd8aca1b803b4e555da07fc412" },
|
||||||
|
"lazy.nvim": { "branch": "main", "commit": "7c493713bc2cb392706866eeba53aaef6c8e9fc6" },
|
||||||
|
"lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" },
|
||||||
|
"lspsaga.nvim": { "branch": "main", "commit": "2710a0ad97b5aaff404cd4756c296df454b3f726" },
|
||||||
|
"lualine.nvim": { "branch": "master", "commit": "2a5bae925481f999263d6f5ed8361baef8df4f83" },
|
||||||
|
"neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
|
||||||
|
"neogit": { "branch": "master", "commit": "40038473707c54a846bd11ecaf5933dd45858972" },
|
||||||
|
"nvim-base16": { "branch": "master", "commit": "6ac181b5733518040a33017dde654059cd771b7c" },
|
||||||
|
"nvim-cmp": { "branch": "main", "commit": "3403e2e9391ed0a28c3afddd8612701b647c8e26" },
|
||||||
|
"nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" },
|
||||||
|
"nvim-lspconfig": { "branch": "master", "commit": "5a812abc65d529ea7673059a348814c21d7f87ff" },
|
||||||
|
"nvim-treesitter": { "branch": "master", "commit": "337b503688eccb3046547661e4c738e674548fcf" },
|
||||||
|
"nvim-treesitter-textobjects": { "branch": "master", "commit": "ad8f0a472148c3e0ae9851e26a722ee4e29b1595" },
|
||||||
|
"nvim-web-devicons": { "branch": "master", "commit": "e73d2774d12d0ecf9e05578d692ba1ea50508cf2" },
|
||||||
|
"omnisharp-extended-lsp.nvim": { "branch": "main", "commit": "4916fa12e5b28d21a1f031f0bdd10aa15a75d85d" },
|
||||||
|
"plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" },
|
||||||
|
"project.nvim": { "branch": "main", "commit": "8c6bad7d22eef1b71144b401c9f74ed01526a4fb" },
|
||||||
|
"rainbow-delimiters.nvim": { "branch": "master", "commit": "c7e489756b5455f922ce79ac374a4ede594f4a20" },
|
||||||
|
"sqlite.lua": { "branch": "master", "commit": "d0ffd703b56d090d213b497ed4eb840495f14a11" },
|
||||||
|
"telescope-all-recent.nvim": { "branch": "main", "commit": "267e9e5fd13a6e9a4cc6ffe00452d446d040401d" },
|
||||||
|
"telescope-file-browser.nvim": { "branch": "master", "commit": "626998e5c1b71c130d8bc6cf7abb6709b98287bb" },
|
||||||
|
"telescope-fzf-native.nvim": { "branch": "main", "commit": "cf48d4dfce44e0b9a2e19a008d6ec6ea6f01a83b" },
|
||||||
|
"telescope-recent-files": { "branch": "main", "commit": "3a7a1b9c6b52b6ff7938c59f64c87a05e013dff8" },
|
||||||
|
"telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
|
||||||
|
"todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" },
|
||||||
|
"trouble.nvim": { "branch": "main", "commit": "46cf952fc115f4c2b98d4e208ed1e2dce08c9bf6" },
|
||||||
|
"ultimate-autopair.nvim": { "branch": "development", "commit": "9e3209190c22953566ae4e6436ad2b4ff4dabb95" },
|
||||||
|
"vim-sleuth": { "branch": "master", "commit": "be69bff86754b1aa5adcbb527d7fcd1635a84080" },
|
||||||
|
"which-key.nvim": { "branch": "main", "commit": "9b365a6428a9633e3eeb34dbef1b791511c54f70" }
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
require("core.leader-key")
|
||||||
|
require("core.config")
|
||||||
|
require("core.buffers")
|
||||||
|
require("core.autocommands")
|
||||||
|
require("core.globals")
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
local F = require("core.functions")
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
--- Commands ---
|
||||||
|
|
||||||
|
-- Prevent typo
|
||||||
|
vim.cmd [[
|
||||||
|
cnoreabbrev <expr> W (getcmdtype() is# ":" && getcmdline() is# "W") ? ("w") : ("W")
|
||||||
|
cnoreabbrev <expr> Q (getcmdtype() is# ":" && getcmdline() is# "Q") ? ("q") : ("Q")
|
||||||
|
cnoreabbrev <expr> WQ (getcmdtype() is# ":" && getcmdline() is# "WQ") ? ("wq") : ("WQ")
|
||||||
|
cnoreabbrev <expr> Wq (getcmdtype() is# ":" && getcmdline() is# "Wq") ? ("wq") : ("Wq")
|
||||||
|
]]
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
--- Autocommands ---
|
||||||
|
|
||||||
|
-- Cut off trailing whitespace and trailing blank lines
|
||||||
|
vim.api.nvim_create_autocmd({ "BufWritePre" }, {
|
||||||
|
pattern = "*",
|
||||||
|
callback = F.trim_buffer,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Highlight on yank
|
||||||
|
-- See `:help vim.highlight.on_yank()`
|
||||||
|
local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true })
|
||||||
|
vim.api.nvim_create_autocmd("TextYankPost", {
|
||||||
|
pattern = "*",
|
||||||
|
group = highlight_group,
|
||||||
|
callback = function() vim.highlight.on_yank() end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Show message when autosaving
|
||||||
|
local autosave_group = vim.api.nvim_create_augroup("autosave", {})
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
pattern = "AutoSaveWritePost",
|
||||||
|
group = autosave_group,
|
||||||
|
callback = function(opts)
|
||||||
|
if opts.data.saved_buffer ~= nil then
|
||||||
|
local filename = vim.api.nvim_buf_get_name(opts.data.saved_buffer)
|
||||||
|
vim.notify("Wrote " .. filename, vim.log.levels.INFO)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Create an autocommand for full window buffers
|
||||||
|
vim.api.nvim_create_autocmd("BufWinEnter", {
|
||||||
|
-- callback = require("core.buffers").add_buffer
|
||||||
|
callback = function()
|
||||||
|
require("core.buffers").add_buffer()
|
||||||
|
LOG(require("core.buffers").buffers)
|
||||||
|
end,
|
||||||
|
desc = "Track all full window buffers visited",
|
||||||
|
})
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
local F = require("core.functions")
|
||||||
|
|
||||||
|
-- Module for managing buffers, these are used for navigation
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- Buffer table structure:
|
||||||
|
-- {
|
||||||
|
-- "Group" = { "buffer1", "buffer2", active_index = 1 }
|
||||||
|
-- }
|
||||||
|
M.buffers = {}
|
||||||
|
|
||||||
|
M.buffer_default_group = "Other"
|
||||||
|
|
||||||
|
M.buffer_matcher = {
|
||||||
|
-- match = truthy, function() -> thruthy, or string matching buffer filename
|
||||||
|
-- group = string, function() -> string
|
||||||
|
{ match = F.find_project_root, group = F.find_project_root },
|
||||||
|
{ match = true, group = "Other" }, -- default
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
local get_buffer_name = function()
|
||||||
|
local buf = vim.api.nvim_get_current_buf()
|
||||||
|
local buffer_name = vim.api.nvim_buf_get_name(buf)
|
||||||
|
if not buffer_name or buffer_name == "" then return nil end
|
||||||
|
return buffer_name
|
||||||
|
end
|
||||||
|
|
||||||
|
M.add_buffer = function()
|
||||||
|
local buffer_name = get_buffer_name()
|
||||||
|
if not buffer_name then return end
|
||||||
|
|
||||||
|
-- Evaluate group
|
||||||
|
local eval_group = function(config_group)
|
||||||
|
if not config_group then return M.buffer_default_group end
|
||||||
|
if type(config_group) == "function" then return config_group() end
|
||||||
|
return config_group
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add if buffer does not exist yet
|
||||||
|
local add = function(config_group)
|
||||||
|
local group = eval_group(config_group)
|
||||||
|
if not M.buffers[group] then M.buffers[group] = {} end
|
||||||
|
for i, buffer in ipairs(M.buffers[group]) do
|
||||||
|
if buffer == buffer_name then
|
||||||
|
M.buffers[group]["active_index"] = i
|
||||||
|
return group, i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(M.buffers[group], buffer_name)
|
||||||
|
local count = #M.buffers[group]
|
||||||
|
M.buffers[group]["active_index"] = count
|
||||||
|
|
||||||
|
return group, count
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Walk matcher configuration
|
||||||
|
local matcher = M.buffer_matcher or {}
|
||||||
|
if matcher and type(matcher) == "function" then
|
||||||
|
matcher = matcher()
|
||||||
|
end
|
||||||
|
if #matcher == 0 then add(M.buffer_default_group) end
|
||||||
|
for _, config in ipairs(M.buffer_matcher) do
|
||||||
|
if type(config.match) == "function" and config.match() then
|
||||||
|
return add(config.group)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Match path's filename
|
||||||
|
if type(config.match) == "string" and config.match == buffer_name:match("([^/]+)$") then
|
||||||
|
return add(config.group)
|
||||||
|
end
|
||||||
|
|
||||||
|
if type(config.match) == "boolean" and config.match then
|
||||||
|
return add(config.group)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return add(M.buffer_default_group)
|
||||||
|
end
|
||||||
|
|
||||||
|
local get_group_from_buffer = function(buffer_name)
|
||||||
|
for group, buffers in pairs(M.buffers) do
|
||||||
|
for i, buffer in ipairs(buffers) do
|
||||||
|
if buffer == buffer_name then return group, i end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local buffer_action_in_active_group = function(action, direction)
|
||||||
|
local buffer_name = get_buffer_name()
|
||||||
|
if not buffer_name then return end
|
||||||
|
|
||||||
|
local group, index = get_group_from_buffer(buffer_name)
|
||||||
|
if not group then group, index = M.add_buffer() end
|
||||||
|
|
||||||
|
local buffers = M.buffers[group]
|
||||||
|
if #buffers < 2 then return end
|
||||||
|
|
||||||
|
-- Determine the other index
|
||||||
|
local other_index = index + direction
|
||||||
|
if index == 1 and direction == -1 then
|
||||||
|
other_index = #buffers
|
||||||
|
elseif index == #buffers and direction == 1 then
|
||||||
|
other_index = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if action == "move" then
|
||||||
|
for _, buffer in ipairs(vim.api.nvim_list_bufs()) do
|
||||||
|
-- Remove inactive buffers
|
||||||
|
if not vim.api.nvim_buf_is_loaded(buffer) then
|
||||||
|
for i, group_buffer in ipairs(buffers) do
|
||||||
|
if buffer == group_buffer then
|
||||||
|
table.remove(buffers, i)
|
||||||
|
if i > 1 and i <= other_index then
|
||||||
|
other_index = other_index - 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
goto continue
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Make buffer active
|
||||||
|
if vim.api.nvim_buf_get_name(buffer) == buffers[other_index] then
|
||||||
|
vim.api.nvim_set_current_buf(buffer)
|
||||||
|
buffers.active_index = other_index
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
::continue::
|
||||||
|
end
|
||||||
|
elseif action == "swap" then
|
||||||
|
local tmp = buffers[other_index]
|
||||||
|
buffers[other_index] = buffers[index]
|
||||||
|
buffers[index] = tmp
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffers[group] = buffers
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_move_left = function()
|
||||||
|
buffer_action_in_active_group("move", -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_move_right = function()
|
||||||
|
buffer_action_in_active_group("move", 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_swap_left = function()
|
||||||
|
buffer_action_in_active_group("swap", -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_swap_right = function()
|
||||||
|
buffer_action_in_active_group("swap", 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
-- Group move
|
||||||
|
|
||||||
|
local buffer_group_move = function(direction)
|
||||||
|
local buffer_name = get_buffer_name()
|
||||||
|
if not buffer_name then return end
|
||||||
|
|
||||||
|
-- TODO: How to get groups deterministically?
|
||||||
|
|
||||||
|
-- Get active group from the current buffer
|
||||||
|
|
||||||
|
-- Check groups bounds
|
||||||
|
|
||||||
|
-- Change active group
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_group_move_up = function()
|
||||||
|
buffer_group_move(-1)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_group_move_down = function()
|
||||||
|
buffer_group_move(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TODO: functions that can
|
||||||
|
-- v Navigate buffer left
|
||||||
|
-- v Navigate buffer right
|
||||||
|
-- - Navigate group up (use active_index when swapping)
|
||||||
|
-- - Navigate group down
|
||||||
|
-- v Move buffer left
|
||||||
|
-- v Move buffer right
|
||||||
|
-- - Remove buffer from currently active group (decrease active_index)
|
||||||
|
|
||||||
|
return M
|
||||||
|
|
||||||
|
|
||||||
|
-- (cond
|
||||||
|
-- ((string-equal "*" (substring (buffer-name) 0 1)) "Emacs")
|
||||||
|
-- ((or (memq major-mode '(magit-process-mode
|
||||||
|
-- magit-status-mode
|
||||||
|
-- magit-diff-mode
|
||||||
|
-- magit-log-mode
|
||||||
|
-- magit-file-mode
|
||||||
|
-- magit-blob-mode
|
||||||
|
-- magit-blame-mode))
|
||||||
|
-- (string= (buffer-name) "COMMIT_EDITMSG")) "Magit")
|
||||||
|
-- ((project-current) (dot/project-project-name))
|
||||||
|
-- ((memq major-mode '(org-mode
|
||||||
|
-- emacs-lisp-mode)) "Org Mode")
|
||||||
|
-- ((derived-mode-p 'dired-mode) "Dired")
|
||||||
|
-- ((derived-mode-p 'prog-mode
|
||||||
|
-- 'text-mode) "Editing")
|
||||||
|
-- (t "Other")))))
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
--- Behavior ---
|
||||||
|
|
||||||
|
-- vim.opt.autochdir = true
|
||||||
|
vim.opt.clipboard = "unnamedplus"
|
||||||
|
vim.opt.encoding = "utf-8"
|
||||||
|
vim.opt.fileencoding = "utf-8"
|
||||||
|
vim.opt.mouse = "a"
|
||||||
|
vim.opt.scrolloff = 8
|
||||||
|
vim.opt.signcolumn = "yes" -- always show gutter/fringe
|
||||||
|
vim.opt.ttimeoutlen = 0
|
||||||
|
|
||||||
|
-- Case-insensitive searching UNLESS \C or capital in search
|
||||||
|
vim.opt.ignorecase = true
|
||||||
|
vim.opt.smartcase = true
|
||||||
|
|
||||||
|
--- Editing ---
|
||||||
|
|
||||||
|
vim.opt.number = true
|
||||||
|
vim.opt.breakindent = true
|
||||||
|
|
||||||
|
vim.opt.backspace = "indent,eol,start"
|
||||||
|
vim.opt.expandtab = false
|
||||||
|
vim.opt.shiftround = true
|
||||||
|
vim.opt.shiftwidth = 4
|
||||||
|
vim.opt.softtabstop = 4
|
||||||
|
vim.opt.tabstop = 4
|
||||||
|
|
||||||
|
vim.opt.smartindent = true
|
||||||
|
|
||||||
|
vim.opt.wrap = false
|
||||||
|
|
||||||
|
--- Files
|
||||||
|
|
||||||
|
vim.opt.backup = true
|
||||||
|
vim.opt.backupdir = vim.fn.stdpath("cache") .. "/backup"
|
||||||
|
vim.opt.swapfile = false
|
||||||
|
vim.opt.undofile = true
|
||||||
|
vim.opt.undodir = vim.fn.stdpath("cache") .. "/undodir"
|
||||||
|
|
||||||
|
vim.opt.shadafile = vim.fn.stdpath("cache") .. "/netrwhist"
|
||||||
|
|
||||||
|
--- UI ---
|
||||||
|
|
||||||
|
vim.opt.colorcolumn = "81"
|
||||||
|
vim.opt.completeopt = "menuone,noselect"
|
||||||
|
vim.opt.cursorline = true
|
||||||
|
vim.opt.fillchars = vim.opt.fillchars + "diff:╱"
|
||||||
|
vim.opt.showtabline = 0
|
||||||
|
vim.opt.termguicolors = true
|
||||||
|
vim.opt.title = true
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
local M = {}
|
||||||
|
|
||||||
|
M.is_buffer_a_file = function()
|
||||||
|
local buffer_name = vim.fn.bufname()
|
||||||
|
|
||||||
|
return buffer_name ~= "" and vim.fn.filereadable(buffer_name) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
M.get_file_path = function()
|
||||||
|
if not M.is_buffer_a_file() then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
local file_path = vim.fn.expand("%:p")
|
||||||
|
|
||||||
|
return vim.fn.fnamemodify(file_path, ":h") .. "/"
|
||||||
|
end
|
||||||
|
|
||||||
|
M.get_netrw_path = function() -- b:netrw_curdir
|
||||||
|
if vim.fn.expand("#" .. vim.fn.bufnr()) == "0" then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
return vim.fn.fnamemodify(vim.fn.bufname(), ":p")
|
||||||
|
end
|
||||||
|
|
||||||
|
M.get_current_directory = function()
|
||||||
|
return M.get_file_path() or M.get_netrw_path() or vim.fn.getcwd()
|
||||||
|
end
|
||||||
|
|
||||||
|
M.find_project_root = function()
|
||||||
|
local current_directory = M.get_current_directory()
|
||||||
|
|
||||||
|
local directory = current_directory
|
||||||
|
while directory ~= "/" do
|
||||||
|
local git_path = vim.loop.fs_stat(directory .. "/.git")
|
||||||
|
if git_path then
|
||||||
|
return directory:gsub("/$", "") -- remove trailing slash
|
||||||
|
end
|
||||||
|
|
||||||
|
local project_file = vim.loop.fs_stat(directory .. "/.project")
|
||||||
|
if project_file and project_file.type == "file" then
|
||||||
|
return directory:gsub("/$", "") -- remove trailing slash
|
||||||
|
end
|
||||||
|
|
||||||
|
directory = vim.fn.fnamemodify(directory, ":h")
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil, current_directory
|
||||||
|
end
|
||||||
|
|
||||||
|
-- This will merge tables with index-value pairs and keep the unique values
|
||||||
|
M.table_merge_unique = function(...)
|
||||||
|
local result = {}
|
||||||
|
local seen_values = {}
|
||||||
|
for _, value in ipairs(vim.tbl_flatten(...)) do
|
||||||
|
if not seen_values[value] then
|
||||||
|
seen_values[value] = true
|
||||||
|
table.insert(result, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Cut off trailing whitespace and trailing blank lines
|
||||||
|
-- https://vi.stackexchange.com/questions/37421/how-to-remove-neovim-trailing-white-space
|
||||||
|
-- https://stackoverflow.com/questions/7495932/how-can-i-trim-blank-lines-at-the-end-of-file-in-vim
|
||||||
|
M.trim_buffer = function()
|
||||||
|
local save_cursor = vim.fn.getpos(".")
|
||||||
|
pcall(function() vim.cmd([[%s/\s\+$//e]]) end)
|
||||||
|
pcall(function() vim.cmd([[%s#\($\n\s*\)\+\%$##]]) end)
|
||||||
|
vim.fn.setpos(".", save_cursor)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
-- Usage:
|
||||||
|
-- :lua P("Hello World!")
|
||||||
|
P = function(v)
|
||||||
|
print(vim.inspect(v))
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
|
||||||
|
RELOAD = function(...)
|
||||||
|
return require("plenary.reload").reload_module(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
R = function(name)
|
||||||
|
RELOAD(name)
|
||||||
|
return require(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
LOG = function(v)
|
||||||
|
vim.fn.writefile({ vim.inspect(v) }, "/tmp/nvim-log", "a")
|
||||||
|
end
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
-- Set <space> as the leader key
|
||||||
|
-- See `:help mapleader`
|
||||||
|
-- NOTE: Must happen before plugins are required (otherwise wrong leader will be used)
|
||||||
|
vim.keymap.set({ "n", "v" }, "<Space>", "<Nop>", { silent = true })
|
||||||
|
vim.g.mapleader = " "
|
||||||
|
vim.g.maplocalleader = " "
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
return {
|
||||||
|
|
||||||
|
-- Autocompletion
|
||||||
|
{
|
||||||
|
"hrsh7th/nvim-cmp",
|
||||||
|
lazy = true, -- defer
|
||||||
|
dependencies = {
|
||||||
|
-- Snippet Engine & its associated nvim-cmp source
|
||||||
|
"L3MON4D3/LuaSnip",
|
||||||
|
"saadparwaiz1/cmp_luasnip",
|
||||||
|
|
||||||
|
-- Adds LSP completion capabilities
|
||||||
|
"hrsh7th/cmp-nvim-lsp", -- source for neovim"s built-in LSP client
|
||||||
|
"hrsh7th/cmp-nvim-lua", -- source for neovim"s Lua API
|
||||||
|
"hrsh7th/cmp-buffer",
|
||||||
|
"hrsh7th/cmp-path",
|
||||||
|
|
||||||
|
-- Adds a number of user-friendly snippets
|
||||||
|
"rafamadriz/friendly-snippets",
|
||||||
|
|
||||||
|
-- Icons in the completion menu
|
||||||
|
"onsails/lspkind.nvim",
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
local luasnip = require("luasnip")
|
||||||
|
require("luasnip.loaders.from_vscode").lazy_load()
|
||||||
|
luasnip.config.setup({})
|
||||||
|
|
||||||
|
require("cmp").setup({
|
||||||
|
snippet = {
|
||||||
|
expand = function(args)
|
||||||
|
luasnip.lsp_expand(args.body)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
completion = {
|
||||||
|
completeopt = "menu,menuone,noinsert",
|
||||||
|
},
|
||||||
|
sources = {
|
||||||
|
{ name = "nvim_lsp" },
|
||||||
|
{ name = "nvim_lua" },
|
||||||
|
{ name = "luasnip" },
|
||||||
|
{ name = "buffer" },
|
||||||
|
{ name = "path" },
|
||||||
|
},
|
||||||
|
formatting = {
|
||||||
|
fields = { "kind", "abbr", "menu" },
|
||||||
|
-- https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance#how-to-get-types-on-the-left-and-offset-the-menu
|
||||||
|
-- https://github.com/onsails/lspkind.nvim#option-2-nvim-cmp
|
||||||
|
format = function(entry, vim_item)
|
||||||
|
local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50 })(entry,
|
||||||
|
vim_item)
|
||||||
|
local strings = vim.split(kind.kind, "%s", { trimempty = true })
|
||||||
|
kind.kind = strings[1] or ""
|
||||||
|
kind.menu = " (" .. (strings[2] or "") .. ")"
|
||||||
|
|
||||||
|
return kind
|
||||||
|
end,
|
||||||
|
expandable_indicator = true,
|
||||||
|
},
|
||||||
|
mapping = require("keybinds").nvim_cmp(),
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- LSP Configuration & Plugins
|
||||||
|
{ -- https://github.com/neovim/nvim-lspconfig
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
dependencies = {
|
||||||
|
-- Improve the built-in LSP UI
|
||||||
|
"nvimdev/lspsaga.nvim",
|
||||||
|
-- Additional lua configuration, makes Nvim stuff amazing!
|
||||||
|
"folke/neodev.nvim",
|
||||||
|
-- C# "Goto Definition" with decompilation support
|
||||||
|
"Hoffs/omnisharp-extended-lsp.nvim",
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
-- Setup neovim Lua configuration
|
||||||
|
require("lspsaga").setup() -- ?? does this do anything with doc hover
|
||||||
|
require("neodev").setup()
|
||||||
|
|
||||||
|
-- Vim process
|
||||||
|
local pid = vim.fn.getpid()
|
||||||
|
|
||||||
|
-- Setup language servers
|
||||||
|
-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
|
||||||
|
local servers = {
|
||||||
|
clangd = {}, -- C/C++
|
||||||
|
intelephense = {}, -- PHP
|
||||||
|
lua_ls = { -- Lua, via lua-language-server
|
||||||
|
settings = {
|
||||||
|
Lua = {
|
||||||
|
workspace = { checkThirdParty = false },
|
||||||
|
telemetry = { enable = false },
|
||||||
|
diagnostics = {
|
||||||
|
-- Ignore Lua_LS's noisy `missing-fields` warnings
|
||||||
|
disable = { "missing-fields" },
|
||||||
|
-- Ignore Lua_LS's noise `undefined global` warnings
|
||||||
|
globals = { "vim" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
omnisharp = { -- C#, via omnisharp-roslyn-bin
|
||||||
|
cmd = { "/usr/bin/omnisharp", "--languageserver", "--hostPID", tostring(pid) },
|
||||||
|
handlers = {
|
||||||
|
["textDocument/definition"] = require('omnisharp_extended').handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ts_ls = {
|
||||||
|
init_options = {
|
||||||
|
plugins = {
|
||||||
|
{
|
||||||
|
name = '@vue/typescript-plugin',
|
||||||
|
location = '/home/rick/.cache/.bun/install/global/node_modules/@vue/language-server',
|
||||||
|
languages = { 'vue' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx', 'vue', },
|
||||||
|
-- filetypes = { 'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue' },
|
||||||
|
-- requires: bun install -g typescript-language-server
|
||||||
|
-- TODO: Update which-key config, maybe other packages
|
||||||
|
-- Sources:
|
||||||
|
-- https://github.com/vuejs/language-tools?tab=readme-ov-file#hybrid-mode-configuration-requires-vuelanguage-server-version-200
|
||||||
|
-- https://github.com/neovim/nvim-lspconfig/blob/master/lua/lspconfig/configs/ts_ls.lua#L4
|
||||||
|
},
|
||||||
|
volar = {
|
||||||
|
-- init_options = {
|
||||||
|
-- vue = {
|
||||||
|
-- hybridMode = false,
|
||||||
|
-- },
|
||||||
|
-- },
|
||||||
|
},
|
||||||
|
-- volar = {
|
||||||
|
-- -- init_options = {
|
||||||
|
-- -- typescript = {
|
||||||
|
-- -- serverPath = '/home/rick/.cache/.bun/install/global/node_modules/typescript/lib//tsserverlibrary.js'
|
||||||
|
-- -- }
|
||||||
|
-- -- },
|
||||||
|
-- -- filetypes = {'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue', 'json'}
|
||||||
|
-- },
|
||||||
|
}
|
||||||
|
|
||||||
|
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
|
||||||
|
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
||||||
|
capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities)
|
||||||
|
|
||||||
|
for server, _ in pairs(servers) do
|
||||||
|
local opts = vim.tbl_extend("keep", servers[server], {
|
||||||
|
capabilities = capabilities,
|
||||||
|
on_attach = require("keybinds").lspconfig_on_attach,
|
||||||
|
})
|
||||||
|
-- P(server)
|
||||||
|
-- P(opts)
|
||||||
|
require("lspconfig")[server].setup(opts)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Project
|
||||||
|
{
|
||||||
|
"ahmedkhalf/project.nvim",
|
||||||
|
opts = {
|
||||||
|
detection_methods = { "lsp", "pattern" },
|
||||||
|
patterns = { ".git", ".project" },
|
||||||
|
datapath = vim.fn.stdpath("cache"),
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
-- Add syncing between project.nvim and dashboard-nvim project entries.
|
||||||
|
-- NOTE: Must come before the project.nvim setup(),
|
||||||
|
-- so the glue's VimLeavePre autocmd is defined before it.
|
||||||
|
local F = require("core.functions")
|
||||||
|
vim.api.nvim_create_autocmd("VimLeavePre", {
|
||||||
|
pattern = "*",
|
||||||
|
callback = function()
|
||||||
|
-- Fetch project.nvim projects
|
||||||
|
local project = require("project_nvim.project")
|
||||||
|
local history = require("project_nvim.utils.history")
|
||||||
|
local recent = history.recent_projects or {}
|
||||||
|
local session = history.session_projects or {}
|
||||||
|
local recent_plus_session = F.table_merge_unique(recent, session)
|
||||||
|
|
||||||
|
-- Fetch dashboard-nvim projects
|
||||||
|
local utils = require("dashboard.utils")
|
||||||
|
local path = utils.path_join(vim.fn.stdpath("cache"), "dashboard/cache")
|
||||||
|
local projects = utils.read_project_cache(path) or {}
|
||||||
|
|
||||||
|
-- Add any projects that project.nvim uniquely knows about to dashboard-nvim
|
||||||
|
local all_projects = F.table_merge_unique(recent_plus_session, projects)
|
||||||
|
vim.fn.writefile({ "return " .. vim.inspect(all_projects) }, path)
|
||||||
|
|
||||||
|
-- Add any projects that dashboard-nvim uniquely knows about to project.nvim
|
||||||
|
for _, value in ipairs(projects) do
|
||||||
|
if not vim.tbl_contains(recent_plus_session, value) then
|
||||||
|
pcall(project.set_pwd, value, "manual") -- skip non-existent directories, dont error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
require("project_nvim").setup(opts)
|
||||||
|
require("telescope").load_extension("projects")
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
return {
|
||||||
|
|
||||||
|
-- Detect tabstop and shiftwidth automatically
|
||||||
|
"tpope/vim-sleuth",
|
||||||
|
|
||||||
|
-- "gc" to comment visual regions/lines
|
||||||
|
"numToStr/Comment.nvim",
|
||||||
|
|
||||||
|
-- Highlight, edit, and navigate code
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-treesitter/nvim-treesitter-textobjects",
|
||||||
|
},
|
||||||
|
build = ":TSUpdate",
|
||||||
|
opts = {
|
||||||
|
ensure_installed = {
|
||||||
|
"bash", "c", "cmake", "cpp", "c_sharp", "css", "go",
|
||||||
|
"haskell", "html", "java", "javascript", "jsdoc", "json",
|
||||||
|
"latex", "lua", "make", "markdown", "php", "python",
|
||||||
|
"query", "regex", "rust", "toml", "tsx", "typescript",
|
||||||
|
"vim", "vimdoc", "yaml",
|
||||||
|
},
|
||||||
|
sync_install = false,
|
||||||
|
auto_install = true,
|
||||||
|
|
||||||
|
-- Default install directory is <plugin_path>/parser
|
||||||
|
-- parser_install_dir
|
||||||
|
|
||||||
|
highlight = {
|
||||||
|
enable = true,
|
||||||
|
additional_vim_regex_highlighting = false,
|
||||||
|
},
|
||||||
|
indent = {
|
||||||
|
enable = true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Auto-save
|
||||||
|
{
|
||||||
|
"okuuva/auto-save.nvim",
|
||||||
|
cmd = "ASToggle", -- defer, until run command
|
||||||
|
event = { "InsertLeave", "TextChanged" }, -- defer, until event trigger
|
||||||
|
opts = {
|
||||||
|
debounce_delay = 5000, -- delay for `defer_save`, in ms
|
||||||
|
condition = function(buf)
|
||||||
|
-- Dont save special-buffers
|
||||||
|
return vim.fn.getbufvar(buf, "&buftype") == ""
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
require("auto-save").setup(opts)
|
||||||
|
|
||||||
|
-- Cut off trailing whitespace and trailing blank lines
|
||||||
|
local group = vim.api.nvim_create_augroup("AutoSave", { clear = false })
|
||||||
|
local core = require("core.functions")
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
pattern = "AutoSaveWritePre",
|
||||||
|
group = group,
|
||||||
|
callback = function(event)
|
||||||
|
if event.data.saved_buffer ~= nil then
|
||||||
|
core.trim_buffer()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Autopair / electric pair
|
||||||
|
{ -- https://github.com/altermo/ultimate-autopair.nvim
|
||||||
|
"altermo/ultimate-autopair.nvim",
|
||||||
|
event = { "InsertEnter", "CmdlineEnter" }, -- defer
|
||||||
|
branch = "development",
|
||||||
|
opts = {
|
||||||
|
bs = { -- See: `:h ultimate-autopair-map-backspace-config`
|
||||||
|
-- Call the backspace logic from the config, instead of automap
|
||||||
|
-- https://github.com/altermo/ultimate-autopair.nvim/issues/60
|
||||||
|
map = "<Plug>ultimate-autopair-BS",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
return {
|
||||||
|
|
||||||
|
-- Adds git related signs to the gutter/fringe
|
||||||
|
{
|
||||||
|
"lewis6991/gitsigns.nvim",
|
||||||
|
opts = {
|
||||||
|
-- See `:help gitsigns.txt`
|
||||||
|
signs = {
|
||||||
|
add = { text = "█" },
|
||||||
|
change = { text = "█" },
|
||||||
|
delete = { text = "█" },
|
||||||
|
topdelete = { text = "█" },
|
||||||
|
changedelete = { text = "█" },
|
||||||
|
untracked = { text = "┆" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Magit clone
|
||||||
|
{
|
||||||
|
"NeogitOrg/neogit",
|
||||||
|
cmd = "Neogit", -- defer
|
||||||
|
lazy = true,
|
||||||
|
dependencies = {
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
|
||||||
|
"sindrets/diffview.nvim", -- diff integration
|
||||||
|
-- { "sindrets/diffview.nvim", opts = { enhanced_diff_hl = true } }, -- diff integration
|
||||||
|
},
|
||||||
|
opts = {},
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,309 @@
|
|||||||
|
local builtin
|
||||||
|
local telescope
|
||||||
|
|
||||||
|
local F = require("core.functions")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
M.setup = function()
|
||||||
|
-- Prevent dependency loop
|
||||||
|
builtin = require("telescope.builtin")
|
||||||
|
telescope = require("telescope")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Set which-key key section description
|
||||||
|
M.wk = function(keybind, description, bufnr)
|
||||||
|
require("which-key").add({
|
||||||
|
{ keybind, group = description, mode = { "n", "v" }, buffer = bufnr },
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_close = function()
|
||||||
|
-- Check if there are more than 2 buffers and alternate file is set
|
||||||
|
local command = vim.fn.expand("#") ~= "" and #vim.fn.getbufinfo({ buflisted = 1 }) > 1
|
||||||
|
and "e #|bd #|bwipeout #" -- see `:h c_#`
|
||||||
|
or "bd"
|
||||||
|
vim.api.nvim_command(command)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.buffer_dashboard = function()
|
||||||
|
vim.api.nvim_command("Dashboard")
|
||||||
|
end
|
||||||
|
|
||||||
|
M.file_config = function()
|
||||||
|
builtin.find_files({
|
||||||
|
prompt_title = "Nvim Config",
|
||||||
|
cwd = vim.fn.stdpath("config"),
|
||||||
|
hidden = true,
|
||||||
|
no_ignore = true,
|
||||||
|
-- path_display = { "shorten" },
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.file_find = function()
|
||||||
|
telescope.extensions.file_browser.file_browser({
|
||||||
|
cwd = F.get_current_directory(),
|
||||||
|
hidden = true,
|
||||||
|
no_ignore = true,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.file_find_home = function()
|
||||||
|
telescope.extensions.file_browser.file_browser({
|
||||||
|
cwd = "~",
|
||||||
|
hidden = true,
|
||||||
|
no_ignore = true,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.file_find_recent = function()
|
||||||
|
telescope.extensions.recent_files.pick()
|
||||||
|
end
|
||||||
|
|
||||||
|
M.file_save = function()
|
||||||
|
vim.api.nvim_command("w")
|
||||||
|
end
|
||||||
|
|
||||||
|
M.goto_trouble = function()
|
||||||
|
vim.api.nvim_command("Trouble")
|
||||||
|
end
|
||||||
|
|
||||||
|
M.goto_todos_telescope = function()
|
||||||
|
vim.api.nvim_command("TodoTelescope")
|
||||||
|
end
|
||||||
|
|
||||||
|
M.goto_todos_trouble = function()
|
||||||
|
vim.api.nvim_command("TodoTrouble")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Smart delete
|
||||||
|
M.hungry_delete = function()
|
||||||
|
return function()
|
||||||
|
local start_line = vim.fn.line(".")
|
||||||
|
local start_col = vim.fn.col(".")
|
||||||
|
local start_line_content = vim.fn.getline(start_line)
|
||||||
|
local line_length = start_line_content:len()
|
||||||
|
|
||||||
|
-- Check if there are multiple whitespace characters after the cursor
|
||||||
|
local is_1_whitespace = start_line_content:sub(start_col, start_col):match("%s")
|
||||||
|
local is_2_whitespace = start_line_content:sub(start_col + 1, start_col + 1):match("%s")
|
||||||
|
if (start_col <= line_length - 1 and is_1_whitespace and is_2_whitespace)
|
||||||
|
or (start_col == line_length and is_1_whitespace)
|
||||||
|
or start_col - 1 == line_length then -- in insert mode, the column is 1 higher
|
||||||
|
-- Hungry delete
|
||||||
|
|
||||||
|
-- Iterate forwards through each line and character
|
||||||
|
local last_line = vim.fn.line("$")
|
||||||
|
for line = start_line, last_line do
|
||||||
|
local line_content = (line == start_line) and start_line_content or vim.fn.getline(line)
|
||||||
|
local col = (line == start_line) and start_col or 1
|
||||||
|
|
||||||
|
for c = col, #line_content do
|
||||||
|
local char = line_content:sub(c, c)
|
||||||
|
|
||||||
|
-- Look until it hits a non-whitespace character
|
||||||
|
if not vim.fn.strcharpart(char, 0, 1):match("%s") then
|
||||||
|
-- Delete empty lines, from the starting line to the current line
|
||||||
|
vim.api.nvim_buf_set_lines(0, start_line - 1, line - 1, false, {})
|
||||||
|
|
||||||
|
-- Keep the content that was before the cursor at the start_line,
|
||||||
|
-- plus the content from the current column to the end of the current line
|
||||||
|
vim.fn.setline(start_line,
|
||||||
|
start_line_content:sub(1, start_col - 1) .. line_content:sub(c))
|
||||||
|
|
||||||
|
vim.fn.cursor({ start_line, start_col })
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Delete empty lines, if the end of the buffer was only whitespace
|
||||||
|
vim.api.nvim_buf_set_lines(0, start_line - 1, last_line, false, {})
|
||||||
|
|
||||||
|
-- Keep the content that was before the cursor
|
||||||
|
vim.fn.setline(start_line, start_line_content:sub(1, start_col - 1))
|
||||||
|
|
||||||
|
vim.fn.cursor({ start_line, start_col })
|
||||||
|
else
|
||||||
|
-- Normal delete
|
||||||
|
vim.cmd("normal! x")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Smart backspace
|
||||||
|
M.hungry_delete_backspace = function()
|
||||||
|
-- Cache some values
|
||||||
|
local core = require("ultimate-autopair.core")
|
||||||
|
local keycode = vim.api.nvim_replace_termcodes("<Plug>ultimate-autopair-BS", true, false, true)
|
||||||
|
local fallback = vim.api.nvim_replace_termcodes("<C-h>", true, false, true) -- <BS> => <C-h>, \b
|
||||||
|
|
||||||
|
return function()
|
||||||
|
local start_line = vim.fn.line(".")
|
||||||
|
local start_col = vim.fn.col(".")
|
||||||
|
local start_line_content = vim.fn.getline(start_line)
|
||||||
|
|
||||||
|
-- Check if there are multiple whitespace characters before the cursor
|
||||||
|
local is_1_whitespace = start_line_content:sub(start_col - 1, start_col - 1):match("%s")
|
||||||
|
local is_2_whitespace = start_line_content:sub(start_col - 2, start_col - 2):match("%s")
|
||||||
|
if (start_col >= 3 and is_1_whitespace and is_2_whitespace)
|
||||||
|
or (start_col == 2 and is_1_whitespace)
|
||||||
|
or start_col == 1 then
|
||||||
|
-- Hungry delete
|
||||||
|
|
||||||
|
-- Iterate backwards through each line and character
|
||||||
|
for line = start_line, 1, -1 do
|
||||||
|
local line_content = (line == start_line) and start_line_content or vim.fn.getline(line)
|
||||||
|
local col = (line == start_line) and (start_col - 1) or #line_content
|
||||||
|
|
||||||
|
for c = col, 1, -1 do
|
||||||
|
local char = line_content:sub(c, c)
|
||||||
|
|
||||||
|
-- Look until it hits a non-whitespace character
|
||||||
|
if not vim.fn.strcharpart(char, 0, 1):match("%s") then
|
||||||
|
-- Delete empty lines, from the starting line to the current line
|
||||||
|
vim.api.nvim_buf_set_lines(0, line - 1, start_line - 1, false, {})
|
||||||
|
|
||||||
|
-- Keep the content from the start of the current line to the current column,
|
||||||
|
-- plus the content that was after the cursor at the start_line
|
||||||
|
vim.fn.setline(line, line_content:sub(1, c) .. (line == start_line
|
||||||
|
and line_content:sub(start_col) -- found non-whitespace on the same line it started
|
||||||
|
or start_line_content:sub(start_col))) -- jumped through empty lines
|
||||||
|
|
||||||
|
vim.fn.cursor({ line, c + 1 })
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Delete empty lines, if the start of the buffer was only whitespace
|
||||||
|
vim.api.nvim_buf_set_lines(0, 0, start_line - 1, false, {})
|
||||||
|
|
||||||
|
-- Keep the content that was after the cursor
|
||||||
|
vim.fn.setline(1, "" .. start_line_content:sub(start_col))
|
||||||
|
else
|
||||||
|
-- Normal backspace, prevent run_run recursive mapping via fallback to \b
|
||||||
|
local actions = core.run_run(keycode)
|
||||||
|
vim.api.nvim_feedkeys(actions ~= keycode and actions or fallback, "n", false) -- equivalent to { expr = true }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
M.lsp_format_buffer = function()
|
||||||
|
vim.lsp.buf.format({
|
||||||
|
formatting_options = {
|
||||||
|
tabSize = 4,
|
||||||
|
insertSpaces = false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.project_file = function()
|
||||||
|
local res, err = F.find_project_root()
|
||||||
|
if res then
|
||||||
|
builtin.git_files({ cwd = res })
|
||||||
|
else -- fall-back to find_files, if current buffer isnt in a project
|
||||||
|
builtin.find_files({ cwd = err })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
M.project_grep = function()
|
||||||
|
local res, err = F.find_project_root()
|
||||||
|
builtin.live_grep({ cwd = res or err })
|
||||||
|
end
|
||||||
|
|
||||||
|
M.project_list = function()
|
||||||
|
telescope.extensions.projects.projects()
|
||||||
|
end
|
||||||
|
|
||||||
|
M.search_buffer = function()
|
||||||
|
builtin.current_buffer_fuzzy_find({
|
||||||
|
previewer = false,
|
||||||
|
sorting_strategy = "ascending",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TODO: Temporary copy/pasted until project_nvim exposes this function
|
||||||
|
-- https://github.com/ahmedkhalf/project.nvim/issues/145
|
||||||
|
-- TODO: Create a Telescope extension out of this, for telescope-all-recent
|
||||||
|
local function create_finder()
|
||||||
|
local results = require("project_nvim").get_recent_projects()
|
||||||
|
local entry_display = require("telescope.pickers.entry_display")
|
||||||
|
local finders = require("telescope.finders")
|
||||||
|
|
||||||
|
-- Reverse results
|
||||||
|
for i = 1, math.floor(#results / 2) do
|
||||||
|
results[i], results[#results - i + 1] = results[#results - i + 1], results[i]
|
||||||
|
end
|
||||||
|
local displayer = entry_display.create({
|
||||||
|
separator = " ",
|
||||||
|
items = {
|
||||||
|
{
|
||||||
|
width = 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
remaining = true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
local function make_display(entry)
|
||||||
|
return displayer({ entry.name, { entry.value, "Comment" } })
|
||||||
|
end
|
||||||
|
|
||||||
|
return finders.new_table({
|
||||||
|
results = results,
|
||||||
|
entry_maker = function(entry)
|
||||||
|
local name = vim.fn.fnamemodify(entry, ":t")
|
||||||
|
return {
|
||||||
|
display = make_display,
|
||||||
|
name = name,
|
||||||
|
value = entry,
|
||||||
|
ordinal = name .. " " .. entry,
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.vc_select_repo = function()
|
||||||
|
-- local projects = require("project_nvim").get_recent_projects()
|
||||||
|
|
||||||
|
local actions = require("telescope.actions")
|
||||||
|
local action_state = require("telescope.actions.state")
|
||||||
|
local conf = require("telescope.config").values
|
||||||
|
-- local finders = require("telescope.finders")
|
||||||
|
local pickers = require("telescope.pickers")
|
||||||
|
pickers.new({}, {
|
||||||
|
prompt_title = "Select Project",
|
||||||
|
finder = create_finder(),
|
||||||
|
-- finder = telescope.extensions.projects.create_finder(),
|
||||||
|
-- finder = finders.new_table {
|
||||||
|
-- results = projects,
|
||||||
|
-- },
|
||||||
|
previewer = false,
|
||||||
|
sorter = conf.generic_sorter({}),
|
||||||
|
attach_mappings = function(prompt_bufnr)
|
||||||
|
actions.select_default:replace(function()
|
||||||
|
actions.close(prompt_bufnr)
|
||||||
|
|
||||||
|
local selection = action_state.get_selected_entry()
|
||||||
|
-- require("neogit").open({ cwd = selection[1] })
|
||||||
|
require("neogit").open({ cwd = selection.value })
|
||||||
|
end)
|
||||||
|
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
}):find()
|
||||||
|
end
|
||||||
|
|
||||||
|
M.vc_status = function()
|
||||||
|
if F.find_project_root() then
|
||||||
|
-- Open the repository of the current file
|
||||||
|
require("neogit").open({ cwd = "%:p:h" })
|
||||||
|
else
|
||||||
|
-- Pick a project to open
|
||||||
|
M.vc_select_repo()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
local K = vim.keymap.set
|
||||||
|
|
||||||
|
local builtin
|
||||||
|
local wk = require("which-key")
|
||||||
|
|
||||||
|
local F = require("keybind-functions")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
--- Keybindings ---
|
||||||
|
|
||||||
|
M.setup = function()
|
||||||
|
F.setup()
|
||||||
|
|
||||||
|
-- Prevent dependency loop
|
||||||
|
builtin = require("telescope.builtin")
|
||||||
|
|
||||||
|
-- Change default behavior
|
||||||
|
K("n", "Y", "y$")
|
||||||
|
K("v", "p", "pgvy")
|
||||||
|
|
||||||
|
K("n", "J", "mzJ`z") -- dont move cursor to end of line
|
||||||
|
|
||||||
|
K("n", "<C-d>", "<C-d>zz") -- stay in the middle
|
||||||
|
K("n", "<C-u>", "<C-u>zz")
|
||||||
|
K("n", "n", "nzzzv")
|
||||||
|
K("n", "N", "Nzzzv")
|
||||||
|
|
||||||
|
K("x", "p", "\"_dP") -- dont overwrite clipboard when pasting visually
|
||||||
|
|
||||||
|
-- Remap for dealing with word wrap
|
||||||
|
K("n", "k", [[v:count == 0 ? "gk" : "k"]], { expr = true, silent = true })
|
||||||
|
K("n", "j", [[v:count == 0 ? "gj" : "j"]], { expr = true, silent = true })
|
||||||
|
|
||||||
|
-- Tab/Shift+Tab functionality
|
||||||
|
K("n", "<Tab>", ">>_")
|
||||||
|
K("n", "<S-Tab>", "<<_")
|
||||||
|
K("i", "<S-Tab>", "<C-D>")
|
||||||
|
K("v", "<Tab>", ">gv")
|
||||||
|
K("v", "<S-Tab>", "<gv")
|
||||||
|
|
||||||
|
-- Move highlighted blocks
|
||||||
|
K("v", "J", ":m '>+1<CR>gv=gv")
|
||||||
|
K("v", "K", ":m '<-2<CR>gv=gv")
|
||||||
|
|
||||||
|
-- Switch to previous buffer
|
||||||
|
K("n", "<M-`>", "<C-6>")
|
||||||
|
|
||||||
|
-- Center buffer with Ctrl+L
|
||||||
|
K("n", "<C-l>", "zz")
|
||||||
|
|
||||||
|
-- Close buffer with Alt-w
|
||||||
|
K("n", "<M-w>", F.buffer_close)
|
||||||
|
|
||||||
|
-- Hungry delete
|
||||||
|
K("i", "<BS>", F.hungry_delete_backspace())
|
||||||
|
K("i", "<Del>", F.hungry_delete())
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
--- Leader keys ---
|
||||||
|
|
||||||
|
|
||||||
|
K("n", "<leader><space>", builtin.commands, { desc = "Execute command" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>b", "buffer/bookmark")
|
||||||
|
K("n", "<leader>bb", builtin.buffers, { desc = "Switch buffer" })
|
||||||
|
K("n", "<leader>bd", F.buffer_dashboard, { desc = "Dashboard" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>c", "comment")
|
||||||
|
-- numToStr/Comment.nvim
|
||||||
|
K("n", "<leader>cc", "<Plug>(comment_toggle_linewise_current)", { desc = "Comment toggle linewise" })
|
||||||
|
K("n", "<leader>cp", "<Plug>(comment_toggle_blockwise_current)", { desc = "Comment toggle blockwise" })
|
||||||
|
K("x", "<leader>cc", "<Plug>(comment_toggle_linewise_visual)", { desc = "Comment toggle linewise (visual)" })
|
||||||
|
K("x", "<leader>cp", "<Plug>(comment_toggle_blockwise_visual)", { desc = "Comment toggle blockwise (visual)" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>e", "eval")
|
||||||
|
K("n", "<leader>eb", ":w<CR>:source %<CR>", { desc = "Evaluate buffer" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>f", "file")
|
||||||
|
K("n", "<leader>fc", F.file_config, { desc = "Config file" })
|
||||||
|
K("n", "<leader>ff", F.file_find, { desc = "Find file" })
|
||||||
|
K("n", "<leader>fh", F.file_find_home, { desc = "Find file in ~" })
|
||||||
|
K("n", "<leader>fr", F.file_find_recent, { desc = "Find recent file" })
|
||||||
|
K("n", "<leader>fs", F.file_save, { desc = "Save file" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>h", "help")
|
||||||
|
K("n", "<leader>hh", builtin.help_tags, { desc = "Describe" })
|
||||||
|
K("n", "<leader>hk", builtin.keymaps, { desc = "Describe key" })
|
||||||
|
K("n", "<leader>hm", builtin.man_pages, { desc = "Describe manpage" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>g", "goto")
|
||||||
|
K("n", "<leader>ge", F.goto_trouble, { desc = "Goto trouble" })
|
||||||
|
K("n", "<leader>gt", F.goto_todos_telescope, { desc = "Goto todos (Telescope)" })
|
||||||
|
K("n", "<leader>gT", F.goto_todos_trouble, { desc = "Goto todos (Trouble)" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>p", "project")
|
||||||
|
K("n", "<leader>pf", F.project_file, { desc = "Find project file" })
|
||||||
|
K("n", "<leader>pg", F.project_grep, { desc = "Find in project" })
|
||||||
|
K("n", "<leader>pp", F.project_list, { desc = "List projects" })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>s", "search")
|
||||||
|
K("n", "<leader>ss", F.search_buffer, { desc = "Search buffer" })
|
||||||
|
K("n", "<leader>sq", ":nohlsearch<CR>", { desc = "Stop search", silent = true })
|
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>v", "git") -- version control
|
||||||
|
K("n", "<leader>vr", F.vc_select_repo, { desc = "Select repo" })
|
||||||
|
K("n", "<leader>vv", F.vc_status, { desc = "Neogit status" })
|
||||||
|
|
||||||
|
|
||||||
|
K({ "n", "v" }, "<leader>w", "<C-W>", { remap = true }) -- keymap and which-key should *both* be triggered
|
||||||
|
wk.add({
|
||||||
|
{
|
||||||
|
mode = { "n", "v" },
|
||||||
|
{ "<leader>w", group = "window" },
|
||||||
|
{ "<leader>w+", desc = "Increase height" },
|
||||||
|
{ "<leader>w-", desc = "Decrease height" },
|
||||||
|
{ "<leader>w<", desc = "Decrease width" },
|
||||||
|
{ "<leader>w=", desc = "Equally high and wide" },
|
||||||
|
{ "<leader>w>", desc = "Increase width" },
|
||||||
|
{ "<leader>wT", desc = "Break out into a new tab" },
|
||||||
|
{ "<leader>w_", desc = "Max out the height" },
|
||||||
|
{ "<leader>wh", desc = "Go to the left window" },
|
||||||
|
{ "<leader>wj", desc = "Go to the down window" },
|
||||||
|
{ "<leader>wk", desc = "Go to the up window" },
|
||||||
|
{ "<leader>wl", desc = "Go to the right window" },
|
||||||
|
{ "<leader>wo", desc = "Close all other windows" },
|
||||||
|
{ "<leader>wq", desc = "Quit a window" },
|
||||||
|
{ "<leader>ws", desc = "Split window" },
|
||||||
|
{ "<leader>wv", desc = "Split window vertically" },
|
||||||
|
{ "<leader>ww", desc = "Switch windows" },
|
||||||
|
{ "<leader>wx", desc = "Swap current with next" },
|
||||||
|
{ "<leader>w|", desc = "Max out the width" },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
-- https://github.com/folke/which-key.nvim/issues/270
|
||||||
|
-- https://github.com/folke/which-key.nvim/blob/main/lua/which-key/plugins/presets/misc.lua
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------
|
||||||
|
--- Plugin specific ---
|
||||||
|
|
||||||
|
-- This function gets run when an LSP connects to a particular buffer.
|
||||||
|
M.lspconfig_on_attach = function(_, bufnr)
|
||||||
|
local nnoremap = function(keys, func, desc)
|
||||||
|
vim.keymap.set("n", keys, func, { buffer = bufnr, desc = desc })
|
||||||
|
end
|
||||||
|
|
||||||
|
F.wk("<leader>l", "lsp", bufnr)
|
||||||
|
nnoremap("<leader>la", vim.lsp.buf.code_action, "Code action")
|
||||||
|
nnoremap("<leader>lf", F.lsp_format_buffer, "Format buffer")
|
||||||
|
nnoremap("<leader>lr", vim.lsp.buf.rename, "Rename")
|
||||||
|
|
||||||
|
nnoremap("<leader>ld", "<cmd>Lspsaga hover_doc<CR>", "Show documentation")
|
||||||
|
-- vim.keymap.set("n", "<leader>ld", "<cmd>Lspsaga hover_doc<CR>", { desc = "Show documentation" })
|
||||||
|
|
||||||
|
F.wk("<leader>lg", "goto", bufnr)
|
||||||
|
nnoremap("<leader>lga", builtin.lsp_dynamic_workspace_symbols, "Workspace symbols")
|
||||||
|
nnoremap("<leader>lgd", vim.lsp.buf.declaration, "Declaration")
|
||||||
|
nnoremap("<leader>lgg", vim.lsp.buf.definition, "Definition") -- builtin.lsp_definitions
|
||||||
|
nnoremap("<leader>lgi", builtin.lsp_implementations, "Implementation")
|
||||||
|
nnoremap("<leader>lgr", builtin.lsp_references, "References")
|
||||||
|
nnoremap("<leader>lgs", builtin.lsp_document_symbols, "Document symbols")
|
||||||
|
nnoremap("<leader>lgt", builtin.lsp_type_definitions, "Type definition")
|
||||||
|
|
||||||
|
-- See `:help K` for why this keymap
|
||||||
|
nnoremap("K", vim.lsp.buf.hover, "Hover Documentation")
|
||||||
|
nnoremap("<C-k>", vim.lsp.buf.signature_help, "Signature Documentation")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Keybindings for nvim-cmp popup
|
||||||
|
M.nvim_cmp = function()
|
||||||
|
local cmp = require("cmp")
|
||||||
|
local luasnip = require("luasnip")
|
||||||
|
return cmp.mapping.preset.insert({
|
||||||
|
["<M-h>"] = cmp.mapping.abort(),
|
||||||
|
["<M-j>"] = cmp.mapping.select_next_item(),
|
||||||
|
["<M-k>"] = cmp.mapping.select_prev_item(),
|
||||||
|
["<M-l>"] = cmp.mapping.confirm({
|
||||||
|
behavior = cmp.ConfirmBehavior.Replace,
|
||||||
|
select = true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
["<Esc>"] = cmp.mapping.abort(),
|
||||||
|
["<CR>"] = cmp.mapping.confirm({
|
||||||
|
behavior = cmp.ConfirmBehavior.Replace,
|
||||||
|
select = true,
|
||||||
|
}),
|
||||||
|
["<C-Space>"] = cmp.mapping.complete(),
|
||||||
|
|
||||||
|
["<Tab>"] = cmp.mapping(function(fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_next_item()
|
||||||
|
elseif luasnip.expand_or_locally_jumpable() then
|
||||||
|
luasnip.expand_or_jump()
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end, { "i", "s" }),
|
||||||
|
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_prev_item()
|
||||||
|
elseif luasnip.locally_jumpable(-1) then
|
||||||
|
luasnip.jump(-1)
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end, { "i", "s" }),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Telescope picker generic mappings
|
||||||
|
M.telescope_default_mappings = function()
|
||||||
|
local actions = require("telescope.actions")
|
||||||
|
return {
|
||||||
|
n = {
|
||||||
|
["<M-h>"] = actions.close,
|
||||||
|
["<M-j>"] = actions.move_selection_next,
|
||||||
|
["<M-k>"] = actions.move_selection_previous,
|
||||||
|
["<M-l>"] = actions.select_default,
|
||||||
|
},
|
||||||
|
i = {
|
||||||
|
["<M-h>"] = actions.close,
|
||||||
|
["<M-j>"] = actions.move_selection_next,
|
||||||
|
["<M-k>"] = actions.move_selection_previous,
|
||||||
|
["<M-l>"] = actions.select_default,
|
||||||
|
|
||||||
|
["<Tab>"] = actions.select_default,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
local M = {}
|
||||||
|
|
||||||
|
local plugin_path = vim.fn.stdpath("cache") .. "/lazy"
|
||||||
|
|
||||||
|
-- Install lazy.nvim plugin manager
|
||||||
|
-- See `:help lazy.nvim.txt`
|
||||||
|
M.install = function()
|
||||||
|
local lazy_path = plugin_path .. "/lazy.nvim"
|
||||||
|
if not vim.loop.fs_stat(lazy_path) then
|
||||||
|
vim.fn.system {
|
||||||
|
"git",
|
||||||
|
"clone",
|
||||||
|
"--filter=blob:none",
|
||||||
|
"https://github.com/folke/lazy.nvim.git",
|
||||||
|
"--branch=stable", -- latest stable release
|
||||||
|
lazy_path,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
vim.opt.rtp:prepend(lazy_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
M.setup = function(modules)
|
||||||
|
M.install()
|
||||||
|
|
||||||
|
local options = {
|
||||||
|
root = plugin_path, -- directory where plugins will be installed
|
||||||
|
}
|
||||||
|
|
||||||
|
require("lazy").setup(modules, options)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
return {
|
||||||
|
|
||||||
|
-- Fuzzy Finder (files, LSP, etc)
|
||||||
|
{
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
branch = "0.1.x",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
-- Fuzzy Finder Algorithm which requires local dependencies to be built.
|
||||||
|
{
|
||||||
|
"nvim-telescope/telescope-fzf-native.nvim",
|
||||||
|
build = "make",
|
||||||
|
cond = function()
|
||||||
|
return vim.fn.executable "make" == 1
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
-- Extensions
|
||||||
|
"nvim-telescope/telescope-file-browser.nvim",
|
||||||
|
"smartpde/telescope-recent-files",
|
||||||
|
},
|
||||||
|
extensions = {
|
||||||
|
"fzf",
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
require("telescope").setup({
|
||||||
|
defaults = {
|
||||||
|
sorting_strategy = "ascending",
|
||||||
|
|
||||||
|
layout_strategy = "config",
|
||||||
|
layout_config = {
|
||||||
|
height = 10, -- amount of results
|
||||||
|
config = { -- apply settings to the "config" layout
|
||||||
|
search_condensed = true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
border = true,
|
||||||
|
|
||||||
|
history = {
|
||||||
|
path = vim.fn.stdpath("cache") .. "/telescope_history",
|
||||||
|
},
|
||||||
|
|
||||||
|
mappings = require("keybinds").telescope_default_mappings(),
|
||||||
|
},
|
||||||
|
extensions = {
|
||||||
|
file_browser = {
|
||||||
|
hide_parent_dir = true, -- hide "../"
|
||||||
|
prompt_path = true, -- set path as prompt prefix
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
require("telescope").load_extension("fzf")
|
||||||
|
require("telescope").load_extension "file_browser"
|
||||||
|
require("telescope").load_extension("recent_files")
|
||||||
|
|
||||||
|
--- ┌──────────────────────────────────────────────────┐
|
||||||
|
--- │ │
|
||||||
|
--- │ ┌───────────────────┐ │
|
||||||
|
--- │ │ │ │
|
||||||
|
--- │ │ │ │
|
||||||
|
--- │ │ Preview │ │
|
||||||
|
--- │ │ │ │
|
||||||
|
--- │ │ │ │
|
||||||
|
--- │ └───────────────────┘ │
|
||||||
|
--- │ │
|
||||||
|
--- ├──────────────────────────────────────────────────┤
|
||||||
|
--- │ Prompt │
|
||||||
|
--- ├──────────────────────────────────────────────────┤
|
||||||
|
--- │ Results │
|
||||||
|
--- │ │
|
||||||
|
--- └──────────────────────────────────────────────────┘
|
||||||
|
require("telescope.pickers.layout_strategies").config = function(picker, max_columns, max_lines,
|
||||||
|
layout_config)
|
||||||
|
local p_window = require "telescope.pickers.window"
|
||||||
|
local initial_options = p_window.get_initial_window_options(picker)
|
||||||
|
local results = initial_options.results
|
||||||
|
local prompt = initial_options.prompt
|
||||||
|
local preview = initial_options.preview
|
||||||
|
-- Layout config isnt filled by Telescope automatically
|
||||||
|
layout_config = require("telescope.config").values.layout_config or {}
|
||||||
|
|
||||||
|
results.title = ""
|
||||||
|
results.borderchars = { "─", "│", "─", "│", "├", "┤", "╯", "╰" }
|
||||||
|
|
||||||
|
local bs = picker.window.border and 2 or 0
|
||||||
|
local search_condensed = bs ~= 0 and layout_config.config.search_condensed and 2 or 0
|
||||||
|
|
||||||
|
-- Height
|
||||||
|
prompt.height = 1
|
||||||
|
results.height = layout_config.height or 10
|
||||||
|
local search_height = (prompt.height + results.height + (bs * 3))
|
||||||
|
preview.height = math.floor((max_lines - search_height) * 0.8)
|
||||||
|
|
||||||
|
-- Width
|
||||||
|
prompt.width = max_columns - (bs ~= 0 and search_condensed == 0 and bs or 0)
|
||||||
|
results.width = max_columns - (bs ~= 0 and search_condensed == 0 and bs or 0)
|
||||||
|
preview.width = math.floor(max_columns * 0.75)
|
||||||
|
|
||||||
|
-- Line (position), coordinates start at top-left
|
||||||
|
prompt.line = max_lines - results.height + search_condensed - bs -- take overlapping border into account
|
||||||
|
results.line = max_lines - results.height + search_condensed - bs + (bs / 2) + prompt.height
|
||||||
|
preview.line = math.floor((max_lines - search_height - preview.height + bs) / 2) + 1
|
||||||
|
|
||||||
|
return {
|
||||||
|
preview = picker.previewer and preview.width > 0 and preview,
|
||||||
|
prompt = prompt,
|
||||||
|
results = results,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Telescope pickers sorted by recency and frequency
|
||||||
|
{
|
||||||
|
"prochri/telescope-all-recent.nvim",
|
||||||
|
dependencies = {
|
||||||
|
"kkharji/sqlite.lua",
|
||||||
|
},
|
||||||
|
opts = {
|
||||||
|
database = {
|
||||||
|
folder = vim.fn.stdpath("cache"),
|
||||||
|
},
|
||||||
|
pickers = { -- extension_name#extension_method
|
||||||
|
["projects#projects"] = {
|
||||||
|
disable = false,
|
||||||
|
use_cwd = false,
|
||||||
|
sorting = "frecency",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
return {
|
||||||
|
|
||||||
|
-- Theme
|
||||||
|
{
|
||||||
|
"RRethy/nvim-base16",
|
||||||
|
lazy = false, -- make sure to load this during startup if it is your main colorscheme
|
||||||
|
priority = 1000,
|
||||||
|
config = function()
|
||||||
|
require("base16-colorscheme").with_config({
|
||||||
|
-- TODO: maybe make Telescope borders visible?
|
||||||
|
-- telescope = false,
|
||||||
|
})
|
||||||
|
vim.cmd.colorscheme "base16-tomorrow-night"
|
||||||
|
|
||||||
|
local colors = require("base16-colorscheme").colors
|
||||||
|
-- local blue_m1 = "#9cc4e6"
|
||||||
|
local blue = colors.base0D -- #81a2be
|
||||||
|
-- local blue_p1 = "#5f819d"
|
||||||
|
local blue_p2 = "#445666"
|
||||||
|
local blue_p3 = "#2a3640"
|
||||||
|
local cyan = colors.base0C -- #8abeb7
|
||||||
|
local fg = colors.base05 -- #c5c8c6
|
||||||
|
local fg_dark = "#515151"
|
||||||
|
-- local green = colors.base0B -- #b5bd68
|
||||||
|
local green_p1 = "#8c9440"
|
||||||
|
-- local green_p2 = "#5f875f"
|
||||||
|
local green_bg = "#404324"
|
||||||
|
-- local orange = colors.base09 -- #de935f
|
||||||
|
-- local magenta = colors.base0E -- #b294bb
|
||||||
|
local red = colors.base08 -- #cc6666
|
||||||
|
local red_bg = "#4e2626"
|
||||||
|
local yellow = colors.base0A -- #f0c674
|
||||||
|
|
||||||
|
-- Cursor
|
||||||
|
vim.api.nvim_command("highlight CursorLineNr guifg=" .. yellow .. " gui=bold")
|
||||||
|
-- Diffview
|
||||||
|
vim.api.nvim_command("highlight DiffviewDiffAdd guibg=" .. green_bg)
|
||||||
|
vim.api.nvim_command("highlight DiffviewDiffChange guibg=" .. blue_p3) -- Unchanged part on a change line
|
||||||
|
vim.api.nvim_command("highlight DiffviewDiffDelete guibg=" .. red_bg .. " guifg=" .. fg_dark)
|
||||||
|
vim.api.nvim_command("highlight DiffviewDiffText guibg=" .. blue_p2) -- Changed part on a change line
|
||||||
|
-- Git gutter
|
||||||
|
vim.api.nvim_command("highlight GitSignsAdd guifg=" .. green_p1)
|
||||||
|
vim.api.nvim_command("highlight GitSignsChange guifg=" .. yellow)
|
||||||
|
-- Rainbow delimiters
|
||||||
|
vim.api.nvim_command("highlight RainbowDelimiterBlue guifg=" .. blue)
|
||||||
|
vim.api.nvim_command("highlight RainbowDelimiterCyan guifg=" .. cyan)
|
||||||
|
vim.api.nvim_command("highlight RainbowDelimiterGreen guifg=" .. green_p1)
|
||||||
|
vim.api.nvim_command("highlight RainbowDelimiterOrange guifg=" .. fg)
|
||||||
|
vim.api.nvim_command("highlight RainbowDelimiterRed guifg=" .. red)
|
||||||
|
vim.api.nvim_command("highlight RainbowDelimiterYellow guifg=" .. yellow)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Set lualine as statusline
|
||||||
|
{
|
||||||
|
-- See `:help lualine.txt`
|
||||||
|
"nvim-lualine/lualine.nvim",
|
||||||
|
opts = {
|
||||||
|
options = {
|
||||||
|
icons_enabled = false,
|
||||||
|
theme = "base16",
|
||||||
|
component_separators = { left = "", right = "" },
|
||||||
|
section_separators = { left = "", right = "" },
|
||||||
|
globalstatus = true,
|
||||||
|
},
|
||||||
|
sections = {
|
||||||
|
lualine_a = { "mode" },
|
||||||
|
lualine_b = { "encoding", "filename" },
|
||||||
|
lualine_c = {
|
||||||
|
{
|
||||||
|
-- TODO: nvim alternate file stuff and closing files is busted
|
||||||
|
"project",
|
||||||
|
fmt = function()
|
||||||
|
local path = require("core.functions").find_project_root() or ""
|
||||||
|
return path:match("([^/]+)$")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
lualine_x = { "diagnostics", "fileformat" },
|
||||||
|
lualine_y = { "filetype" },
|
||||||
|
lualine_z = { "progress", "location" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Add file type icons to plugins
|
||||||
|
{ "nvim-tree/nvim-web-devicons", lazy = true },
|
||||||
|
|
||||||
|
-- Dashboard
|
||||||
|
{
|
||||||
|
"nvimdev/dashboard-nvim",
|
||||||
|
event = "VimEnter",
|
||||||
|
opts = {
|
||||||
|
config = {
|
||||||
|
header = {
|
||||||
|
" . . ",
|
||||||
|
" ';;,. ::' ",
|
||||||
|
" ,:::;,, :ccc, ",
|
||||||
|
" ,::c::,,,,. :cccc, ",
|
||||||
|
" ,cccc:;;;;;. cllll, ",
|
||||||
|
" ,cccc;.;;;;;, cllll; ",
|
||||||
|
" :cccc; .;;;;;;. coooo; ",
|
||||||
|
" ;llll; ,:::::'loooo; ",
|
||||||
|
" ;llll: ':::::loooo: ",
|
||||||
|
" :oooo: .::::llodd: ",
|
||||||
|
" .;ooo: ;cclooo:. ",
|
||||||
|
" .;oc 'coo;. ",
|
||||||
|
" .' .,. ",
|
||||||
|
"",
|
||||||
|
" _______________________________________________________",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
shortcut = {
|
||||||
|
{ desc = "Neovim master race!" },
|
||||||
|
},
|
||||||
|
footer = {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Show project errors
|
||||||
|
{
|
||||||
|
"folke/trouble.nvim",
|
||||||
|
cmd = "Trouble", -- defer
|
||||||
|
opts = {
|
||||||
|
mode = "lsp_references",
|
||||||
|
use_diagnostic_signs = true,
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
-- Gutter/fringe icons
|
||||||
|
-- https://github.com/folke/trouble.nvim/issues/52
|
||||||
|
local signs = {
|
||||||
|
Error = "»",
|
||||||
|
Warn = "»",
|
||||||
|
Hint = "»",
|
||||||
|
Info = "»",
|
||||||
|
Other = "»",
|
||||||
|
}
|
||||||
|
for type, icon in pairs(signs) do
|
||||||
|
local hl = "DiagnosticSign" .. type
|
||||||
|
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Show project TODOs
|
||||||
|
{
|
||||||
|
"folke/todo-comments.nvim",
|
||||||
|
dependencies = { "nvim-lua/plenary.nvim" },
|
||||||
|
opts = {},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Useful plugin to show you pending keybinds.
|
||||||
|
"folke/which-key.nvim",
|
||||||
|
|
||||||
|
-- Rainbow delimiters
|
||||||
|
{
|
||||||
|
"HiPhish/rainbow-delimiters.nvim",
|
||||||
|
opts = {
|
||||||
|
highlight = {
|
||||||
|
"RainbowDelimiterOrange", -- white
|
||||||
|
"RainbowDelimiterCyan",
|
||||||
|
"RainbowDelimiterYellow",
|
||||||
|
"RainbowDelimiterGreen",
|
||||||
|
"RainbowDelimiterBlue",
|
||||||
|
"RainbowDelimiterOrange", -- white
|
||||||
|
"RainbowDelimiterCyan",
|
||||||
|
"RainbowDelimiterYellow",
|
||||||
|
"RainbowDelimiterGreen",
|
||||||
|
"RainbowDelimiterBlue",
|
||||||
|
"RainbowDelimiterRed",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
require("rainbow-delimiters.setup").setup(opts)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Rainbow-mode
|
||||||
|
{ -- https://github.com/norcalli/nvim-colorizer.lua
|
||||||
|
"norcalli/nvim-colorizer.lua",
|
||||||
|
opts = {},
|
||||||
|
}, -- :ColorizerToggle
|
||||||
|
|
||||||
|
}
|
||||||
@@ -92,7 +92,7 @@ export SUDO_ASKPASS="$HOME/.local/bin/rofipass"
|
|||||||
export TERMINAL="urxvt"
|
export TERMINAL="urxvt"
|
||||||
|
|
||||||
# Vim
|
# Vim
|
||||||
export VIMINIT="source $XDG_CONFIG_HOME/vim/vimrc"
|
export VIMINIT="source $XDG_CONFIG_HOME/nvim/init.lua"
|
||||||
|
|
||||||
# Web browser
|
# Web browser
|
||||||
export BROWSER="firefox"
|
export BROWSER="firefox"
|
||||||
|
|||||||
@@ -42,8 +42,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Url bar color */
|
/* Url bar color */
|
||||||
#urlbar {
|
#urlbar-background {
|
||||||
background: #404552 !important;
|
background: #404552 !important;
|
||||||
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hide ... button in URL bar */
|
/* Hide ... button in URL bar */
|
||||||
@@ -55,13 +56,6 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unzoom URL bar */
|
|
||||||
#urlbar[breakout-extend] {
|
|
||||||
top: calc((var(--urlbar-toolbar-height) - var(--urlbar-height)) / 2) !important;
|
|
||||||
left: calc((var(--urlbar-toolbar-width) - var(--urlbar-width)) / 2) !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
#urlbar[breakout-extend] #urlbar-input-container {
|
#urlbar[breakout-extend] #urlbar-input-container {
|
||||||
height: calc(var(--tab-min-height) - 3px) !important;
|
height: calc(var(--tab-min-height) - 3px) !important;
|
||||||
padding: 0px !important;
|
padding: 0px !important;
|
||||||
|
|||||||
+586
@@ -0,0 +1,586 @@
|
|||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# /etc/tlp.conf - TLP user configuration (version 1.7.0)
|
||||||
|
# See full explanation: https://linrunner.de/tlp/settings
|
||||||
|
#
|
||||||
|
# Copyright (c) 2024 Thomas Koch <linrunner at gmx.net> and others.
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#
|
||||||
|
# Settings are read in the following order:
|
||||||
|
#
|
||||||
|
# 1. Intrinsic defaults
|
||||||
|
# 2. /etc/tlp.d/*.conf - Drop-in customization snippets
|
||||||
|
# 3. /etc/tlp.conf - User configuration (this file)
|
||||||
|
#
|
||||||
|
# Notes:
|
||||||
|
# - In case of identical parameters, the last occurence has precedence
|
||||||
|
# - This also means, parameters enabled here will override anything else
|
||||||
|
# - However you may append values to a parameter already defined as intrinsic
|
||||||
|
# default or in a previously read file: use PARAMETER+="add values"
|
||||||
|
# - IMPORTANT: all parameters here are disabled; remove the leading '#' if you
|
||||||
|
# like to enable a feature without default or have a value different from the
|
||||||
|
# default
|
||||||
|
# - Default *: intrinsic default that is effective when the parameter is missing
|
||||||
|
# or disabled by a leading '#'; use PARAM="" to disable an intrinsic default
|
||||||
|
# - Default <none>: do nothing or use kernel/hardware defaults
|
||||||
|
# - IMPORTANT: parameters must always be specified pairwise i.e. for
|
||||||
|
# both AC and BAT. Omitting one of the two makes the set value effective for
|
||||||
|
# both power sources, since a change only occurs when different values are
|
||||||
|
# defined.
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# tlp - Parameters for power saving
|
||||||
|
|
||||||
|
# Set to 0 to disable, 1 to enable TLP.
|
||||||
|
# Default: 1
|
||||||
|
|
||||||
|
#TLP_ENABLE=1
|
||||||
|
|
||||||
|
# Control how warnings about invalid settings are issued:
|
||||||
|
# 0=disabled,
|
||||||
|
# 1=background tasks (boot, resume, change of power source) report to syslog,
|
||||||
|
# 2=shell commands report to the terminal (stderr),
|
||||||
|
# 3=combination of 1 and 2
|
||||||
|
# Default: 3
|
||||||
|
|
||||||
|
#TLP_WARN_LEVEL=3
|
||||||
|
|
||||||
|
# Colorize error, warning, notice and success messages. Colors are specified
|
||||||
|
# with ANSI codes:
|
||||||
|
# 1=bold black, 90=grey, 91=red, 92=green, 93=yellow, 94=blue, 95=magenta,
|
||||||
|
# 96=cyan, 97=white.
|
||||||
|
# Other colors are possible, refer to:
|
||||||
|
# https://en.wikipedia.org/wiki/ANSI_escape_code#3-bit_and_4-bit
|
||||||
|
# Colors must be specified in the order "<error> <warning> <notice> <success>".
|
||||||
|
# By default, errors are shown in red, warnings in yellow, notices in bold
|
||||||
|
# and success in green.
|
||||||
|
# Default: "91 93 1 92"
|
||||||
|
|
||||||
|
#TLP_MSG_COLORS="91 93 1 92"
|
||||||
|
|
||||||
|
# Operation mode when no power supply can be detected: AC, BAT.
|
||||||
|
# Concerns some desktop and embedded hardware only.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#TLP_DEFAULT_MODE=AC
|
||||||
|
|
||||||
|
# Operation mode select: 0=depend on power source, 1=always use TLP_DEFAULT_MODE
|
||||||
|
# Note: use in conjunction with TLP_DEFAULT_MODE=BAT for BAT settings on AC.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#TLP_PERSISTENT_DEFAULT=0
|
||||||
|
|
||||||
|
# Power supply classes to ignore when determining operation mode: AC, USB, BAT.
|
||||||
|
# Separate multiple classes with spaces.
|
||||||
|
# Note: try on laptops where operation mode AC/BAT is incorrectly detected.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#TLP_PS_IGNORE="BAT"
|
||||||
|
|
||||||
|
# Seconds laptop mode has to wait after the disk goes idle before doing a sync.
|
||||||
|
# Non-zero value enables, zero disables laptop mode.
|
||||||
|
# Default: 0 (AC), 2 (BAT)
|
||||||
|
|
||||||
|
#DISK_IDLE_SECS_ON_AC=0
|
||||||
|
#DISK_IDLE_SECS_ON_BAT=2
|
||||||
|
|
||||||
|
# Dirty page values (timeouts in secs).
|
||||||
|
# Default: 15 (AC), 60 (BAT)
|
||||||
|
|
||||||
|
#MAX_LOST_WORK_SECS_ON_AC=15
|
||||||
|
#MAX_LOST_WORK_SECS_ON_BAT=60
|
||||||
|
|
||||||
|
# Select a CPU scaling driver operation mode.
|
||||||
|
# Intel CPU with intel_pstate driver:
|
||||||
|
# active, passive.
|
||||||
|
# AMD Zen 2 or newer CPU with amd-pstate driver as of kernel 6.3/6.4(*):
|
||||||
|
# active, passive, guided(*).
|
||||||
|
# Default: <none>
|
||||||
|
#CPU_DRIVER_OPMODE_ON_AC=active
|
||||||
|
#CPU_DRIVER_OPMODE_ON_BAT=active
|
||||||
|
|
||||||
|
# Select a CPU frequency scaling governor.
|
||||||
|
# Intel CPU with intel_pstate driver or
|
||||||
|
# AMD CPU with amd-pstate driver in active mode ('amd-pstate-epp'):
|
||||||
|
# performance, powersave(*).
|
||||||
|
# Intel CPU with intel_pstate driver in passive mode ('intel_cpufreq') or
|
||||||
|
# AMD CPU with amd-pstate driver in passive or guided mode ('amd-pstate') or
|
||||||
|
# Intel, AMD and other CPU brands with acpi-cpufreq driver:
|
||||||
|
# conservative, ondemand(*), userspace, powersave, performance, schedutil(*).
|
||||||
|
# Use tlp-stat -p to show the active driver and available governors.
|
||||||
|
# Important:
|
||||||
|
# Governors marked (*) above are power efficient for *almost all* workloads
|
||||||
|
# and therefore kernel and most distributions have chosen them as defaults.
|
||||||
|
# You should have done your research about advantages/disadvantages *before*
|
||||||
|
# changing the governor.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#CPU_SCALING_GOVERNOR_ON_AC=powersave
|
||||||
|
#CPU_SCALING_GOVERNOR_ON_BAT=powersave
|
||||||
|
|
||||||
|
# Set the min/max frequency available for the scaling governor.
|
||||||
|
# Possible values depend on your CPU. For available frequencies see
|
||||||
|
# the output of tlp-stat -p.
|
||||||
|
# Notes:
|
||||||
|
# - Min/max frequencies must always be specified for both AC *and* BAT
|
||||||
|
# - Not recommended for use with the intel_pstate driver, use
|
||||||
|
# CPU_MIN/MAX_PERF_ON_AC/BAT below instead
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#CPU_SCALING_MIN_FREQ_ON_AC=0
|
||||||
|
#CPU_SCALING_MAX_FREQ_ON_AC=0
|
||||||
|
#CPU_SCALING_MIN_FREQ_ON_BAT=0
|
||||||
|
#CPU_SCALING_MAX_FREQ_ON_BAT=0
|
||||||
|
|
||||||
|
# Set CPU energy/performance policies EPP and EPB:
|
||||||
|
# performance, balance_performance, default, balance_power, power.
|
||||||
|
# Values are given in order of increasing power saving.
|
||||||
|
# Requires:
|
||||||
|
# * Intel CPU
|
||||||
|
# EPP: Intel Core i 6th gen. or newer CPU with intel_pstate driver
|
||||||
|
# EPB: Intel Core i 2nd gen. or newer CPU with intel_pstate driver
|
||||||
|
# EPP and EPB are mutually exclusive: when EPP is available, Intel CPUs
|
||||||
|
# will not honor EPB. Only the matching feature will be applied by TLP.
|
||||||
|
# * AMD Zen 2 or newer CPU
|
||||||
|
# EPP: amd-pstate driver in active mode ('amd-pstate-epp') as of kernel 6.3
|
||||||
|
# Default: balance_performance (AC), balance_power (BAT)
|
||||||
|
|
||||||
|
#CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
|
||||||
|
#CPU_ENERGY_PERF_POLICY_ON_BAT=balance_power
|
||||||
|
|
||||||
|
# Set Intel CPU P-state performance: 0..100 (%).
|
||||||
|
# Limit the max/min P-state to control the power dissipation of the CPU.
|
||||||
|
# Values are stated as a percentage of the available performance.
|
||||||
|
# Requires Intel Core i 2nd gen. or newer CPU with intel_pstate driver.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#CPU_MIN_PERF_ON_AC=0
|
||||||
|
#CPU_MAX_PERF_ON_AC=100
|
||||||
|
#CPU_MIN_PERF_ON_BAT=0
|
||||||
|
#CPU_MAX_PERF_ON_BAT=30
|
||||||
|
|
||||||
|
# Set the CPU "turbo boost" (Intel) or "turbo core" (AMD) feature:
|
||||||
|
# 0=disable, 1=allow.
|
||||||
|
# Allows to raise the maximum frequency/P-state of some cores if the
|
||||||
|
# CPU chip is not fully utilized and below it's intended thermal budget.
|
||||||
|
# Note: a value of 1 does *not* activate boosting, it just allows it.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#CPU_BOOST_ON_AC=1
|
||||||
|
#CPU_BOOST_ON_BAT=0
|
||||||
|
|
||||||
|
# Set CPU dynamic boost feature:
|
||||||
|
# 0=disable, 1=enable.
|
||||||
|
# Improve performance by increasing minimum P-state limit dynamically
|
||||||
|
# whenever a task previously waiting on I/O is selected to run.
|
||||||
|
# Requires Intel Core i 6th gen. or newer CPU: intel_pstate driver in active mode.
|
||||||
|
# Note: AMD CPUs currently have no tunable for this.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#CPU_HWP_DYN_BOOST_ON_AC=1
|
||||||
|
#CPU_HWP_DYN_BOOST_ON_BAT=0
|
||||||
|
|
||||||
|
# Kernel NMI Watchdog:
|
||||||
|
# 0=disable (default, saves power), 1=enable (for kernel debugging only).
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#NMI_WATCHDOG=0
|
||||||
|
|
||||||
|
# Select platform profile:
|
||||||
|
# performance, balanced, low-power.
|
||||||
|
# Controls system operating characteristics around power/performance levels,
|
||||||
|
# thermal and fan speed. Values are given in order of increasing power saving.
|
||||||
|
# Note: check the output of tlp-stat -p to determine availability on your
|
||||||
|
# hardware and additional profiles such as: balanced-performance, quiet, cool.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#PLATFORM_PROFILE_ON_AC=performance
|
||||||
|
#PLATFORM_PROFILE_ON_BAT=low-power
|
||||||
|
|
||||||
|
# System suspend mode:
|
||||||
|
# s2idle: Idle standby - a pure software, light-weight, system sleep state,
|
||||||
|
# deep: Suspend to RAM - the whole system is put into a low-power state,
|
||||||
|
# except for memory, usually resulting in higher savings than s2idle.
|
||||||
|
# CAUTION: changing suspend mode may lead to system instability and even
|
||||||
|
# data loss. As for the availability of different modes on your system,
|
||||||
|
# check the output of tlp-stat -s. If unsure, stick with the system default
|
||||||
|
# by not enabling this.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#MEM_SLEEP_ON_AC=s2idle
|
||||||
|
#MEM_SLEEP_ON_BAT=deep
|
||||||
|
|
||||||
|
# Define disk devices on which the following DISK/AHCI_RUNTIME parameters act.
|
||||||
|
# Separate multiple devices with spaces.
|
||||||
|
# Devices can be specified by disk ID also (lookup with: tlp diskid).
|
||||||
|
# Default: "nvme0n1 sda"
|
||||||
|
|
||||||
|
#DISK_DEVICES="nvme0n1 sda"
|
||||||
|
|
||||||
|
# Disk advanced power management level: 1..254, 255 (max saving, min, off).
|
||||||
|
# Levels 1..127 may spin down the disk; 255 allowable on most drives.
|
||||||
|
# Separate values for multiple disks with spaces. Use the special value 'keep'
|
||||||
|
# to keep the hardware default for the particular disk.
|
||||||
|
# Default: 254 (AC), 128 (BAT)
|
||||||
|
|
||||||
|
#DISK_APM_LEVEL_ON_AC="254 254"
|
||||||
|
#DISK_APM_LEVEL_ON_BAT="128 128"
|
||||||
|
|
||||||
|
# Exclude disk classes from advanced power management (APM):
|
||||||
|
# sata, ata, usb, ieee1394.
|
||||||
|
# Separate multiple classes with spaces.
|
||||||
|
# CAUTION: USB and IEEE1394 disks may fail to mount or data may get corrupted
|
||||||
|
# with APM enabled. Be careful and make sure you have backups of all affected
|
||||||
|
# media before removing 'usb' or 'ieee1394' from the denylist!
|
||||||
|
# Default: "usb ieee1394"
|
||||||
|
|
||||||
|
#DISK_APM_CLASS_DENYLIST="usb ieee1394"
|
||||||
|
|
||||||
|
# Hard disk spin down timeout:
|
||||||
|
# 0: spin down disabled
|
||||||
|
# 1..240: timeouts from 5s to 20min (in units of 5s)
|
||||||
|
# 241..251: timeouts from 30min to 5.5 hours (in units of 30min)
|
||||||
|
# See 'man hdparm' for details.
|
||||||
|
# Separate values for multiple disks with spaces. Use the special value 'keep'
|
||||||
|
# to keep the hardware default for the particular disk.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#DISK_SPINDOWN_TIMEOUT_ON_AC="0 0"
|
||||||
|
#DISK_SPINDOWN_TIMEOUT_ON_BAT="0 0"
|
||||||
|
|
||||||
|
# Select I/O scheduler for the disk devices.
|
||||||
|
# Multi queue (blk-mq) schedulers:
|
||||||
|
# mq-deadline(*), none, kyber, bfq
|
||||||
|
# Single queue schedulers:
|
||||||
|
# deadline(*), cfq, bfq, noop
|
||||||
|
# (*) recommended.
|
||||||
|
# Separate values for multiple disks with spaces. Use the special value 'keep'
|
||||||
|
# to keep the kernel default scheduler for the particular disk.
|
||||||
|
# Notes:
|
||||||
|
# - Multi queue (blk-mq) may need kernel boot option 'scsi_mod.use_blk_mq=1'
|
||||||
|
# and 'modprobe mq-deadline-iosched|kyber|bfq' on kernels < 5.0
|
||||||
|
# - Single queue schedulers are legacy now and were removed together with
|
||||||
|
# the old block layer in kernel 5.0
|
||||||
|
# Default: keep
|
||||||
|
|
||||||
|
#DISK_IOSCHED="mq-deadline mq-deadline"
|
||||||
|
|
||||||
|
# AHCI link power management (ALPM) for SATA disks:
|
||||||
|
# min_power, med_power_with_dipm(*), medium_power, max_performance.
|
||||||
|
# (*) recommended.
|
||||||
|
# Multiple values separated with spaces are tried sequentially until success.
|
||||||
|
# Default: med_power_with_dipm (AC & BAT)
|
||||||
|
|
||||||
|
#SATA_LINKPWR_ON_AC="med_power_with_dipm"
|
||||||
|
#SATA_LINKPWR_ON_BAT="med_power_with_dipm"
|
||||||
|
|
||||||
|
# Exclude SATA links from AHCI link power management (ALPM).
|
||||||
|
# SATA links are specified by their host. Refer to the output of
|
||||||
|
# tlp-stat -d to determine the host; the format is "hostX".
|
||||||
|
# Separate multiple hosts with spaces.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#SATA_LINKPWR_DENYLIST="host1"
|
||||||
|
|
||||||
|
# Runtime Power Management for NVMe, SATA, ATA and USB disks
|
||||||
|
# as well as SATA ports:
|
||||||
|
# on=disable, auto=enable.
|
||||||
|
# Note: SATA controllers are PCIe bus devices and handled by RUNTIME_PM further
|
||||||
|
# down.
|
||||||
|
|
||||||
|
# Default: on (AC), auto (BAT)
|
||||||
|
|
||||||
|
#AHCI_RUNTIME_PM_ON_AC=on
|
||||||
|
#AHCI_RUNTIME_PM_ON_BAT=auto
|
||||||
|
|
||||||
|
# Seconds of inactivity before disk is suspended.
|
||||||
|
# Note: effective only when AHCI_RUNTIME_PM_ON_AC/BAT is activated.
|
||||||
|
# Default: 15
|
||||||
|
|
||||||
|
#AHCI_RUNTIME_PM_TIMEOUT=15
|
||||||
|
|
||||||
|
# Power off optical drive in UltraBay/MediaBay: 0=disable, 1=enable.
|
||||||
|
# Drive can be powered on again by releasing (and reinserting) the eject lever
|
||||||
|
# or by pressing the disc eject button on newer models.
|
||||||
|
# Note: an UltraBay/MediaBay hard disk is never powered off.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#BAY_POWEROFF_ON_AC=0
|
||||||
|
#BAY_POWEROFF_ON_BAT=0
|
||||||
|
|
||||||
|
# Optical drive device to power off
|
||||||
|
# Default: sr0
|
||||||
|
|
||||||
|
#BAY_DEVICE="sr0"
|
||||||
|
|
||||||
|
# Set the min/max/turbo frequency for the Intel GPU.
|
||||||
|
# Possible values depend on your hardware. For available frequencies see
|
||||||
|
# the output of tlp-stat -g.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#INTEL_GPU_MIN_FREQ_ON_AC=0
|
||||||
|
#INTEL_GPU_MIN_FREQ_ON_BAT=0
|
||||||
|
#INTEL_GPU_MAX_FREQ_ON_AC=0
|
||||||
|
#INTEL_GPU_MAX_FREQ_ON_BAT=0
|
||||||
|
#INTEL_GPU_BOOST_FREQ_ON_AC=0
|
||||||
|
#INTEL_GPU_BOOST_FREQ_ON_BAT=0
|
||||||
|
|
||||||
|
# AMD GPU power management.
|
||||||
|
# Performance level (DPM): auto, low, high; auto is recommended.
|
||||||
|
# Note: requires amdgpu or radeon driver.
|
||||||
|
# Default: auto
|
||||||
|
|
||||||
|
#RADEON_DPM_PERF_LEVEL_ON_AC=auto
|
||||||
|
#RADEON_DPM_PERF_LEVEL_ON_BAT=auto
|
||||||
|
|
||||||
|
# Dynamic power management method (DPM): balanced, battery, performance.
|
||||||
|
# Note: radeon driver only.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#RADEON_DPM_STATE_ON_AC=performance
|
||||||
|
#RADEON_DPM_STATE_ON_BAT=battery
|
||||||
|
|
||||||
|
# Graphics clock speed (profile method): low, mid, high, auto, default;
|
||||||
|
# auto = mid on BAT, high on AC.
|
||||||
|
# Note: radeon driver on legacy ATI hardware only (where DPM is not available).
|
||||||
|
# Default: default
|
||||||
|
|
||||||
|
#RADEON_POWER_PROFILE_ON_AC=default
|
||||||
|
#RADEON_POWER_PROFILE_ON_BAT=default
|
||||||
|
|
||||||
|
# Display panel adaptive backlight modulation (ABM) level: 0(off), 1..4.
|
||||||
|
# Values 1..4 control the maximum brightness reduction allowed by the ABM
|
||||||
|
# algorithm, where 1 represents the least and 4 the most power saving.
|
||||||
|
# Notes:
|
||||||
|
# - Requires AMD Vega or newer GPU with amdgpu driver as of kernel 6.9
|
||||||
|
# - Savings are made at the expense of color balance
|
||||||
|
# Default: 0 (AC), 1 (BAT)
|
||||||
|
|
||||||
|
#AMDGPU_ABM_LEVEL_ON_AC=0
|
||||||
|
#AMDGPU_ABM_LEVEL_ON_BAT=3
|
||||||
|
|
||||||
|
# Wi-Fi power saving mode: on=enable, off=disable.
|
||||||
|
# Default: off (AC), on (BAT)
|
||||||
|
|
||||||
|
#WIFI_PWR_ON_AC=off
|
||||||
|
#WIFI_PWR_ON_BAT=on
|
||||||
|
|
||||||
|
# Disable Wake-on-LAN: Y/N.
|
||||||
|
# Default: Y
|
||||||
|
|
||||||
|
#WOL_DISABLE=Y
|
||||||
|
|
||||||
|
# Enable audio power saving for Intel HDA, AC97 devices (timeout in secs).
|
||||||
|
# A value of 0 disables, >= 1 enables power saving.
|
||||||
|
# Note: 1 is recommended for Linux desktop environments with PulseAudio,
|
||||||
|
# systems without PulseAudio may require 10.
|
||||||
|
# Default: 1
|
||||||
|
|
||||||
|
# >>> hostname=arch-desktop
|
||||||
|
SOUND_POWER_SAVE_ON_AC=1
|
||||||
|
SOUND_POWER_SAVE_ON_BAT=1
|
||||||
|
# <<<
|
||||||
|
# >>> hostname=arch-laptop
|
||||||
|
# SOUND_POWER_SAVE_ON_AC=0
|
||||||
|
# SOUND_POWER_SAVE_ON_BAT=0
|
||||||
|
# <<<
|
||||||
|
|
||||||
|
# Disable controller too (HDA only): Y/N.
|
||||||
|
# Note: effective only when SOUND_POWER_SAVE_ON_AC/BAT is activated.
|
||||||
|
# Default: Y
|
||||||
|
|
||||||
|
#SOUND_POWER_SAVE_CONTROLLER=Y
|
||||||
|
|
||||||
|
# PCIe Active State Power Management (ASPM):
|
||||||
|
# default(*), performance, powersave, powersupersave.
|
||||||
|
# (*) keeps BIOS ASPM defaults (recommended)
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#PCIE_ASPM_ON_AC=default
|
||||||
|
#PCIE_ASPM_ON_BAT=default
|
||||||
|
|
||||||
|
# Runtime Power Management for PCIe bus devices: on=disable, auto=enable.
|
||||||
|
# Default: on (AC), auto (BAT)
|
||||||
|
|
||||||
|
#RUNTIME_PM_ON_AC=on
|
||||||
|
#RUNTIME_PM_ON_BAT=auto
|
||||||
|
|
||||||
|
# Exclude listed PCIe device adresses from Runtime PM.
|
||||||
|
# Note: this preserves the kernel driver default, to force a certain state
|
||||||
|
# use RUNTIME_PM_ENABLE/DISABLE instead.
|
||||||
|
# Separate multiple addresses with spaces.
|
||||||
|
# Use lspci to get the adresses (1st column).
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#RUNTIME_PM_DENYLIST="11:22.3 44:55.6"
|
||||||
|
|
||||||
|
# Exclude PCIe devices assigned to the listed drivers from Runtime PM.
|
||||||
|
# Note: this preserves the kernel driver default, to force a certain state
|
||||||
|
# use RUNTIME_PM_ENABLE/DISABLE instead.
|
||||||
|
# Separate multiple drivers with spaces.
|
||||||
|
# Default: "mei_me nouveau radeon xhci_hcd", use "" to disable completely.
|
||||||
|
|
||||||
|
#RUNTIME_PM_DRIVER_DENYLIST="mei_me nouveau radeon xhci_hcd"
|
||||||
|
|
||||||
|
# Permanently enable/disable Runtime PM for listed PCIe device addresses
|
||||||
|
# (independent of the power source). This has priority over all preceding
|
||||||
|
# Runtime PM settings. Separate multiple addresses with spaces.
|
||||||
|
# Use lspci to get the adresses (1st column).
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#RUNTIME_PM_ENABLE="11:22.3"
|
||||||
|
#RUNTIME_PM_DISABLE="44:55.6"
|
||||||
|
|
||||||
|
# Set to 0 to disable, 1 to enable USB autosuspend feature.
|
||||||
|
# Default: 1
|
||||||
|
|
||||||
|
#USB_AUTOSUSPEND=1
|
||||||
|
|
||||||
|
# Exclude listed devices from USB autosuspend (separate with spaces).
|
||||||
|
# Use lsusb to get the ids.
|
||||||
|
# Note: input devices (usbhid) and libsane-supported scanners are excluded
|
||||||
|
# automatically.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#USB_DENYLIST="1111:2222 3333:4444"
|
||||||
|
|
||||||
|
# Exclude audio devices from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude.
|
||||||
|
# Default: 1
|
||||||
|
|
||||||
|
#USB_EXCLUDE_AUDIO=1
|
||||||
|
|
||||||
|
# Exclude bluetooth devices from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#USB_EXCLUDE_BTUSB=0
|
||||||
|
|
||||||
|
# Exclude phone devices from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude (enable charging).
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#USB_EXCLUDE_PHONE=0
|
||||||
|
|
||||||
|
# Exclude printers from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude.
|
||||||
|
# Default: 1
|
||||||
|
|
||||||
|
#USB_EXCLUDE_PRINTER=1
|
||||||
|
|
||||||
|
# Exclude WWAN devices from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#USB_EXCLUDE_WWAN=0
|
||||||
|
|
||||||
|
# Allow USB autosuspend for listed devices even if already denylisted or
|
||||||
|
# excluded above (separate with spaces). Use lsusb to get the ids.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#USB_ALLOWLIST="1111:2222 3333:4444"
|
||||||
|
|
||||||
|
# Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown
|
||||||
|
# on system startup: 0=disable, 1=enable.
|
||||||
|
# Note: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below
|
||||||
|
# are ignored when this is enabled.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#RESTORE_DEVICE_STATE_ON_STARTUP=0
|
||||||
|
|
||||||
|
# Radio devices to disable on startup: bluetooth, nfc, wifi, wwan.
|
||||||
|
# Separate multiple devices with spaces.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth nfc wifi wwan"
|
||||||
|
|
||||||
|
# Radio devices to enable on startup: bluetooth, nfc, wifi, wwan.
|
||||||
|
# Separate multiple devices with spaces.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#DEVICES_TO_ENABLE_ON_STARTUP="wifi"
|
||||||
|
|
||||||
|
# Radio devices to enable on AC: bluetooth, nfc, wifi, wwan.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#DEVICES_TO_ENABLE_ON_AC="bluetooth nfc wifi wwan"
|
||||||
|
|
||||||
|
# Radio devices to disable on battery: bluetooth, nfc, wifi, wwan.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#DEVICES_TO_DISABLE_ON_BAT="bluetooth nfc wifi wwan"
|
||||||
|
|
||||||
|
# Radio devices to disable on battery when not in use (not connected):
|
||||||
|
# bluetooth, nfc, wifi, wwan.
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth nfc wifi wwan"
|
||||||
|
|
||||||
|
# Battery Care -- Charge thresholds
|
||||||
|
# Charging starts when the charger is connected and the charge level
|
||||||
|
# is below the start threshold. Charging stops when the charge level
|
||||||
|
# is above the stop threshold.
|
||||||
|
# Required hardware: Lenovo ThinkPads and select other laptop brands
|
||||||
|
# are driven via specific plugins
|
||||||
|
# - Active plugin and support status are shown by tlp-stat -b
|
||||||
|
# - Vendor specific threshold levels are shown by tlp-stat -b, some
|
||||||
|
# laptops support only 1 (on)/ 0 (off) instead of a percentage level
|
||||||
|
# - When your hardware supports a start *and* a stop threshold, you must
|
||||||
|
# specify both, otherwise TLP will refuse to apply the single threshold
|
||||||
|
# - When your hardware supports only a stop threshold, set the start
|
||||||
|
# value to 0
|
||||||
|
# - Older ThinkPads may require an external kernel module, refer to the
|
||||||
|
# output of tlp-stat -b
|
||||||
|
# For further explanation and vendor specific details refer to
|
||||||
|
# - https://linrunner.de/tlp/settings/battery.html
|
||||||
|
# - https://linrunner.de/tlp/settings/bc-vendors.html
|
||||||
|
|
||||||
|
# BAT0: Primary / Main / Internal battery
|
||||||
|
# Note: also use for batteries BATC, BATT and CMB0
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
# Battery charge level below which charging will begin.
|
||||||
|
#START_CHARGE_THRESH_BAT0=75
|
||||||
|
# Battery charge level above which charging will stop.
|
||||||
|
#STOP_CHARGE_THRESH_BAT0=80
|
||||||
|
|
||||||
|
# BAT1: Secondary / Ultrabay / Slice / Replaceable battery
|
||||||
|
# Note: primary on some laptops
|
||||||
|
# Default: <none>
|
||||||
|
|
||||||
|
# Battery charge level below which charging will begin.
|
||||||
|
#START_CHARGE_THRESH_BAT1=75
|
||||||
|
# Battery charge level above which charging will stop.
|
||||||
|
#STOP_CHARGE_THRESH_BAT1=80
|
||||||
|
|
||||||
|
# Restore charge thresholds when AC is unplugged: 0=disable, 1=enable.
|
||||||
|
# Default: 0
|
||||||
|
|
||||||
|
#RESTORE_THRESHOLDS_ON_BAT=1
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# tlp-rdw - Parameters for the radio device wizard
|
||||||
|
|
||||||
|
# Possible devices: bluetooth, wifi, wwan.
|
||||||
|
# Separate multiple radio devices with spaces.
|
||||||
|
# Default: <none> (for all parameters below)
|
||||||
|
|
||||||
|
# Radio devices to disable on connect.
|
||||||
|
|
||||||
|
#DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
|
||||||
|
#DEVICES_TO_DISABLE_ON_WIFI_CONNECT="wwan"
|
||||||
|
#DEVICES_TO_DISABLE_ON_WWAN_CONNECT="wifi"
|
||||||
|
|
||||||
|
# Radio devices to enable on disconnect.
|
||||||
|
|
||||||
|
#DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi wwan"
|
||||||
|
#DEVICES_TO_ENABLE_ON_WIFI_DISCONNECT=""
|
||||||
|
#DEVICES_TO_ENABLE_ON_WWAN_DISCONNECT=""
|
||||||
|
|
||||||
|
# Radio devices to enable/disable when docked.
|
||||||
|
|
||||||
|
#DEVICES_TO_ENABLE_ON_DOCK=""
|
||||||
|
#DEVICES_TO_DISABLE_ON_DOCK=""
|
||||||
|
|
||||||
|
# Radio devices to enable/disable when undocked.
|
||||||
|
|
||||||
|
#DEVICES_TO_ENABLE_ON_UNDOCK="wifi"
|
||||||
|
#DEVICES_TO_DISABLE_ON_UNDOCK=""
|
||||||
Reference in New Issue
Block a user