diff options
63 files changed, 4386 insertions, 1446 deletions
diff --git a/.config/mc/hotlist b/.config/mc/hotlist deleted file mode 100644 index 47b50be..0000000 --- a/.config/mc/hotlist +++ /dev/null @@ -1,2 +0,0 @@ -ENTRY "/home/venomade/.build/suckless" URL "/home/venomade/.build/suckless" -ENTRY "/home/venomade/Documents" URL "/home/venomade/Documents" diff --git a/.config/mc/hotlist.bak b/.config/mc/hotlist.bak deleted file mode 100644 index 4dbffb7..0000000 --- a/.config/mc/hotlist.bak +++ /dev/null @@ -1 +0,0 @@ -ENTRY "/home/venomade/.build/suckless" URL "/home/venomade/.build/suckless" diff --git a/.config/mc/ini b/.config/mc/ini deleted file mode 100644 index 115ff36..0000000 --- a/.config/mc/ini +++ /dev/null @@ -1,166 +0,0 @@ -[Midnight-Commander] -verbose=true -shell_patterns=true -auto_save_setup=true -preallocate_space=false -auto_menu=false -use_internal_view=false -use_internal_edit=false -clear_before_exec=true -confirm_delete=true -confirm_overwrite=true -confirm_execute=false -confirm_history_cleanup=true -confirm_exit=false -confirm_directory_hotlist_delete=false -confirm_view_dir=false -safe_delete=false -safe_overwrite=false -use_8th_bit_as_meta=false -mouse_move_pages_viewer=true -mouse_close_dialog=false -fast_refresh=false -drop_menus=false -wrap_mode=true -old_esc_mode=true -cd_symlinks=true -show_all_if_ambiguous=false -alternate_plus_minus=false -only_leading_plus_minus=true -show_output_starts_shell=false -xtree_mode=false -file_op_compute_totals=true -classic_progressbar=true -use_netrc=true -ftpfs_always_use_proxy=false -ftpfs_use_passive_connections=true -ftpfs_use_passive_connections_over_proxy=false -ftpfs_use_unix_list_options=true -ftpfs_first_cd_then_ls=true -ignore_ftp_chattr_errors=true -editor_fill_tabs_with_spaces=false -editor_return_does_auto_indent=true -editor_backspace_through_tabs=false -editor_fake_half_tabs=true -editor_option_save_position=true -editor_option_auto_para_formatting=false -editor_option_typewriter_wrap=false -editor_edit_confirm_save=true -editor_syntax_highlighting=true -editor_persistent_selections=true -editor_drop_selection_on_copy=true -editor_cursor_beyond_eol=false -editor_cursor_after_inserted_block=false -editor_visible_tabs=true -editor_visible_spaces=true -editor_line_state=false -editor_simple_statusbar=false -editor_check_new_line=false -editor_show_right_margin=false -editor_group_undo=false -editor_state_full_filename=false -editor_ask_filename_before_edit=false -nice_rotating_dash=true -shadows=true -mcview_remember_file_position=false -auto_fill_mkdir_name=true -copymove_persistent_attr=true -pause_after_run=1 -mouse_repeat_rate=100 -double_click_speed=250 -old_esc_mode_timeout=1000000 -max_dirt_limit=10 -num_history_items_recorded=60 -vfs_timeout=60 -ftpfs_directory_timeout=900 -ftpfs_retry_seconds=30 -shell_directory_timeout=900 -editor_tab_spacing=8 -editor_word_wrap_line_length=72 -editor_option_save_mode=0 -editor_backup_extension=~ -editor_filesize_threshold=64M -editor_stop_format_chars=-+*\\,.;:&> -mcview_eof= -skin=seasons-winter16M -filepos_max_saved_entries=1024 - -use_file_to_guess_type=true -fish_directory_timeout=900 - -[Layout] -output_lines=0 -left_panel_size=40 -top_panel_size=0 -message_visible=true -keybar_visible=false -xterm_title=true -command_prompt=true -menubar_visible=false -free_space=false -horizontal_split=false -vertical_equal=true -horizontal_equal=true - -[Misc] -timeformat_recent=%b %e %H:%M -timeformat_old=%b %e %Y -ftp_proxy_host=gate -ftpfs_password=anonymous@ -display_codepage=UTF-8 -source_codepage=Other_8_bit -autodetect_codeset= -clipboard_store= -clipboard_paste= - -spell_language=en - -[Colors] -base_color= -xterm-kitty= -color_terminals= - -xterm-256color= - -[Panels] -simple_swap=false -show_mini_info=true -kilobyte_si=false -mix_all_files=false -show_backups=true -show_dot_files=true -fast_reload=false -fast_reload_msg_shown=false -mark_moves_down=true -reverse_files_only=true -auto_save_setup_panels=false -navigate_with_arrows=false -panel_scroll_pages=true -panel_scroll_center=false -mouse_move_pages=true -filetype_mode=true -permission_mode=false -torben_fj_mode=false -quick_search_mode=0 -select_flags=6 - -[FindFile] -file_case_sens=true -file_shell_pattern=true -file_find_recurs=true -follow_symlinks=false -file_skip_hidden=false -file_all_charsets=false -content_case_sens=true -content_regexp=false -content_first_hit=false -content_whole_words=false -content_all_charsets=false -ignore_dirs_enable=true -ignore_dirs= - -[Panelize] -Find *.orig after patching=find . -name \\*.orig -print -Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm /011 \\) -o \\( -perm -02000 -a -perm /01 \\) \\) -print -Find rejects after patching=find . -name \\*.rej -print -Modified git files=git ls-files --modified diff --git a/.config/mc/panels.ini b/.config/mc/panels.ini deleted file mode 100644 index d22858b..0000000 --- a/.config/mc/panels.ini +++ /dev/null @@ -1,37 +0,0 @@ -[New Left Panel] -display=listing -reverse=false -case_sensitive=true -exec_first=false -sort_order=name -list_mode=full -brief_cols=2 -user_format=half type name | size | perm -user_status0=half type name | size | perm -user_status1=half type name | size | perm -user_status2=half type name | size | perm -user_status3=half type name | size | perm -user_mini_status=false -filter_flags=7 -list_format=full - -[New Right Panel] -display=listing -reverse=false -case_sensitive=true -exec_first=false -sort_order=name -list_mode=full -brief_cols=2 -user_format=half type name | size | perm -user_status0=half type name | size | perm -user_status1=half type name | size | perm -user_status2=half type name | size | perm -user_status3=half type name | size | perm -user_mini_status=false -filter_flags=7 -list_format=full - -[Dirs] -current_is_left=true -other_dir=/home/venomade/.build/suckless/patches/st diff --git a/.config/shell/alias b/.config/shell/alias deleted file mode 100644 index c060c0e..0000000 --- a/.config/shell/alias +++ /dev/null @@ -1,3 +0,0 @@ -alias gvc="ssh git@git.venomade.com" -alias rgf='rg --files | rg' -alias ls='ls --color=auto' \ No newline at end of file diff --git a/.config/shell/vars b/.config/shell/vars deleted file mode 100644 index 11f8faa..0000000 --- a/.config/shell/vars +++ /dev/null @@ -1,3 +0,0 @@ -export PATH="$PATH:$HOME/.local/bin" - -export EDITOR=mg \ No newline at end of file diff --git a/.emacs.d/config.org b/.emacs.d/config.org deleted file mode 100644 index 5b7f51e..0000000 --- a/.emacs.d/config.org +++ /dev/null @@ -1,1138 +0,0 @@ -#+title: Emacs Config -#+author: Venomade - -* Contents :toc_2: -- [[#straight-package-manager][Straight Package Manager]] -- [[#configs][Configs]] - - [[#custom-functions][Custom Functions]] - - [[#fix-annoyances][Fix Annoyances]] - - [[#keybindings][Keybindings]] - - [[#setup-line-numbers][Setup Line Numbers]] -- [[#general][General]] - - [[#avy][Avy]] - - [[#colors][Colors]] - - [[#dired][Dired]] - - [[#eshell][EShell]] - - [[#git][Git]] - - [[#move-text][Move Text]] - - [[#ivy-counsel][Ivy (Counsel)]] - - [[#simple-modeline][Simple Modeline]] - - [[#smart-parentheses-pairing][Smart Parentheses Pairing]] - - [[#undo-tree][Undo Tree]] -- [[#org-mode][Org Mode]] - - [[#table-of-contents][Table of Contents]] - - [[#bullet-headers][Bullet Headers]] - - [[#org-agenda][Org Agenda]] - - [[#org-babel][Org Babel]] - - [[#org-tempo][Org Tempo]] - - [[#styling][Styling]] -- [[#programming][Programming]] - - [[#projects][Projects]] - - [[#lsp][LSP]] - - [[#treesitter][TreeSitter]] - - [[#languages][Languages]] - - [[#company][Company]] - - [[#cape][Cape]] - - [[#utilities][Utilities]] -- [[#user-interface][User Interface]] - - [[#add-nerd-icons][Add Nerd Icons]] - - [[#fonts][Fonts]] - - [[#theme][Theme]] - - [[#niceties][Niceties]] - - [[#modern-looking-emacs][Modern Looking Emacs]] - -* Straight Package Manager -I'm using the Straight package manager instead of use-package because it is only available in Emacs 29 and above. -#+begin_src emacs-lisp - (defvar bootstrap-version) - (let ((bootstrap-file - (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory)) - (bootstrap-version 6)) - (unless (file-exists-p bootstrap-file) - (with-current-buffer - (url-retrieve-synchronously - "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" - 'silent 'inhibit-cookies) - (goto-char (point-max)) - (eval-print-last-sexp))) - (load bootstrap-file nil 'nomessage)) - - (setq straight-use-package-by-default t) -#+end_src - -* Configs -** Custom Functions -*** Cursor follow on split -This is so that action can be taken as soon as a split takes place, to either close/move the window or perform an action inside of it. -#+begin_src emacs-lisp - (defun split-and-follow-horizontally() - (interactive) - (split-window-below) - (balance-windows) - (other-window 1)) - - (defun split-and-follow-vertically() - (interactive) - (split-window-right) - (balance-windows) - (other-window 1)) -#+end_src -*** Duplicate Line -Duplicates the current line to the line below. -#+begin_src emacs-lisp - (defun duplicate-line () - (interactive) - (let ((column (- (point) (point-at-bol))) - (line (let ((s (thing-at-point 'line t))) - (if s (string-remove-suffix "\n" s) "")))) - (move-end-of-line 1) - (newline) - (insert line) - (move-beginning-of-line 1) - (forward-char column))) - - (keymap-global-set "C-c y d" 'duplicate-line) -#+end_src -*** Open Line above and below -Vim's o and S-o implemented for Emacs bindings. -#+begin_src emacs-lisp - (defun vi-open-line-above () - (interactive) - (unless (bolp) - (beginning-of-line)) - (newline) - (forward-line -1) - (indent-according-to-mode)) - - (defun vi-open-line-below () - (interactive) - (unless (eolp) - (end-of-line)) - (newline-and-indent)) - - (keymap-global-set "C-c O" 'vi-open-line-below) - (keymap-global-set "C-c o" 'vi-open-line-above) -#+end_src -*** C-a to indentation -Have c-a move the cursor to the start after indentation unless already there. -#+begin_src emacs-lisp - (defun smart-beginning-of-line () - (interactive) - (let ((initial-point (point))) - (back-to-indentation) - (when (eq initial-point (point)) - (move-beginning-of-line 1)))) - - (defun setup-prog-mode-c-a () - (local-set-key (kbd "C-a") 'smart-beginning-of-line)) - - (add-hook 'prog-mode-hook 'setup-prog-mode-c-a) -#+end_src -*** Automatically Cull Whitespace -Remove trailing whitespaces when saving in prog-modes. -#+begin_src emacs-lisp - (defun prog-nuke-trailing-whitespace () - (when (derived-mode-p 'prog-mode) - (delete-trailing-whitespace))) - - (add-hook 'before-save-hook 'prog-nuke-trailing-whitespace) -#+end_src -*** Quick Grep -Quickly grep both my current project and the system include directory. -#+begin_src emacs-lisp - (defun grep-symbol-at-point () - (interactive) - (let ((symbol (thing-at-point 'symbol))) - (if symbol - (counsel-rg (concat symbol)) - (message "No symbol at point.")))) - - (defun grep-symbol-in-include-at-point () - (interactive) - (let ((symbol (thing-at-point 'symbol))) - (if symbol - (counsel-rg (concat symbol) "/usr/include/") - (message "No symbol at point.")))) - - (global-set-key (kbd "C-c g") 'grep-symbol-at-point) - (global-set-key (kbd "C-c G") 'grep-symbol-in-include-at-point) -#+end_src - -** Fix Annoyances -*** Disable Backups -Living on the edge. -#+begin_src emacs-lisp - (setq backup-directory-alist - `(("." . ,(concat user-emacs-directory "backups")))) - (setq auto-save-file-name-transforms - `(("." ,(concat user-emacs-directory "autosaves/") t))) - (setq lock-file-name-transforms - `(("." ,(concat user-emacs-directory "lock") t))) -#+end_src -*** Disable Bell -Only flash, no sound, it gets annoying. -#+begin_src emacs-lisp - (setq ring-bell-function 'ignore) -#+end_src -*** Hide Warnings -Fixing warnings is for nerds. This is basically necessary after more than 5 packages. -#+begin_src emacs-lisp - (setq warning-minimum-level :emergency) -#+end_src -*** Add Scroll Marginn -This adds a scroll margin at the top and bottom of 10 lines to make it easier to scroll through the buffer. -#+begin_src emacs-lisp - (setq scroll-margin 10) -#+end_src -*** Save Place -Go back to old position on file open. -#+begin_src emacs-lisp - (save-place-mode 1) -#+end_src - -** Keybindings -*** Reload Emacs -Reload Emacs by sourcing the init.el file. -#+begin_src emacs-lisp - (keymap-global-set "C-c e c" (lambda () (interactive) (load-file "~/.emacs.d/init.el"))) -#+end_src -*** Open Common Files -Open the TODO, Bookmarks and Notes from synced Documents and the config file with simple shortcuts. -#+begin_src emacs-lisp - (keymap-global-set "C-c f c" (lambda () (interactive) (find-file "~/.emacs.d/config.org"))) - (keymap-global-set "C-c f t" (lambda () (interactive) (find-file "~/Documents/TODO.org"))) - (keymap-global-set "C-c f b" (lambda () (interactive) (find-file "~/Documents/Bookmarks.org"))) - (keymap-global-set "C-c f n" (lambda () (interactive) (find-file "~/Documents/Notes.org"))) - (keymap-global-set "C-c f i" (lambda () (interactive) (find-file "~/Documents/Ideas.org"))) -#+end_src -*** Switch and Revert Buffers -Add shortcuts to switch buffers and to revert buffer. -#+begin_src emacs-lisp - (keymap-global-set "C-x C-b" 'ibuffer) - (keymap-global-set "C-c b p" 'previous-buffer) - (keymap-global-set "C-c b n" 'next-buffer) - (keymap-global-set "C-c b r" 'revert-buffer) -#+end_src -*** Compile Mode -Add shortcuts to build in compile-mode. -#+begin_src emacs-lisp - (setq compilation-scroll-output t) - (keymap-global-set "C-c m c" 'compile) - (keymap-global-set "C-c m r" 'recompile) -#+end_src -*** Emacs -Add shortcuts to various Emacs functions. -#+begin_src emacs-lisp - (keymap-global-set "C-c e b" 'eval-buffer) - (keymap-global-set "C-c e r" 'eval-region) - (keymap-global-set "C-c e s" 'eshell) - (keymap-global-set "C-c e t" 'ef-themes-load-random) -#+end_src -*** Regex and Copy from Above -Add shortcuts to entering a regex replace and copying a line from above. -#+begin_src emacs-lisp - (keymap-global-set "C-c r" 'replace-regexp) - (keymap-global-set "C-c y a" 'copy-from-above-command) -#+end_src -*** Window Management -Add shortcuts to scrolling and moving between windows. -#+begin_src emacs-lisp - (keymap-global-set "C-c v" 'scroll-other-window) - (keymap-global-set "C-c V" 'scroll-other-window-down) - - (keymap-global-set "C-c w n" 'other-window) - (keymap-global-set "C-c w f" 'other-window) - (keymap-global-set "C-c w p" (lambda () (interactive) (other-window -1))) - (keymap-global-set "C-c w b" (lambda () (interactive) (other-window -1))) -#+end_src - -** Setup Line Numbers -*** Always show line numbers -Show line numbers and highlight the current line. -#+begin_src emacs-lisp - (add-hook 'prog-mode-hook 'display-line-numbers-mode) - (global-visual-line-mode t) - (add-hook 'prog-mode-hook (lambda () (visual-line-mode -1))) - (setq-default truncate-lines t) - (global-hl-line-mode 1) -#+end_src -*** Generally use spaces instead of tabs -Generally, as in everywhere but Go. -#+begin_src emacs-lisp - (setq-default indent-tabs-mode nil) - (setq tab-width 2) - (setq tab-stop-list (number-sequence 2 100 2)) -#+end_src -*** Highlight Column -Highlight a column at 120 chars to respect GNOME style. -#+begin_src emacs-lisp - (setq-default display-fill-column-indicator-column 120) - (add-hook 'prog-mode-hook #'display-fill-column-indicator-mode) -#+end_src - -* General -** Avy -Keybind superfast cursor movement to "C-q". -#+begin_src emacs-lisp - (use-package avy - :config - (setq avy-keys '(?a ?r ?s ?t ?n ?e ?i ?o) - avy-all-windows nil) - (bind-key* "C-q" 'avy-goto-char)) -#+end_src - -** Colors -*** Highlight Todo -Highlight TODO items so they can be reviewed later. -#+begin_src emacs-lisp - (use-package hl-todo - :hook ((org-mode . hl-todo-mode) - (prog-mode . hl-todo-mode)) - - :config - (setq hl-todo-highlight-punctuation ":" - hl-todo-highlight-faces - `(("TODO" warning bold) - ("FIXME" error bold) - ("HACK" font-lock-constant-face bold) - ("REVIEW" font-lock-doc-face bold) - ("NOTE" success bold) - ("DEPRECATED" font-lock-doc-face bold)))) -#+end_src -*** Rainbow Delimiters -Makes different brackets and other delimeters levels different colors so they can be quickly distinguished. -#+begin_src emacs-lisp - (use-package rainbow-delimiters - :hook (prog-mode . rainbow-delimiters-mode)) -#+end_src - -** Dired -A powerful built-in file manager. -#+begin_src emacs-lisp - (setq dired-listing-switches "-lh") -#+end_src - -** EShell -A built in posix shell. -#+begin_src emacs-lisp - ;; Define custom faces for the prompt. These inherit from standard faces so they - ;; automatically adapt to your current theme. - (defface eshell-prompt-user-face - '((t (:inherit font-lock-keyword-face))) - "Face for the username in the eshell prompt." - :group 'eshell-prompt) - - (defface eshell-prompt-venv-face - '((t (:inherit font-lock-string-face))) - "Face for the virtualenv name in the eshell prompt." - :group 'eshell-prompt) - - (defface eshell-prompt-dir-face - '((t (:inherit dired-directory))) - "Face for the directory path in the eshell prompt." - :group 'eshell-prompt) - - (defface eshell-prompt-git-face - '((t (:inherit magit-tag))) - "Face for the git branch in the eshell prompt." - :group 'eshell-prompt) - - (defface eshell-prompt-git-dirty-face - '((t (:inherit eshell-prompt-git-face))) - "Face for the git dirty status in the eshell prompt." - :group 'eshell-prompt) - - (defface eshell-prompt-symbol-face - '((t (:inherit font-lock-builtin-face))) - "Face for the prompt symbol (e.g. λ) in the eshell prompt." - :group 'eshell-prompt) - - ;; A helper function to abbreviate long directory names. - (defun my-abbreviate-dir (dir) - "Abbreviate DIR to show only the first and the last two components. - For example, \"~/Projects/Learning/C/GeneticsProject/TsodingGenetics\" becomes - \"~/.../GeneticsProject/TsodingGenetics\"." - (let* ((abbrev (abbreviate-file-name dir)) - (components (split-string abbrev "/" t)) ; t omits empty strings - (num-components (length components))) - (if (>= num-components 4) - (concat (car components) "/.../" - (mapconcat #'identity (last components 2) "/")) - abbrev))) - - ;; These are the same helper functions for git information you had. - (defun my-prompt-git-branch () - "Return the current git branch or short commit hash, if available." - (when (and (executable-find "git") - (locate-dominating-file default-directory ".git")) - (with-temp-buffer - (let ((ret (call-process "git" nil t nil "symbolic-ref" "--short" "HEAD"))) - (if (zerop ret) - (string-trim (buffer-string)) - (when (zerop (call-process "git" nil t nil "rev-parse" "--short" "HEAD")) - (string-trim (buffer-string)))))))) - - (defun my-prompt-git-dirty () - "Return a dirty flag (✗ if dirty, ✓ if clean) for the git repository." - (when (my-prompt-git-branch) - (with-temp-buffer - (call-process "git" nil t nil "status" "--porcelain") - (if (> (buffer-size) 0) "✗" "✓")))) - - ;; Finally, build the prompt itself. - (defun eshell-prompt () - "Custom eshell prompt with theme-derived colors and shortened directory path." - (let* ((user (propertize (user-login-name) 'face 'eshell-prompt-user-face)) - (venv (when-let ((venv (getenv "VIRTUAL_ENV"))) - (concat (propertize "(" 'face 'eshell-prompt-venv-face) - (propertize (file-name-nondirectory venv) 'face 'eshell-prompt-venv-face) - (propertize ")" 'face 'eshell-prompt-venv-face)))) - (path (propertize (my-abbreviate-dir (eshell/pwd)) 'face 'eshell-prompt-dir-face)) - (git-branch (my-prompt-git-branch)) - (git-info (when git-branch - (concat " " (propertize "on" 'face 'font-lock-number-face) " " - (propertize git-branch 'face 'eshell-prompt-git-face) - (propertize (my-prompt-git-dirty) 'face 'eshell-prompt-git-dirty-face)))) - (prompt (concat user " " (propertize "in" 'face 'font-lock-number-face) " " - (if venv (concat venv " ") "") - path git-info "\n" - (propertize "λ" 'face 'eshell-prompt-symbol-face) " "))) - prompt)) - - ;; Tell eshell to use our prompt function. - (setq eshell-prompt-function 'eshell-prompt) - (setq eshell-prompt-regexp "^[^λ\n]*λ ") -#+end_src -** Git -Tools for the primary version control system. -*** Magit -A very extensive Git GUI for Emacs. -#+begin_src emacs-lisp - (use-package magit) -#+end_src -*** Magit Todos -Show Todo list in Magit. -#+begin_src emacs-lisp - (use-package magit-todos - :after magit - :config (magit-todos-mode 1)) -#+end_src -*** Magit Forge -Work with Git Forges from within Emacs. -#+begin_src emacs-lisp - (use-package forge - :after magit - :config - (setq auth-sources '("~/.authinfo"))) -#+end_src - -** Move Text -Move text up and down with simple keybindings. -#+begin_src emacs-lisp - (use-package move-text - :config - (keymap-global-set "M-p" 'move-text-up) - (keymap-global-set "M-n" 'move-text-down)) -#+end_src - -** Ivy (Counsel) -*** Counsel -Adds better fuzzy completion to many Emacs commands. -#+begin_src emacs-lisp - (use-package counsel - :after ivy - :config - (counsel-mode 1) - (keymap-global-set "C-c f r" 'counsel-buffer-or-recentf) - (keymap-global-set "C-c f f" 'counsel-fzf) - (keymap-global-set "C-c f g" 'counsel-rg) - (keymap-global-set "C-c f l" 'counsel-locate) - (keymap-global-set "C-c s" 'swiper)) -#+end_src -*** Ivy -Adds fuzzy completion to basic Emacs commands. -#+begin_src emacs-lisp - (use-package ivy - :custom - (setq ivy-use-virtual-buffers t) - (setq ivy-count-format "(%d/%d) ") - (setq enable-recursive-minibuffers t) - :config - (ivy-mode 1)) - - ;; (use-package ivy-prescient - ;; :after counsel - ;; :config - ;; (ivy-prescient-mode 1)) -#+end_src -*** Ivy Rich -Adds Icons to all the new fuzzy completed Emacs commands. -#+begin_src emacs-lisp - (use-package ivy-rich - :after ivy - :init (ivy-rich-mode 1) - :custom - (ivy-virtual-abbreviate 'full - ivy-rich-switch-buffer-align-virtual-buffer t - ivy-rich-path-style 'abbrev)) -#+end_src - -** Simple Modeline -Make the modeline simple by hiding modes. -#+begin_src emacs-lisp - (setq-default mode-line-format (delq 'mode-line-modes mode-line-format) - display-time-24hr-format t - display-time-default-load-average nil) - (display-battery-mode 1) - (display-time-mode 1) -#+end_src - -** Smart Parentheses Pairing -Automatically deals with parentheses in pairs. -#+begin_src emacs-lisp - (use-package smartparens - :hook (prog-mode text-mode markdown-mode) - :config - (require 'smartparens-config) - (sp-use-paredit-bindings)) -#+end_src - -** Undo Tree -Makes undo history like a Git commit tree, very powerful. -#+begin_src emacs-lisp - (use-package undo-tree - :config - (setq undo-tree-history-directory-alist - `(("." . ,(concat user-emacs-directory "undo")))) - (global-undo-tree-mode 1)) -#+end_src - -* Org Mode -** Table of Contents -Automatically generate a table of contents for an Org file. -#+begin_src emacs-lisp - (use-package toc-org - :commands toc-org-enable - :init (add-hook 'org-mode-hook 'toc-org-enable) - :config (setq org-src-window-setup 'current-window)) - (add-hook 'org-mode-hook 'org-indent-mode) -#+end_src - -** Bullet Headers -Stylize Org Mode headers with Nerd Icons. -#+begin_src emacs-lisp - (use-package org-bullets - :config - (setq org-bullets-bullet-list '( - "" - "" - "" - "" - ""))) - (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) -#+end_src - -** Org Agenda -Manage a Todo list, a Calendar, and other organization tools with Org. -#+begin_src emacs-lisp - (setq org-agenda-files '("~/Documents/Org/agenda.org")) - (setq org-fancy-priorities-list '("[A]" "[B]" "[C]") - org-priority-faces - '((?A :foreground "#ff6c6b" :weight bold) - (?B :foreground "#ffff91" :weight bold) - (?C :foreground "#aaffaa" :weight bold))) - (setq org-agenda-custom-commands - '(("v" "View Agenda" - ((tags "PRIORITY=\"A\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "HIGH PRIORITY:"))) - (tags "PRIORITY=\"B\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "Medium Priority:"))) - (tags "PRIORITY=\"C\"" - ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) - (org-agenda-overriding-header "low priority:"))) - (agenda "") - (alltodo ""))))) -#+end_src - -** Org Babel -Setup literate progamming in Org Mode. -*** Config -Don't ask for conformation when evaluating source blocks. -#+begin_src emacs-lisp - (setq org-confirm-babel-evaluate nil) -#+end_src -*** Load Languages -#+begin_src emacs-lisp - (org-babel-do-load-languages - 'org-babel-load-languages - '((python . t) - (lua . t))) -#+end_src - -** Org Tempo -This provides shorthands for Org functions. -#+begin_src emacs-lisp - (require 'org-tempo) -#+end_src - -** Styling -Hide markers for bold, italic and other types of text styling. -#+begin_src emacs-lisp - (setq org-hide-emphasis-markers t) -#+end_src - -* Programming -** Projects -Manage Project folders from within Emacs. -*** Project.el -Use project.el and set shortcuts with prefix "C-c p". -#+begin_src emacs-lisp - (require 'project) - - (keymap-global-set "C-c p b" 'project-list-buffers) - (keymap-global-set "C-c p c" 'project-compile) - (keymap-global-set "C-c p e" 'project-dired) - (keymap-global-set "C-c p f" 'project-find-file) - (keymap-global-set "C-c f p" 'project-find-file) - (keymap-global-set "C-c p g" 'project-find-regexp) - (keymap-global-set "C-c p o" 'project-find-dir) - (keymap-global-set "C-c p p" 'project-switch-project) -#+end_src -*** Disproject -Magit like interface ontop of project.el. -#+begin_src emacs-lisp - (use-package disproject - ;; Replace `project-prefix-map' with `disproject-dispatch'. - :bind ( :map ctl-x-map - ("p" . disproject-dispatch))) -#+end_src -*** Run Project -Run the current project. -#+begin_src emacs-lisp - (require 'project) - - (defvar-local project-binary-name nil) - (defvar-local project-binary-args nil) - (defvar-local project-debugger "gf2") - - (defun get-project-binary-info () - (let* ((project (project-current t)) - (project-root (project-root project)) - (binary-name (or project-binary-name - (downcase - (file-name-nondirectory (directory-file-name project-root))))) - (binary-path (expand-file-name binary-name project-root)) - (args (or project-binary-args ""))) - (list binary-path args))) - - (defun run-project-binary () - (interactive) - (let* ((binary-info (get-project-binary-info)) - (binary-path (nth 0 binary-info)) - (args (nth 1 binary-info)) - (original-compile-command compile-command)) - (if (file-executable-p binary-path) - (progn - (setq compile-command (concat binary-path " " args)) - (unwind-protect - (compile compile-command) - (setq compile-command original-compile-command))) - (error "Binary '%s' not found or not executable in project root" binary-path)))) - - (defun debug-project-binary () - (interactive) - (let* ((binary-info (get-project-binary-info)) - (binary-path (nth 0 binary-info)) - (args (nth 1 binary-info)) - (debugger (or project-debugger "gdb")) - (debug-command (concat debugger " --args " binary-path " " args)) - (original-compile-command compile-command)) - (if (file-executable-p binary-path) - (progn - (setq compile-command debug-command) - (unwind-protect - (compile compile-command) - (setq compile-command original-compile-command))) - (error "Binary '%s' not found or not executable in project root" binary-path)))) - - ;; Mark 'project-binary-name' and 'project-binary-args' as safe for dir-locals. - (put 'project-binary-name 'safe-local-variable #'stringp) - (put 'project-binary-args 'safe-local-variable #'stringp) - - (keymap-global-set "C-c p r" 'run-project-binary) - (keymap-global-set "C-c p d" 'debug-project-binary) -#+end_src - -** LSP -*** LSP Mode -Use language servers to provide info and completion. -#+begin_src emacs-lisp - (use-package lsp-mode - :init - (setq lsp-completion-provider :none - lsp-keymap-prefix "C-c l" - lsp-headerline-breadcrumb-enable nil) - :commands lsp lsp-deferred - :config - (lsp-enable-snippet t)) - ;; (lsp-enable-which-key-integration t)) - - ;; (use-package lsp-ui - ;; :commands lsp-ui-mode - ;; :hook (prog-mode . lsp-ui-mode) - ;; :config - ;; (keymap-global-set "C-c l d" 'lsp-ui-doc-show)) - - ;; Instead: - (keymap-global-set "C-c l d" 'lsp-describe-thing-at-point) -#+end_src -*** YASnippet -Autocomplete Snippets to write common code patterns faster. -#+begin_src emacs-lisp - (use-package yasnippet - :config - (setq yas-snippet-dirs '("~/Documents/snippets")) - (yas-global-mode 1) - (keymap-global-set "M-<tab>" 'yas-next-field-or-maybe-expand) - (keymap-global-set "C-'" 'yas-expand)) - - (straight-use-package - '(yasnippet-capf :type git :host github :repo "elken/yasnippet-capf")) - - (use-package yasnippet-treesitter-shim - :straight (:host github :repo "fbrosda/yasnippet-treesitter-shim" - :files ("snippets/*")) - :no-require t - :config - (add-to-list 'yas-snippet-dirs - (straight--build-dir "yasnippet-treesitter-shim"))) -#+end_src - -*** DevDocs -Search documentation from within Emacs. -#+begin_src emacs-lisp - (use-package devdocs - :config - (keymap-global-set "C-c d" 'devdocs-lookup)) -#+end_src - -** TreeSitter -Use advanced highlighting by default. -#+begin_src emacs-lisp - (require 'treesit) - (use-package treesit-auto - :config - (global-treesit-auto-mode)) - (setq major-mode-remap-alist (treesit-auto--build-major-mode-remap-alist)) -#+end_src - -** Languages -*** C -The Classic. -#+begin_src emacs-lisp - (add-hook 'c-mode-hook #'lsp) - (add-hook 'c-ts-mode-hook #'lsp) - - ;; Use GNU Style in LSP-Mode for C - (with-eval-after-load 'lsp-clangd - (setq lsp-clients-clangd-args '("--header-insertion-decorators=0" "--fallback-style=GNU"))) - - ;; Automatically write header guards - (defun insert-header-guards () - (when (and (buffer-file-name) - (string-match "\\.h\\'" (buffer-file-name))) - (let* ((filename (file-name-nondirectory (buffer-file-name))) - (guard (upcase (replace-regexp-in-string "[^a-zA-Z0-9]" "_" filename)))) - (when (zerop (buffer-size)) ; Only insert if the file is empty - (insert (format "#ifndef %s\n#define %s\n\n\n$0\n\n#endif // %s\n" - guard guard guard)) - (goto-char (point-min)) - (search-forward "$0") - (delete-char -3))))) - - (add-hook 'find-file-hook 'insert-header-guards) -#+end_src -*** COMMENT D -C Interop with a GC. -#+begin_src emacs-lisp - (use-package d-mode - :hook (d-mode . lsp)) -#+end_src -*** COMMENT Go -A simple C-like language with a GC. -#+begin_src emacs-lisp - (use-package go-mode - :config - (setenv "PATH" (concat (concat - (concat (expand-file-name "/usr/local/go/bin") ":") - (getenv "PATH")))) - (setenv "PATH" (concat (concat - (concat (expand-file-name "~/.go/bin") ":") - (getenv "PATH")))) - - (setq exec-path (append exec-path (list (expand-file-name "/usr/local/go/bin")))) - (setq exec-path (append exec-path (list (expand-file-name "~/.go/bin")))) - (add-hook 'go-mode-hook - (lambda () - (setq tab-width 4))) - :hook - (go-mode . lsp)) -#+end_src -*** Haskell -Functionally Scottish. -#+begin_src emacs-lisp - (use-package haskell-mode - :config - (setenv "PATH" (concat (concat - (concat (expand-file-name "~/.ghcup/bin") ":") - (getenv "PATH")))) - - (setq exec-path (append exec-path (list (expand-file-name "~/.ghcup/bin"))))) - - (use-package lsp-haskell - :hook - (haskell-mode . lsp)) -#+end_src -*** COMMENT LISP -Programming for Programmers. -#+begin_src emacs-lisp - ;; (use-package slime - ;; :init - ;; (slime-setup '(slime-fancy slime-quicklisp slime-asdf slime-mrepl)) - ;; :config - ;; (setq inferior-lisp-program "/usr/bin/sbcl") - ;; (add-hook 'slime-repl-mode-hook 'smartparens-mode)) - - (use-package sly - :config - (setq inferior-lisp-program "ros -Q run" - browse-url-browser-function '(("hyperspec" . eww-browse-url) ("." . browse-url-default-browser))) - (add-hook 'sly-mrepl-mode-hook 'smartparens-mode) - (add-hook 'sly-mrepl-mode-hook 'company-mode) - (add-hook 'lisp-mode-hook - (lambda () - (define-key lisp-mode-map (kbd "C-c d") 'sly-documentation)))) - - ;; (with-eval-after-load 'sly - ;; (load (expand-file-name "~/.roswell/helper.el"))) -#+end_src -*** COMMENT Lua -A simple Python-like language with many implementations. -#+begin_src emacs-lisp - (straight-use-package - '(lua-mode :type git :host github :repo "immerrr/lua-mode")) - (add-hook 'lua-mode-hook #'lsp) - - (setq lua-indent-nested-block-content-align nil) - (setq lua-indent-close-paren-align nil) - - (defun lua-at-most-one-indent (old-function &rest arguments) - (let ((old-res (apply old-function arguments))) - (if (> old-res lua-indent-level) lua-indent-level old-res))) - - (advice-add #'lua-calculate-indentation-block-modifier - :around #'lua-at-most-one-indent) - - (setq lua-indent-level 2) - (setq lua-electric-flag nil) - (defun lua-abbrev-mode-off () (abbrev-mode 0)) - (add-hook 'lua-mode-hook 'lua-abbrev-mode-off) - (setq save-abbrevs nil) ;; is this still needed? -#+end_src -*** OCaml -Installed with OPAM -#+begin_src emacs-lisp - (setenv "PATH" (concat (concat - (concat (expand-file-name "~/.opam/default/bin") ":") - (getenv "PATH")))) - - (setq exec-path (append exec-path (list (expand-file-name "~/.opam/default/bin")))) - - (use-package tuareg - :hook - (tuareg-mode . lsp)) - - (add-to-list 'load-path "/home/venomade/.opam/default/share/emacs/site-lisp") - (require 'ocp-indent) - (require 'dune) - (require 'utop) -#+end_src -*** COMMENT Vala -An OOP Language for C & GLib interop. -#+begin_src emacs-lisp - (use-package vala-mode) -#+end_src - -** Company -A powerful auto-completion utility. -#+begin_src emacs-lisp - (use-package company - :config - (define-key company-active-map (kbd "RET") nil) - (define-key company-active-map (kbd "<return>") nil) - (define-key company-active-map (kbd "C-m") nil) - - ;; TAB indents or selects a completion - (define-key company-active-map (kbd "TAB") #'company-complete-selection) - (define-key company-active-map (kbd "<tab>") #'company-complete-selection) - - ;; Use C-p and C-n to navigate the completion list - (define-key company-active-map (kbd "C-p") #'company-select-previous) - (define-key company-active-map (kbd "C-n") #'company-select-next) - - ;; Restore normal tab behavior outside company-mode completions - (define-key company-mode-map (kbd "TAB") #'indent-for-tab-command) - (define-key company-mode-map (kbd "<tab>") #'indent-for-tab-command) - - ;; Disable Autocomplete - (setq company-idle-delay 0) - - ;; Disable Case Sensitivity - (setq completion-ignore-case t) - - ;; Bind M-/ to company-complete - (define-key global-map (kbd "M-/") 'company-complete) - (define-key global-map (kbd "M-?") 'dabbrev-expand) - :hook - (prog-mode . company-mode)) - - (use-package company-quickhelp - :config - (company-quickhelp-mode 1) - (setq company-quickhelp-delay 0.5) - (setq company-quickhelp-color-background (face-attribute 'company-tooltip :background)) - (add-hook 'enable-theme-functions - (lambda (_) - (setq company-quickhelp-color-background (face-attribute 'company-tooltip :background))))) - -#+end_src - -** Cape -Add non-lsp completions to the capf. -#+begin_src emacs-lisp - (use-package cape - :ensure t - :config - (keymap-global-set "C-c c" 'cape-prefix-map) - (setq dabbrev-case-fold-search t) - ;;(add-hook 'completion-at-point-functions #'cape-dabbrev) ;; TODO: Check if this is slowing down comments? - (add-hook 'completion-at-point-functions #'cape-file) - (add-hook 'completion-at-point-functions #'cape-elisp-block) - (add-hook 'completion-at-point-functions #'yasnippet-capf)) -#+end_src - -** Utilities -*** Flycheck -Syntax checking for Emacs. -#+begin_src emacs-lisp - (use-package flycheck - :defer t - :init (global-flycheck-mode 1) - :config - (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc)) - (setq-default flycheck-cppcheck-args "--enable=all") - (flycheck-add-next-checker 'c/c++-gcc 'c/c++-cppcheck 'append) - (setq flycheck-indication-mode nil) - (set-face-attribute 'flycheck-warning nil :underline nil)) ;; Disable Warning Underline (NOT WORKING) -#+end_src - -* User Interface -** Add Nerd Icons -Use Icons from Nerd Font to add a little modern spice to Emacs. -#+begin_src emacs-lisp - (use-package nerd-icons - :if (display-graphic-p)) - - (use-package nerd-icons-dired - :hook - (dired-mode . nerd-icons-dired-mode)) - - (use-package nerd-icons-ivy-rich - :init (nerd-icons-ivy-rich-mode 1)) - - (setq welcome-dashboard-use-nerd-icons t) -#+end_src - -** Fonts -*** Set Font -Set font for both Monospace and Proportional text. -#+begin_src emacs-lisp - (defvar fontconf - '((font . "Aporetic Sans Mono") - (size . 13))) - - (set-face-attribute 'variable-pitch nil - :font (cdr (assoc 'font fontconf)) - :height (* (cdr (assoc 'size fontconf)) 10) - :weight 'regular) - - (set-face-attribute 'fixed-pitch nil - :font (cdr (assoc 'font fontconf)) - :height (* (cdr (assoc 'size fontconf)) 10) - :weight 'regular) - - (set-face-attribute 'default nil - :font (cdr (assoc 'font fontconf)) - :height (* (cdr (assoc 'size fontconf)) 10) - :weight 'regular) - - - (add-to-list 'default-frame-alist - `(font . ,(concat (cdr (assoc 'font fontconf)) "-" (number-to-string (cdr (assoc 'size fontconf)))))) - - (set-face-attribute 'font-lock-comment-face nil - :slant 'italic) - - (set-face-attribute 'font-lock-keyword-face nil - :slant 'italic) - - ;;(set-frame-font "-misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1" t t) -#+end_src -*** Ligatures -Make ligature symbols out of common function symbols. -#+begin_src emacs-lisp - (dolist (char/ligature-re - `((?- . ,(rx (or (or "-->" "-<<" "->>" "-|" "-~" "-<" "->") (+ "-")))) - (?/ . ,(rx (or (or "/==" "/=" "/>" "/**" "/*") (+ "/")))) - (?* . ,(rx (or (or "*>" "*/") (+ "*")))) - (?< . ,(rx (or (or "<<=" "<<-" "<|||" "<==>" "<!--" "<=>" "<||" "<|>" "<-<" - "<==" "<=<" "<-|" "<~>" "<=|" "<~~" "<$>" "<+>" "</>" - "<*>" "<->" "<=" "<|" "<:" "<>" "<$" "<-" "<~" "<+" - "</" "<*") - (+ "<")))) - (?: . ,(rx (or (or ":?>" "::=" ":>" ":<" ":?" ":=") (+ ":")))) - (?= . ,(rx (or (or "=>>" "==>" "=/=" "=!=" "=>" "=:=") (+ "=")))) - (?! . ,(rx (or (or "!==" "!=") (+ "!")))) - (?> . ,(rx (or (or ">>-" ">>=" ">=>" ">]" ">:" ">-" ">=") (+ ">")))) - (?& . ,(rx (+ "&"))) - (?| . ,(rx (or (or "|->" "|||>" "||>" "|=>" "||-" "||=" "|-" "|>" - "|]" "|}" "|=") - (+ "|")))) - (?. . ,(rx (or (or ".?" ".=" ".-" "..<") (+ ".")))) - (?+ . ,(rx (or "+>" (+ "+")))) - (?\[ . ,(rx (or "[<" "[|"))) - (?\{ . ,(rx "{|")) - (?\? . ,(rx (or (or "?." "?=" "?:") (+ "?")))) - (?# . ,(rx (or (or "#_(" "#[" "#{" "#=" "#!" "#:" "#_" "#?" "#(") - (+ "#")))) - (?\; . ,(rx (+ ";"))) - (?_ . ,(rx (or "_|_" "__"))) - (?~ . ,(rx (or "~~>" "~~" "~>" "~-" "~@"))) - (?$ . ,(rx "$>")) - (?^ . ,(rx "^=")) - (?\] . ,(rx "]#")))) - (let ((char (car char/ligature-re)) - (ligature-re (cdr char/ligature-re))) - (set-char-table-range composition-function-table char - `([,ligature-re 0 font-shape-gstring])))) -#+end_src -*** Font Zooming -Bind both scroling and +/- to zooming. -#+begin_src emacs-lisp - (global-set-key (kbd "C-=") 'text-scale-increase) - (global-set-key (kbd "C--") 'text-scale-decrease) - (global-set-key (kbd "<C-wheel-up>") 'text-scale-increase) - (global-set-key (kbd "<C-wheel-down>") 'text-scale-decrease) -#+end_src - -** Theme -Set the theme to a nice dark one. -#+begin_src emacs-lisp - (use-package ef-themes - :config - (set-window-margins nil 0)) - - (add-hook 'emacs-startup-hook - (lambda () - (load-theme 'ef-bio t))) -#+end_src - -** Niceties -*** Disable Extra GUI Features -Disable GUI features to simplify frames. -#+begin_src emacs-lisp - (menu-bar-mode -1) - (tool-bar-mode -1) - (scroll-bar-mode -1) - (setq inhibit-startup-screen t) -#+end_src -*** No Scroll Jump -Scroll line by line instead of jumping multiple. -#+begin_src emacs-lisp - (setq scroll-conservatively 100) - (setq scroll-step 1) -#+end_src -*** Small Fringes -Reduce fringe size to 1px. -#+begin_src emacs-lisp - (set-fringe-mode 1) -#+end_src -*** Disable Background -In no-window mode, disable the background to fit in with terminal theme. -#+begin_src emacs-lisp - (defun on-after-init () - (unless (display-graphic-p (selected-frame)) - (set-face-background 'default "unspecified-bg" (selected-frame)))) - - (add-hook 'window-setup-hook 'on-after-init) -#+end_src - -** Modern Looking Emacs -*** Org Modern -Modern iconography and styling for Org-Mode. -#+begin_src emacs-lisp - (use-package org-modern) - - (modify-all-frames-parameters - '((right-divider-width . 40) - (internal-border-width . 40))) - (dolist (face '(window-divider - window-divider-first-pixel - window-divider-last-pixel)) - (face-spec-reset-face face) - (set-face-foreground face (face-attribute 'default :background))) - (set-face-background 'fringe (face-attribute 'default :background)) - - - (setq org-pretty-entities t - org-auto-align-tags nil - org-tags-column 0 - org-catch-invisible-edits 'show-and-error - org-special-ctrl-a/e t - org-insert-heading-respect-content t) - - (add-hook 'org-mode-hook #'org-modern-mode) - (add-hook 'org-agenda-finalize-hook #'org-modern-agenda) -#+end_src -*** Spacious Padding -Adds padding around various elements. -#+begin_src emacs-lisp - (use-package spacious-padding) - - ;; These are the default values, but I keep them here for visibility. - (setq spacious-padding-widths - '( :internal-border-width 15 - :header-line-width 4 - :mode-line-width 6 - :tab-width 4 - :right-divider-width 30 - :scroll-bar-width 8 - :fringe-width 8)) - - ;; Read the doc string of `spacious-padding-subtle-mode-line' as it - ;; is very flexible and provides several examples. - (setq spacious-padding-subtle-mode-line - `( :mode-line-active 'default - :mode-line-inactive vertical-border)) - - (spacious-padding-mode 1) -#+end_src -*** Zen Mode -Center the edtior with Olivetti for distraction-free editing. -#+begin_src emacs-lisp - (use-package olivetti - :config - (keymap-global-set "C-c z" 'olivetti-mode)) -#+end_src diff --git a/.ghci b/.ghci deleted file mode 100644 index 31f559e..0000000 --- a/.ghci +++ /dev/null @@ -1 +0,0 @@ -:set prompt "λ " diff --git a/.gitconfig b/.gitconfig deleted file mode 100644 index 8a59d3e..0000000 --- a/.gitconfig +++ /dev/null @@ -1,3 +0,0 @@ -[user] - name = venomade - email = venomade@venomade.com diff --git a/.mg b/.mg deleted file mode 100644 index 480ec1b..0000000 --- a/.mg +++ /dev/null @@ -1 +0,0 @@ -backup-to-home-directory diff --git a/.stow-local-ignore b/.stow-local-ignore deleted file mode 100644 index 35cdaf3..0000000 --- a/.stow-local-ignore +++ /dev/null @@ -1,2 +0,0 @@ -.git -README.md diff --git a/.xsessionrc b/.xsessionrc deleted file mode 100644 index c923b63..0000000 --- a/.xsessionrc +++ /dev/null @@ -1,2 +0,0 @@ -export QT_QPA_PLATFORMTHEME=gtk2 -export QT_STYLE_OVERRIDE=gtk2 diff --git a/.zshrc b/.zshrc deleted file mode 100644 index 6af87b4..0000000 --- a/.zshrc +++ /dev/null @@ -1,86 +0,0 @@ -# Venomade's zshrc - -# source global variables and aliases -[ -f "$HOME/.config/shell/alias" ] && source "$HOME/.config/shell/alias" -[ -f "$HOME/.config/shell/vars" ] && source "$HOME/.config/shell/vars" - -# load modules -zmodload zsh/complist -autoload -U compinit && compinit -autoload -U colors && colors - -# completion -zstyle ':completion:*' menu select -zstyle ':completion:*' special-dirs true -zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} ma=0\;33 - -# options -setopt append_history inc_append_history share_history -setopt auto_menu menu_complete -setopt auto_param_slash -setopt no_case_glob no_case_match -setopt globdots -setopt extended_glob - -# history -HISTCONTROL=ignoreboth - - -# prompt -USER_COLOR="%F{magenta}" -VENV_COLOR="%F{yellow}" -DIR_COLOR="%F{green}" -GIT_COLOR="%F{blue}" -GIT_DIRTY_COLOR="%F{red}" -PROMPT_SYMBOL_COLOR="%F{yellow}" -RESET_COLOR="%f" - -shorten_path() { - local path="${PWD/#$HOME/~}" - local parts=("${(@s:/:)path}") - - if (( ${#parts} > 3 )); then - echo "${parts[1]}/.../${parts[-2]}/${parts[-1]}" - else - echo "$path" - fi -} - -git_branch() { - local branch - branch=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null) - [[ -n "$branch" ]] && echo "$branch" -} - -git_dirty() { - [[ -n "$(git status --porcelain 2>/dev/null)" ]] && echo "✗" || echo "✓" -} - -set_prompt() { - local user="${USER_COLOR}%n${RESET_COLOR}" - local venv="" - [[ -n "$VIRTUAL_ENV" ]] && venv="${VENV_COLOR}($(basename $VIRTUAL_ENV))${RESET_COLOR} " - - local path="${DIR_COLOR}$(shorten_path)${RESET_COLOR}" - local git_info="" - local branch="$(git_branch)" - - if [[ -n "$branch" ]]; then - git_info=" %F{white}on%f ${GIT_COLOR}${branch}${RESET_COLOR}${GIT_DIRTY_COLOR}$(git_dirty)${RESET_COLOR}" - fi - - PROMPT="${user} %F{white}in%f ${venv}${path}${git_info} -${PROMPT_SYMBOL_COLOR}λ${RESET_COLOR} " -} - -autoload -Uz add-zsh-hook -add-zsh-hook precmd set_prompt - -# plugins -source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh - -# GHCUP for Haskell -[ -f "/home/venomade/.ghcup/env" ] && . "/home/venomade/.ghcup/env" # ghcup-env - -# OPAM for OCaml -[[ ! -r '/home/venomade/.opam/opam-init/init.zsh' ]] || source '/home/venomade/.opam/opam-init/init.zsh' > /dev/null 2> /dev/null diff --git a/README.md b/README.md index 7a22cbf..5fc3be5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # Venomade's Dotfiles -These are my dotfiles managed with [GNU Stow](https://www.gnu.org/software/stow/). +These are my dotfiles managed with [Home Manager](https://nixos.wiki/wiki/Home_Manager). diff --git a/config/bat/config b/config/bat/config new file mode 100644 index 0000000..2d65ccf --- /dev/null +++ b/config/bat/config @@ -0,0 +1 @@ +--theme="modus_vivendi" diff --git a/config/bat/themes/modus_vivendi.tmTheme b/config/bat/themes/modus_vivendi.tmTheme new file mode 100644 index 0000000..15d2429 --- /dev/null +++ b/config/bat/themes/modus_vivendi.tmTheme @@ -0,0 +1,439 @@ +<!-- Modus Themes for Bat --> +<!-- Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/bat.lua --> + +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>name</key> + <string>modus_vivendi</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#989898</string> + <key>foreground</key> + <string>#ffffff</string> + <key>invisibles</key> + <string>#989898</string> + <key>lineHighlight</key> + <string>#2f3849</string> + <key>selection</key> + <string>#7030af</string> + <key>findHighlight</key> + <string>#7a6100</string> + <key>selectionBorder</key> + <string>#646464</string> + <key>gutterForeground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Ruby's @variable</string> + <key>scope</key> + <string>variable.other.readwrite.instance</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String interpolation</string> + <key>scope</key> + <string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#4f1119</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00381f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#363300</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#2fafff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>message.error</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#ff7f9f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Structure</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00c06f</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>09CE9B40-0137-442C-8512-7CEAFC78C153</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>Modus Vivendi</string> + </dict> +</plist> diff --git a/config/emacs/.gitignore b/config/emacs/.gitignore new file mode 100644 index 0000000..1980dcd --- /dev/null +++ b/config/emacs/.gitignore @@ -0,0 +1,62 @@ +/url/cache +/.emacs.desktop +/auto-save-list +/network-security.data +/.session +/session.* +/custom.el +*.elc +CVS +.svn +*~ +.cvsignore +.*.lock +/tramp +/TODO +/.org-id-locations +cookies +/newsticker +\#* +/tree-sitter +/elpa +/elpa-* +site-lisp/package/ +/swank +/.mc-lists.el +/var +/.sqli_history +/frame-restore-parameters +/.achievements +/.bookmarks.el +/history +/helm-adaptive-history +/thumbs/ +/emms/ +/.smex-items +/image-dired/ +/eshell +/.cask/ +/.sx/ +/org-clock-save.el +/ditaa*.jar +/ido.last +/recentf +/viper +/projectile-bookmarks.eld +/anaconda-mode/ +/.historian +/.uptimes.el +/rake.cache +/plantuml.jar +/magithub +.cache/ +/forge-database.sqlite +/transient +/.lsp-session-v1 +/smex-items +/eln-cache/ +/projects +/forge-*.sqlite +/projectile.cache +config.el +places diff --git a/config/emacs/config.org b/config/emacs/config.org new file mode 100644 index 0000000..d0a2ce3 --- /dev/null +++ b/config/emacs/config.org @@ -0,0 +1,950 @@ +#+TITLE: My Emacs Config +#+AUTHOR: Venomade + +This is my Emacs config that is theoretically going to be simpler than my previous configs. I have been trying out neovim more recently and I liked how simple it can be, giving it very quick startup times. I've tried the Emacs Daemon in the past but have never really jived with it so I would rather just have a fast launch time instead. The target is that `emacs-init-time` should be <2 seconds. + +* Non-Package Configuration +This section is the main non-package configuration of my Emacs config, everything here should be run before everything else in order to set up the basic environment for using packages. + +** Internal +#+begin_src emacs-lisp + ;; Setup Native Compilation if available + (if (native-comp-available-p) + (setq package-native-compile t)) + + ;; Disable the command key on MacOS + (setq mac-command-modifier nil) + + ;; Use a custom.el file instead of init.el to store uncommitable changes + (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) + (when (file-exists-p custom-file) + (load custom-file)) + + ;; Set Backups, Autosaves and Lockfiles to all be stored in the .emacs.d directory + (let* ((backup-dir (expand-file-name "backups/" user-emacs-directory)) + (autosave-dir (expand-file-name "autosaves/" user-emacs-directory)) + (lock-dir (expand-file-name "lock/" user-emacs-directory))) + (make-directory backup-dir t) + (make-directory autosave-dir t) + (make-directory lock-dir t) + + (setq backup-directory-alist `((".*" . ,(directory-file-name backup-dir))) + auto-save-file-name-transforms `((".*" ,(directory-file-name autosave-dir) t)) + lock-file-name-transforms `((".*" ,(directory-file-name lock-dir) t)))) + + ;; Don't show Warning and Compile-Log buffers in a window + (add-to-list 'display-buffer-alist + '("\\`\\*\\(Warnings\\|Compile-Log\\)\\*\\'" + (display-buffer-no-window) + (allow-no-window . t))) + + ;; Use 'trash' to trash system files instead of permanently rm-ing + (setq trash-directory "~/.Trash") + (defun system-move-file-to-trash (file) + "Use \"trash\" to move FILE to the system trash." + (cl-assert (executable-find "trash") nil "'trash' executable not found.") + (call-process "trash" nil 0 nil "-F" file)) +#+end_src + +** User Interface +#+begin_src emacs-lisp + ;; Allow any size of the Emacs GUI + (setq frame-resize-pixelwise t + ;; Configure line numbers display + display-line-numbers-width-start t + display-line-numbers-width 4 + display-line-numbers-grow-only t + ;; Disable bell + ring-bell-function 'ignore + ;; Confirm on C-x C-c + ns-confirm-quit t + ;; Don't open files opened from an external source in a new frame + ns-pop-up-frames nil + ;; Add a scroll margin and improve scrolling + scroll-margin 10 ; Doesn't work with smooth-scrolling + scroll-conservatively 100 + scroll-step 1) + + ;; Default to no wrapping on buffers + (setq-default truncate-lines t) + + ;; Replace the $ signs for truncation with spaces + (set-display-table-slot standard-display-table 'truncation 32) + + ;; Disable extra GUI interfaces + (tool-bar-mode -1) + (scroll-bar-mode -1) + (menu-bar-mode -1) + + ;; Display line numbers from startup + (add-hook 'emacs-startup-hook #'global-display-line-numbers-mode) + + ;; Focus new frames on creation + (add-hook 'after-make-frame-functions + (lambda (f) + (select-frame-set-input-focus f))) + + ;; Custom quit messages from DOOM and DOOM Emacs + (setq quit-messages + `(; from DOOM 1 + ,(format "I wouldn't leave if I were you. %s is much worse." + (if (featurep 'windows-nt) "DOS" "UNIX")) + "Ya know, next time you come in here I'm gonna toast ya." + "Go ahead and leave. See if I care." + "Are you sure you want to quit this great editor?" + ; from DOOM Emacs + "(setq nothing t everything 'permitted)" + "Emacs will remember that." + "Emacs, Emacs never changes." + "Hey! Hey, M-x listen!" + "Wake up, Mr. Stallman. Wake up and smell the ashes." + "You are *not* prepared!" + "Please don't go. The drones need you. They look up to you.")) + + (defun random-quit-message () + "Return a randomly chosen quit message from `quit-messages'." + (nth (random (length quit-messages)) quit-messages)) + + (defun message-confirm-kill-emacs (&rest _) + "Prompt the user with a random message before quitting. + Returns t to allow kill if the user answers yes; nil otherwise." + (let* ((msg (random-quit-message)) + (prompt (format "%s Really quit Emacs? " msg))) + (yes-or-no-p (propertize prompt 'face '(italic default))))) + + (setq confirm-kill-emacs #'message-confirm-kill-emacs) + + ;; Enable which-key on startup + (add-hook 'emacs-startup-hook #'which-key-mode) + + ;; Disable line numbers in fundamental mode + (let ((no-numbers-modes '(fundamental-mode-hook))) + (dolist (hk no-numbers-modes) + (add-hook hk (lambda () (display-line-numbers-mode 0))))) + + ;; Colorise the compile-mode buffer + (require 'ansi-color) + (defun colorize-compilation-buffer () + (ansi-color-apply-on-region compilation-filter-start (point))) + (add-hook 'compilation-filter-hook 'colorize-compilation-buffer) + + ;; Shorten symbols into their single character equivalent + (global-prettify-symbols-mode 1) + + ;; Font Setup + (let* ((fontconf '((fixed-font . "AporeticSansMonoNerdFont") + (variable-font . "Google Sans") + (size . 16))) + (fixed-font (cdr (assoc 'fixed-font fontconf))) + (variable-font (cdr (assoc 'variable-font fontconf))) + (pt-size (cdr (assoc 'size fontconf))) + (height (* pt-size 10)) + (frame-font (concat fixed-font "-" (number-to-string pt-size)))) + ; Fixed-width faces + (dolist (face '(default fixed-pitch)) + (set-face-attribute face nil + :font fixed-font + :height height + :weight 'regular)) + ; Variable-pitch face + (set-face-attribute 'variable-pitch nil + :font variable-font + :height height + :weight 'regular) + + ; Syntax styling + (set-face-attribute 'font-lock-comment-face nil :slant 'italic) + (set-face-attribute 'font-lock-keyword-face nil :slant 'italic) + + ; Frame font + (add-to-list 'default-frame-alist `(font . ,frame-font))) + + ;; Spacious user interface elements + (use-package spacious-padding + :ensure t + :hook (after-init . spacious-padding-mode) + :config + (setq spacious-padding-widths + '( :internal-border-width 8 + :header-line-width 4 + :mode-line-width 6 + :custom-button-width 3 + :tab-width 4 + :right-divider-width 30 + :scroll-bar-width 8 + :fringe-width 0)) + (setq spacious-padding-subtle-frame-lines + '( :mode-line-active spacious-padding-line-active + :mode-line-inactive spacious-padding-line-inactive + :header-line-active spacious-padding-line-active + :header-line-inactive spacious-padding-line-inactive))) + + ;; Enable line wrapping for text documents + (add-hook 'text-mode-hook 'visual-line-mode) + ;; Disable line numbers in text mode + (add-hook 'text-mode-hook (lambda () (display-line-numbers-mode -1))) +#+end_src + +** Functionality +#+begin_src emacs-lisp + ;; Indent with spaces + (setq-default indent-tabs-mode nil + ;; Use 2 spaces + tab-width 2 + tab-stop-list (number-sequence 2 100 2) + c-basic-offset 2) + + ;; Regex find and replace shortcut + (keymap-global-set "C-c r" 'replace-regexp) + + ;; Functions to match vi's 'o' and 'O' + (cl-labels + ((vi-open-line-above () + "Open line above the current line." + (interactive) + (unless (bolp) (beginning-of-line)) + (newline) + (forward-line -1) + (indent-according-to-mode)) + (vi-open-line-below () + "Open line below the current line." + (interactive) + (unless (eolp) (end-of-line)) + (newline-and-indent))) + (define-key (current-global-map) (kbd "C-c o") #'vi-open-line-above) + (define-key (current-global-map) (kbd "C-c O") #'vi-open-line-below) + (which-key-add-key-based-replacements "C-c o" "open-line-above") + (which-key-add-key-based-replacements "C-c O" "open-line-below")) + + ;; Move to the beginning of the line with respect to context + (progn + (defun smart-beginning-of-line () + "Move the cursor to the beginning of text on the line." + (interactive) + (let ((initial-point (point))) + (back-to-indentation) + (when (eq initial-point (point)) + (move-beginning-of-line 1)))) + (defun setup-prog-mode-c-a () + (local-set-key (kbd "C-a") 'smart-beginning-of-line)) + (add-hook 'prog-mode-hook 'setup-prog-mode-c-a) + (add-hook 'conf-mode-hook 'setup-prog-mode-c-a)) + + ;; Clean up trailing whitespace + (progn + (defun prog-nuke-trailing-whitespace () + "Removes trailing whitespace at the end of the line." + (when (or (derived-mode-p 'prog-mode) (derived-mode-p 'conf-mode)) + (delete-trailing-whitespace))) + (add-hook 'before-save-hook 'prog-nuke-trailing-whitespace)) + + ;; Enable overwriting selection with the built-in delsel package + (use-package delsel + :hook (after-init . delete-selection-mode)) + + ;; Use y/n and other similar shortenings for dialogue response + (setopt use-short-answers t) + + ;; Configure the built-in file-manager dired + (use-package dired + :commands (dired) + :hook + ((dired-mode . dired-hide-details-mode) + (dired-mode . hl-line-mode)) + :config + (setq dired-recursive-copies 'always + dired-recursive-deletes 'always + ; delete-by-moving-to-trash t ; FIXME: Currently Broken, need to find why + dired-dwim-target t + insert-directory-program "~/.nix-profile/bin/ls" + dired-listing-switches "-lah")) + + ;; Return to last position after leaving a file + (add-hook 'emacs-startup-hook #'save-place-mode) + + ;; Setup a pretty and useful eshell prompt + (progn + (dolist (spec + '((eshell-prompt-user-face font-lock-keyword-face "Face for the username in the eshell prompt.") + (eshell-prompt-venv-face font-lock-string-face "Face for the virtualenv name in the eshell prompt.") + (eshell-prompt-dir-face dired-directory "Face for the directory path in the eshell prompt.") + (eshell-prompt-git-face magit-tag "Face for the git branch in the eshell prompt.") + (eshell-prompt-git-dirty-face eshell-prompt-git-face "Face for the git dirty status in the eshell prompt.") + (eshell-prompt-symbol-face font-lock-builtin-face "Face for the prompt symbol in the eshell prompt."))) + (cl-destructuring-bind (name inherit doc) spec + (defface name + `((t (:inherit ,inherit))) + doc + :group 'eshell-prompt))) + + (defun eshell-abbreviate-dir (dir) + "Abbreviate directory to show only the first and the last two components." + (let* ((abbrev (abbreviate-file-name dir)) + (components (split-string abbrev "/" t)) + (num-components (length components))) + (if (>= num-components 4) + (concat (car components) "/.../" + (mapconcat #'identity (last components 2) "/")) + abbrev))) + + (defun eshell-prompt-git-branch () + "Return the current git branch or short commit hash, if available." + (when (and (executable-find "git") + (locate-dominating-file default-directory ".git")) + (with-temp-buffer + (let ((ret (call-process "git" nil t nil "symbolic-ref" "--short" "HEAD"))) + (if (zerop ret) + (string-trim (buffer-string)) + (when (zerop (call-process "git" nil t nil "rev-parse" "--short" "HEAD")) + (string-trim (buffer-string)))))))) + + (defun eshell-prompt-git-dirty () + "Return a dirty flag (✗ if dirty, ✓ if clean) for the git repository." + (when (eshell-prompt-git-branch) + (with-temp-buffer + (call-process "git" nil t nil "status" "--porcelain") + (if (> (buffer-size) 0) "✗" "✓")))) + + (defun eshell-prompt () + "Custom eshell prompt." + (let* ((user (propertize (user-login-name) 'face 'eshell-prompt-user-face)) + (venv (when-let ((venv (getenv "VIRTUAL_ENV"))) + (concat (propertize "(" 'face 'eshell-prompt-venv-face) + (propertize (file-name-nondirectory venv) 'face 'eshell-prompt-venv-face) + (propertize ")" 'face 'eshell-prompt-venv-face)))) + (path (propertize (eshell-abbreviate-dir (eshell/pwd)) 'face 'eshell-prompt-dir-face)) + (git-branch (eshell-prompt-git-branch)) + (git-info (when git-branch + (concat " " (propertize "on" 'face 'font-lock-number-face) " " + (propertize git-branch 'face 'eshell-prompt-git-face) + (propertize (eshell-prompt-git-dirty) 'face 'eshell-prompt-git-dirty-face)))) + (prompt (concat user " " (propertize "in" 'face 'font-lock-number-face) " " + (if venv (concat venv " ") "") + path git-info "\n" + (propertize "λ" 'face 'eshell-prompt-symbol-face) " "))) + prompt)) + + (setq eshell-prompt-function 'eshell-prompt + eshell-prompt-regexp "^[^λ\n]*λ ")) + + ;; Bind recent files to C-x C-r + (add-hook 'emacs-startup-hook #'recentf-mode) + (keymap-global-set "C-x C-r" 'recentf-open) + (which-key-add-key-based-replacements "C-x C-r" "Recent Files") + (put 'compile-command 'safe-local-variable #'stringp) + + ;; Persistently save minibuffer history between sessions + (use-package savehist + :hook (after-init . savehist-mode)) + + ;; Local info files directory + (add-to-list 'Info-directory-list "/Users/venomade/Documents/Info/") + + ;; Scroll on compilation mode output + (setq compilation-scroll-output t) + + ;; Add keybinds for compiling + (keymap-global-set "C-c m c" 'compile) + (keymap-global-set "C-c m r" 'recompile) + (which-key-add-key-based-replacements "C-c m" "make") +#+end_src + +* Basic Package Configuration +This is the configuration for the necessary packages required for my base Emacs experience for all cases. + +** Setup +#+begin_src emacs-lisp + ;; Setup Melpa + (require 'package) + (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) + (package-initialize) +#+end_src + +** Internal Packages +#+begin_src emacs-lisp + ;; Improved Garbage Collection + (use-package gcmh + :ensure t + :hook (after-init . gcmh-mode) + :config + (setq gcmh-high-cons-threshold (* 128 1024 1024) ; 128MB + gcmh-idle-delay 10 + gcmh-verbose nil)) + + ;; Find executables that are usable from the specified shell + (use-package exec-path-from-shell + :ensure t + :config + (setq exec-path-from-shell-shell-name "/bin/zsh" + exec-path-from-shell-arguments '("-l" "-i" "-c")) + (when (memq window-system '(mac ns x)) + (exec-path-from-shell-initialize))) +#+end_src + +** User Interface Packages +#+begin_src emacs-lisp + ;; Catppuccin Color Theme + (use-package catppuccin-theme + :ensure t + :config + (setq catppuccin-flavor 'mocha) + (catppuccin-set-color 'base "#000000") + (catppuccin-set-color 'mantle "#181818") + (catppuccin-set-color 'crust "#111111") + (catppuccin-set-color 'overlay2 "#9B9B9B") + (catppuccin-set-color 'overlay1 "#858585") + (catppuccin-set-color 'overlay0 "#707070") + (catppuccin-set-color 'surface2 "#5C5C5C") + (catppuccin-set-color 'surface1 "#474747") + (catppuccin-set-color 'surface0 "#333333") + (catppuccin-reload) + (load-theme 'catppuccin t)) + + ;; Automatically match the titlebar to the theme + (use-package ns-auto-titlebar + :ensure t + :config + (when (eq system-type 'darwin) (ns-auto-titlebar-mode))) + + ;; More readable modeline from DOOM Emacs + (use-package doom-modeline + :ensure t + :hook (after-init . doom-modeline-mode) + :config + (setq doom-modeline-height 0 ; minimum + doom-modeline-bar-width 0 ; disabled + doom-modeline-project-detection 'project ; use project.el + doom-modeline-buffer-state-icon nil + doom-modeline-highlight-modified-buffer-name nil + doom-modeline-percent-position nil + line-number-mode nil + doom-modeline-buffer-encoding nil + doom-modeline-time-live-icon nil + doom-modeline-time-icon nil + display-time-default-load-average nil + display-time-format "%a %d %b | %R" + helm-ag-show-status-function nil)) ;HACK: Doom Modeline asks for this but I don't use helm + + ;; Icons for use with a nerd-font + (use-package nerd-icons + :ensure t + :if (display-graphic-p)) + + ;; Nerd Icons in the file manager + (use-package nerd-icons-dired + :ensure t + :after nerd-icons + :hook + (dired-mode . nerd-icons-dired-mode)) + + ;; Nerd Icons in the buffer menu + (use-package nerd-icons-ibuffer + :ensure t + :after nerd-icons + :hook (ibuffer-mode . nerd-icons-ibuffer-mode)) + + ;; Color brackets for visual grepping + (use-package rainbow-delimiters + :ensure t + :hook (prog-mode . rainbow-delimiters-mode)) + + ;; Highlight todo comments + (use-package hl-todo + :ensure t + :hook ((org-mode . hl-todo-mode) + (prog-mode . hl-todo-mode)) + :config + (add-to-list 'hl-todo-keyword-faces '("ERROR" . "#8c5353"))) + + ;; Highlight large changes + (use-package goggles + :ensure t + :hook ((prog-mode text-mode) . goggles-mode) + :config + (setq-default goggles-pulse t)) + + ;; Nicer view to manager project.el projects + (use-package disproject + :ensure t + :after project + :bind (:map ctl-x-map + ("p" . disproject-dispatch))) + + ;; Sort buffers by project in the buffer manager + (use-package ibuffer-project + :ensure t + :after project + :config + (add-hook + 'ibuffer-hook + (lambda () + (setq ibuffer-filter-groups (ibuffer-project-generate-filter-groups)) + (unless (eq ibuffer-sorting-mode 'project-file-relative) + (ibuffer-do-sort-by-project-file-relative)))) + (keymap-global-set "C-x C-b" 'ibuffer)) +#+end_src + +** Functionality Packages +#+begin_src emacs-lisp + ;; Move text up and down with a single keybind + (use-package move-text + :ensure t + :config + (keymap-global-set "M-p" 'move-text-up) + (keymap-global-set "M-n" 'move-text-down) + (defun indent-region-advice (&rest ignored) + (let ((deactivate deactivate-mark)) + (if (region-active-p) + (indent-region (region-beginning) (region-end)) + (indent-region (line-beginning-position) (line-end-position))) + (setq deactivate-mark deactivate))) + + (advice-add 'move-text-up :after 'indent-region-advice) + (advice-add 'move-text-down :after 'indent-region-advice)) + + ;; Automatically insert matching delimiters and jump between them + (use-package smartparens + :ensure t + :hook (prog-mode text-mode markdown-mode) + :config + (require 'smartparens-config) + (sp-use-paredit-bindings)) + + ;; Undo across history and across revisions + (use-package undo-tree + :ensure t + :init + (global-undo-tree-mode 1) + :config + (setq undo-tree-auto-save-history t + undo-tree-history-directory-alist `(("." . ,(expand-file-name ".cache" user-emacs-directory))))) + + ;; Insert accents with a menu + (use-package accent + :ensure t + :bind* (("C-'" . accent-menu)) + :config + (setq accent-diacritics '((a (á ã â à)) ; só para Português + (e (é ê)) + (i (í)) + (o (ó õ ô)) + (u (ú)) + (c (ç)) + (A (Á Ã Â À)) + (E (É Ê)) + (I (Í)) + (O (Ó Õ Ô)) + (U (Ú))))) + + ;; Allow recursive expansion in the dired file-manager + (use-package dired-subtree + :ensure t + :after dired + :bind + (:map dired-mode-map + ("TAB" . (lambda () (interactive) (dired-subtree-toggle) (revert-buffer))) + ("<backtab>" . dired-subtree-remove)) + :config + (setq dired-subtree-use-backgrounds nil)) +#+end_src + +* Advanced Package Configuration +This configuration is for specific filetypes/languages and more advanced packages. It is sorted by module for easy enabling and disabling, and ordered by relevance to most modes. + +** Corfu Completion +#+begin_src emacs-lisp + ;; Make completion matching much more powerful + (use-package orderless + :ensure t + :config + (setq completion-styles '(orderless basic) + completion-category-defaults nil + completion-category-overrides '((file (styles . (partial-completion))) + (eglot (styles . (orderless)))))) + + ;; Snippet expansion allows for powerful multi-stage completion + (use-package yasnippet + :ensure t + :hook (prog-mode . yas-minor-mode) + :bind + (("C-c y n" . yas-new-snippet) + ("C-c y v" . yas-visit-snippet-file) + ("C-c y i" . yas-insert-snippet)) + :config + (yas-reload-all)) + + ;; Add some base snippets + (use-package yasnippet-snippets + :after yasnippet + :ensure t) + + ;; Combiner for multiple completion backends + (use-package cape + :ensure t + :config + ;; TODO find out what the wrap buster actually does (caching or whatever) + (advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)) + + (use-package yasnippet-capf + :ensure t + :after cape) + + (defun eglot-capf-with-yasnippet () + (setq-local completion-at-point-functions + (list + (cape-capf-super + #'eglot-completion-at-point + #'yasnippet-capf)))) + (with-eval-after-load 'eglot + (add-hook 'eglot-managed-mode-hook #'eglot-capf-with-yasnippet)) + + ;; The fast completion menu + (use-package corfu + :ensure t + :hook ((prog-mode . corfu-mode) + (eshell-mode . corfu-mode)) + :bind (:map corfu-map + ("TAB" . corfu-insert) + ("<tab>" . corfu-insert) + ("RET" . nil) + ("C-n" . corfu-next) + ("C-p" . corfu-previous) + ("C-g" . corfu-quit)) + :config + (setq corfu-cycle t + corfu-auto t + corfu-auto-delay 0.2 + corfu-preselect 'first + corfu-quit-at-boundary t + corfu-quit-no-match t + corfu-scroll-margin 5 + corfu-tab-always-indent 'complete + corfu-preview-current nil + corfu-min-width 20 + corfu-popupinfo-delay '(1.25 . 0.5) + corfu-on-exact-match nil) + (corfu-popupinfo-mode 1) + (with-eval-after-load 'savehist + (corfu-history-mode 1) + (add-to-list 'savehist-additional-variables 'corfu-history))) + + (use-package nerd-icons-corfu + :ensure t + :after nerd-icons corfu + :config + (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) +#+end_src + +** Miscellaneous Completion +#+begin_src emacs-lisp + ;; Powerful minibuffer completion + (use-package vertico + :ensure t + :hook (after-init . vertico-mode) + :bind (:map vertico-map + ("DEL" . vertico-directory-delete-char))) + + ;; Powerful completion replacements for various other emacs functions + (use-package consult + :ensure t + :bind (("M-g g" . consult-goto-line) + ("M-g M-g" . consult-goto-line) + ("C-c s" . consult-line)) + + :config + (which-key-add-key-based-replacements "C-c s" "search-lines")) + + ;; Powerful completion replacements for find-style emacs functions + (use-package affe + :ensure t + :after consult + :bind (("C-c f f" . affe-find) + ("C-c f g" . affe-grep)) + :init + (which-key-add-key-based-replacements "C-c f" "find-file") + (which-key-add-key-based-replacements "C-c f f" "find-fuzzy") + (which-key-add-key-based-replacements "C-c f g" "find-greppy")) + + ;; Add descriptive annotations to minibuffer completions + (use-package marginalia + :ensure t + :after vertico + :config (marginalia-mode 1)) + + ;; Add nerd-font icons to completions in minibuffer + (use-package nerd-icons-completion + :ensure t + :after vertico marginalia + :hook + (marginalia-mode . nerd-icons-completion-marginalia-setup) + (after-init . nerd-icons-completion-mode)) +#+end_src + +** Eglot +#+begin_src emacs-lisp + (use-package eglot + :ensure t + :after cape + :config + ;; Disable progress indicator in the modeline + (setq eglot-report-progress nil + eglot-extend-to-xref t)) + + ;; Use a rust binary to do lsp communication and then send results to emacs + ; Booster at https://github.com/blahgeek/emacs-lsp-booster + (use-package eglot-booster + :vc (:url "https://github.com/jdtsmith/eglot-booster.git") + :ensure t + :after eglot + :config + ;; Use emacs-30's built in JSON handler + (setq eglot-booster-io-only t) + (eglot-booster-mode)) + + ;; Jump to workspace symbols from the LSP with consult + (use-package consult-eglot + :ensure t + :after eglot) + + ;; Install markdown support for eldoc + (use-package markdown-mode + :ensure t) + + ;; Popup lsp documentation information in a floating box + (use-package eldoc-box + :ensure t) + ;; Follow markdown links inside eldoc boxes on selection + (defun markdown-follow-help-or-link-at-point-advice (orig-fun &rest args) + "Prefer to use the help-echo property as `browse-url' target." + (let* ((event-win (posn-window (event-start last-input-event))) + (help-echo (with-selected-frame (window-frame event-win) + (with-current-buffer (window-buffer event-win) + (get-text-property (point) 'help-echo)))) + (help-is-url (url-type (url-generic-parse-url help-echo)))) + (message "if %s (browse-url %S)" help-is-url help-echo) + (if help-is-url + (browse-url help-echo) + (apply orig-fun args)))) + (advice-add 'markdown-follow-link-at-point :around #'markdown-follow-help-or-link-at-point-advice) + + ;; Menu for eglot and related functions + (require 'transient) + (transient-define-prefix eglot-transient () + "Transient menu for Eglot." + [["Server" + ("c" "Reconnect" eglot-reconnect) + ("q" "Shutdown" eglot-shutdown) + ("I" "Server Info" eglot-show-workspace-configuration)] + ["Navigation" + ("g" "Go to Definition" xref-find-definitions) + ("d" "Describe Thing at Point" eldoc-box-help-at-point) + ("D" "Go to Declaration" eglot-find-declaration) + ("i" "Go to Implementation" eglot-find-implementation) + ("f" "Find References" xref-find-references) + ("t" "Type Definition" eglot-find-typeDefinition) + ("s" "Search Symbols" + (lambda () + (interactive) + (if (eq major-mode 'java-mode) + (call-interactively 'consult-eglot-jdt-symbols) + (call-interactively 'consult-eglot-symbols))))] + ["Code Actions" + ("a" "Code Actions" eglot-code-actions) + ("q" "Quick Fix" eglot-code-action-quickfix) + ("=" "Format Buffer" eglot-format-buffer) + ("o" "Organize Imports" eglot-code-action-organize-imports) + ("r" "Rename Symbol" eglot-rename)] + ["Diagnostics" + ("l" "List Diagnostics" flycheck-list-errors) + ("L" "Project Diagnostics" flymake-show-project-diagnostics)]] + (interactive) + (transient-setup 'eglot-transient)) + + (define-key eglot-mode-map (kbd "C-c l") #'eglot-transient) + + ;; Display error and warning highlighting from eglot + (use-package flycheck + :ensure t + :config + (global-flycheck-mode 1)) + + (use-package flycheck-eglot + :ensure t + :after (flycheck eglot) + :custom (flycheck-eglot-exclusive nil) + :config + (global-flycheck-eglot-mode 1)) +#+end_src + +** Org Mode +#+begin_src emacs-lisp + ;; Open source blocks in the current window + (setq org-src-window-setup 'current-window + ;; Don't confirm when evaluating a code block + org-confirm-babel-evaluate nil + ;; Make org documents more seamless by hiding markup + org-hide-emphasis-markers t) + + ;; A nicer org-bullets for headers + (use-package org-superstar + :ensure t + :hook (org-mode . org-superstar-mode) + :custom + (org-superstar-remove-leading-stars t) + (org-superstar-headline-bullets-list + '("•" "•" "•" "•" "•"))) + + ;; Specify the variable font for org-mode text + (let* ((variable-tuple + (cond ((x-list-fonts "Google Sans") '(:font "Google Sans")) + ((x-family-fonts "Sans Serif") '(:family "Sans Serif")) + (nil (warn "Cannot find a Sans Serif Font. Install Google Sans.")))) + (base-font-color (face-foreground 'default nil 'default)) + (headline `(:inherit default :weight bold :foreground ,base-font-color))) + + (custom-theme-set-faces + 'user + `(org-level-8 ((t (,@headline ,@variable-tuple)))) + `(org-level-7 ((t (,@headline ,@variable-tuple)))) + `(org-level-6 ((t (,@headline ,@variable-tuple)))) + `(org-level-5 ((t (,@headline ,@variable-tuple)))) + `(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1)))) + `(org-level-3 ((t (,@headline ,@variable-tuple :height 1.2)))) + `(org-level-2 ((t (,@headline ,@variable-tuple :height 1.3)))) + `(org-level-1 ((t (,@headline ,@variable-tuple :height 1.4)))) + `(org-document-title ((t (,@headline ,@variable-tuple :height 1.6 :underline nil)))))) + + ;; Enable a non-monospace font for org documents + (add-hook 'org-mode-hook 'variable-pitch-mode) + ;; Enable line wrapping for org documents + (add-hook 'org-mode-hook 'visual-line-mode) + ;; Disable line numbers in org mode + (add-hook 'org-mode-hook (lambda () (display-line-numbers-mode -1))) + + ;; Theme the fonts and styles for various org elements + (custom-theme-set-faces + 'user + '(org-block ((t (:inherit fixed-pitch)))) + '(org-code ((t (:inherit (shadow fixed-pitch))))) + '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch))))) + '(org-indent ((t (:inherit (org-hide fixed-pitch))))) + '(org-link ((t (:foreground "#89b4fa" :underline t)))) + '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch))))) + '(org-property-value ((t (:inherit fixed-pitch))) t) + '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch))))) + '(org-table ((t (:inherit fixed-pitch)))) + '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8)))) + '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))) + + ;; Provides quick snippets for common org templates + ;(add-to-list 'org-modules 'org-tempo) + (require 'org-tempo) + ; FIXME: Won't enable for some reason, + ; figure out why, and make it lazy + + ;; Open org mode links in current window + (setq org-link-frame-setup + '((file . find-file) + (wl . wl-other-frame) + (vm . vm-visit-folder-other-frame) + (gnus . gnus))) + + (add-hook 'org-mode-hook (lambda () (electric-indent-local-mode -1))) +#+end_src + +* Language Specific Configuration +These are the configurations for specific programming languages that should be enabled or disabled based on what is needed at any time. + +** Lua +#+begin_src emacs-lisp + (use-package lua-mode + :ensure t + :hook (lua-mode . eglot-ensure) + :config + ;; Use a 2 space indent level for formatting + (setq lua-indent-level 2 + ;; Use lua 5.4 for documentation + lua-documentation-url "https://www.lua.org/manual/5.4/manual.html")) + + ;; Settings for lua_ls + (setq-default eglot-workspace-configuration + `(:Lua + (:completion (:callSnippet "Replace") + :runtime (:version "Lua 5.4" + :path ["?.lua" + "?/init.lua" + "./stubs/?.lua" + "./stubs/?/init.lua"]) + :workspace (:library [,(concat (getenv "HOME") "/.luarocks/share/lua/5.4") + "./stubs"]) + :diagnostics (:enable t)))) + + ; TODO Try fix this only for lua-mode as that is where the bug is + (setq eglot-ignored-server-capabilities + '(:documentOnTypeFormattingProvider)) +#+end_src + +** Nix +#+begin_src emacs-lisp + (use-package nix-mode + :ensure t + :mode "\\.nix\\'" + :config + (add-hook 'nix-mode-hook #'eglot-ensure t) + (add-to-list 'eglot-server-programs '(nix-mode . ("nil")))) +#+end_src + +** COMMENT ZK +#+begin_src emacs-lisp + (use-package tomlparse + :ensure t) + + (use-package zk4e + :ensure t + :after tomlparse + :vc ( :url "https://codeberg.org/mcookly/zk4e" + :branch "main" + :rev :newest) + :config + (setq zk4e-notebook-directories '(("Notes" . "~/Documents/Notes"))) + (zk4e-select-notebook "Notes")) +#+end_src + +** Denote +#+begin_src emacs-lisp + (use-package denote + :ensure t + :hook (dired-mode . denote-dired-mode) + :bind + (("C-c n n" . denote) + ("C-c n N" . denote-type) + ("C-c n r" . denote-rename-file) + ("C-c n l f" . denote-link) + ("C-c n b" . denote-backlinks) + ("C-c n g" . denote-grep)) + :config + (setq denote-directory (expand-file-name "~/Documents/Denotes/")) + (denote-rename-buffer-mode 1)) + + (use-package consult-denote + :ensure t + :bind + (("C-c n f" . consult-denote-find) + ("C-c n g" . consult-denote-grep)) + :config + (consult-denote-mode 1)) + + ; TODO: Denote Explore https://lucidmanager.org/productivity/denote-explore/ + + (use-package denote-menu + :ensure t + :bind + (("C-c n d" . list-denotes)) + :config + (add-hook 'denote-menu-mode-hook (lambda () (display-line-numbers-mode -1)))) + + (use-package denote-org + :ensure t + :bind + (("C-c n l h" . denote-org-link-to-heading))) +#+end_src diff --git a/config/emacs/early-init.el b/config/emacs/early-init.el new file mode 100644 index 0000000..8ba547e --- /dev/null +++ b/config/emacs/early-init.el @@ -0,0 +1,9 @@ +;; GC Perfomance Tweaks from DOOM Emacs +(setq gc-cons-threshold most-positive-fixnum + gc-cons-percentage 1.0) +(add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold (* 128 1024 1024) ;; 128MB + gc-cons-percentage 1.0))) + +(setenv "LSP_USE_PLISTS" "true") diff --git a/.emacs.d/init.el b/config/emacs/init.el index e11d303..e11d303 100644 --- a/.emacs.d/init.el +++ b/config/emacs/init.el diff --git a/config/eza/theme.yml b/config/eza/theme.yml new file mode 100644 index 0000000..f74a128 --- /dev/null +++ b/config/eza/theme.yml @@ -0,0 +1,147 @@ +# Modus Themes for eza +# Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/eza.lua +colourful: true + +# base colors +define: &bg_main "#000000" +define: &bg_dim = "#1e1e1e" +define: &bg_alt = "#0f0f0f" +define: &fg_main = "#ffffff" +define: &fg_dim = "#989898" +define: &fg_alt = "#c6daff" +define: &border = "#646464" +define: &border_highlight = "#C4C4C4" + +# foreground colors +define: &red "#ff5f59" +define: &red_warmer "#ff6b55" +define: &red_cooler "#ff7f9f" +define: &red_faint "#ff9580" +define: &green "#44bc44" +define: &green_warmer "#70b900" +define: &green_cooler "#00c06f" +define: &green_faint "#88ca9f" +define: &yellow "#d0bc00" +define: &yellow_warmer "#fec43f" +define: &yellow_cooler "#dfaf7a" +define: &yellow_faint "#d2b580" +define: &blue "#2fafff" +define: &blue_warmer "#79a8ff" +define: &blue_cooler "#00bcff" +define: &blue_faint "#82b0ec" +define: &magenta "#feacd0" +define: &magenta_warmer "#f78fe7" +define: &magenta_cooler "#b6a0ff" +define: &magenta_faint "#caa6df" +define: &cyan "#00d3d0" +define: &cyan_warmer "#4ae2f0" +define: &cyan_cooler "#6ae4b9" +define: &cyan_faint "#9ac8e0" +define: &rust "#db7b5f" +define: &gold "#c0965b" +define: &olive "#9cbd6f" +define: &slate "#76afbf" +define: &indigo "#9099d9" +define: &maroon "#cf7fa7" +define: &pink "#d09dc0" + +filekinds: + normal: {foreground: *fg_main} + directory: {foreground: *blue_warmer} + symlink: {foreground: *blue} + pipe: {foreground: *fg_dim} + block_device: {foreground: *magenta_cooler} + char_device: {foreground: *yellow_warmer} + socket: {foreground: *magenta} + special: {foreground: *pink} + executable: {foreground: *green} + mount_point: {foreground: *cyan} + +perms: + user_read: {foreground: *fg_dim} + user_write: {foreground: *red} + user_execute_file: {foreground: *green} + user_execute_other: {foreground: *green} + group_read: {foreground: *fg_dim} + group_write: {foreground: *red} + group_execute: {foreground: *green} + other_read: {foreground: *fg_dim} + other_write: {foreground: *red} + other_execute: {foreground: *green} + special_user_file: {foreground: *magenta_cooler} + special_other: {foreground: *red} + attribute: {foreground: *pink} + +size: + major: {foreground: *fg_dim} + minor: {foreground: *blue_warmer} + number_byte: {foreground: *pink} + number_kilo: {foreground: *rust} + number_mega: {foreground: *blue_warmer} + number_giga: {foreground: *magenta_cooler} + number_huge: {foreground: *magenta} + unit_byte: {foreground: *pink} + unit_kilo: {foreground: *rust} + unit_mega: {foreground: *blue_warmer} + unit_giga: {foreground: *magenta_cooler} + unit_huge: {foreground: *magenta} + +users: + user_you: {foreground: *yellow_warmer} + user_root: {foreground: *red} + user_other: {foreground: *magenta_cooler} + group_yours: {foreground: *pink} + group_other: {foreground: *fg_dim} + group_root: {foreground: *red} + +links: + normal: {foreground: *blue} + multi_link_file: {foreground: *cyan} + +git: + new: {foreground: *green} + modified: {foreground: *yellow_warmer} + deleted: {foreground: *red} + renamed: {foreground: *cyan} + typechange: {foreground: *magenta_cooler} + ignored: {foreground: *pink} + conflicted: {foreground: *magenta} + +git_repo: + branch_main: {foreground: *fg_dim} + branch_other: {foreground: *magenta_cooler} + git_clean: {foreground: *green} + git_dirty: {foreground: *red} + +security_context: + colon: {foreground: *fg_dim} + user: {foreground: *blue_warmer} + role: {foreground: *magenta_cooler} + typ: {foreground: *pink} + range: {foreground: *magenta_cooler} + +file_type: + image: {foreground: *yellow_warmer} + video: {foreground: *magenta} + music: {foreground: *blue_warmer} + lossless: {foreground: *cyan} + crypto: {foreground: *pink} + document: {foreground: *fg_dim} + compressed: {foreground: *magenta_cooler} + temp: {foreground: *yellow_warmer} + compiled: {foreground: *cyan} + build: {foreground: *pink} + source: {foreground: *green} + +punctuation: {foreground: *pink} +date: {foreground: *cyan} +inode: {foreground: *fg_dim} +blocks: {foreground: *pink} +header: {foreground: *fg_dim} +octal: {foreground: *blue_warmer} +flags: {foreground: *magenta_cooler} + +symlink_path: {foreground: *blue} +control_char: {foreground: *cyan} +broken_symlink: {foreground: *red} +broken_path_overlay: {foreground: *pink} diff --git a/config/lazygit/.gitignore b/config/lazygit/.gitignore new file mode 100644 index 0000000..ace2661 --- /dev/null +++ b/config/lazygit/.gitignore @@ -0,0 +1 @@ +state.yml diff --git a/config/lazygit/config.yml b/config/lazygit/config.yml new file mode 100644 index 0000000..0151f13 --- /dev/null +++ b/config/lazygit/config.yml @@ -0,0 +1,182 @@ +gui: + border: single + +keybinding: + universal: + quit: q + quit-alt1: <c-c> + suspendApp: <c-z> + return: <esc> + quitWithoutChangingDirectory: Q + togglePanel: <tab> + prevItem: <up> + nextItem: <down> + prevItem-alt: e + nextItem-alt: n + prevPage: ',' + nextPage: . + scrollLeft: H + scrollRight: I + gotoTop: < + gotoBottom: '>' + gotoTop-alt: <home> + gotoBottom-alt: <end> + toggleRangeSelect: v + rangeSelectDown: <s-down> + rangeSelectUp: <s-up> + prevBlock: <left> + nextBlock: <right> + prevBlock-alt: h + nextBlock-alt: i + nextBlock-alt2: <tab> + prevBlock-alt2: <backtab> + jumpToBlock: + - "1" + - "2" + - "3" + - "4" + - "5" + focusMainView: "0" + nextMatch: "k" + prevMatch: "K" + startSearch: / + optionMenu: <disabled> + optionMenu-alt1: '?' + select: <space> + goInto: <enter> + confirm: <enter> + confirmMenu: <enter> + confirmSuggestion: <enter> + confirmInEditor: <a-enter> + confirmInEditor-alt: <c-s> + remove: d + new: "n" + edit: j + openFile: o + scrollUpMain: <pgup> + scrollDownMain: <pgdown> + scrollUpMain-alt1: E + scrollDownMain-alt1: N + scrollUpMain-alt2: <c-u> + scrollDownMain-alt2: <c-d> + executeShellCommand: ':' + createRebaseOptionsMenu: m + + # 'Files' appended for legacy reasons + pushFiles: P + + # 'Files' appended for legacy reasons + pullFiles: p + refresh: R + createPatchOptionsMenu: <c-p> + nextTab: ']' + prevTab: '[' + nextScreenMode: + + prevScreenMode: _ + cyclePagers: '|' + undo: z + redo: Z + filteringMenu: <c-s> + diffingMenu: W + diffingMenu-alt: <c-j> + copyToClipboard: <c-o> + openRecentRepos: <c-r> + submitEditorText: <enter> + extrasMenu: '@' + toggleWhitespaceInDiffView: <c-w> + increaseContextInDiffView: '}' + decreaseContextInDiffView: '{' + increaseRenameSimilarityThreshold: ) + decreaseRenameSimilarityThreshold: ( + openDiffTool: <c-t> + status: + checkForUpdate: u + recentRepos: <enter> + allBranchesLogGraph: a + files: + commitChanges: c + commitChangesWithoutHook: w + amendLastCommit: A + commitChangesWithEditor: C + findBaseCommitForFixup: <c-f> + confirmDiscard: x + ignoreFile: l + refreshFiles: r + stashAllChanges: s + viewStashOptions: S + toggleStagedAll: a + viewResetOptions: D + fetch: f + toggleTreeView: '`' + openMergeOptions: M + openStatusFilter: <c-b> + copyFileInfoToClipboard: "y" + collapseAll: '-' + expandAll: = + branches: + createPullRequest: o + viewPullRequestOptions: O + copyPullRequestURL: <c-y> + checkoutBranchByName: c + forceCheckoutBranch: F + checkoutPreviousBranch: '-' + rebaseBranch: r + renameBranch: R + mergeIntoCurrentBranch: M + moveCommitsToNewBranch: "K" + viewGitFlowOptions: l + fastForward: f + createTag: T + pushTag: P + setUpstream: u + fetchRemote: f + addForkRemote: F + sortOrder: s + worktrees: + viewWorktreeOptions: w + commits: + squashDown: s + renameCommit: r + renameCommitWithEditor: R + viewResetOptions: g + markCommitAsFixup: f + setFixupMessage: c + createFixupCommit: F + squashAboveCommits: S + moveDownCommit: <c-n> + moveUpCommit: <c-e> + amendToCommit: A + resetCommitAuthor: a + pickCommit: p + revertCommit: t + cherryPickCopy: C + pasteCommits: V + markCommitAsBaseForRebase: B + tagCommit: T + checkoutCommit: <space> + resetCherryPick: <c-R> + copyCommitAttributeToClipboard: "y" + openLogMenu: <c-l> + openInBrowser: o + viewBisectOptions: b + startInteractiveRebase: l + selectCommitsOfCurrentBranch: '*' + amendAttribute: + resetAuthor: a + setAuthor: A + addCoAuthor: c + stash: + popStash: g + renameStash: r + commitFiles: + checkoutCommitFile: c + main: + toggleSelectHunk: a + pickBothHunks: b + editSelectHunk: J + submodules: + init: l + update: u + bulkMenu: b + commitMessage: + commitMenu: <c-o> diff --git a/config/nvim/.gitignore b/config/nvim/.gitignore new file mode 100644 index 0000000..e033bc6 --- /dev/null +++ b/config/nvim/.gitignore @@ -0,0 +1 @@ +lazy-lock.json diff --git a/config/nvim/.luarc.json b/config/nvim/.luarc.json new file mode 100644 index 0000000..bd8a14b --- /dev/null +++ b/config/nvim/.luarc.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", + "Lua.runtime.version": "LuaJIT", + "diagnostics.globals": ["vim"], + "workspace.checkThirdParty": false, + "workspace.library": [ + "$VIMRUNTIME" + ], + "Lua.diagnostics.enable": true, + "Lua.format.defaultConfig": { + "indent_style": "space", + "indent_size": "2" + }, + "typeFormat.config": false, + "completion.callSnippet": "Replace", + "completion.showWord": "Disable", + "completion.workspaceWord": false +} diff --git a/config/nvim/ftplugin/markdown.lua b/config/nvim/ftplugin/markdown.lua new file mode 100644 index 0000000..4f658e4 --- /dev/null +++ b/config/nvim/ftplugin/markdown.lua @@ -0,0 +1,10 @@ +vim.keymap.set('n', 'n', 'gj', { buffer = true, noremap = true }) +vim.keymap.set('n', 'e', 'gk', { buffer = true, noremap = true }) + +vim.opt_local.wrap = true +vim.opt_local.linebreak = true + +vim.opt_local.number = false +vim.opt_local.relativenumber = false + +vim.treesitter.start(vim.api.nvim_get_current_buf(), 'markdown') diff --git a/config/nvim/init.lua b/config/nvim/init.lua new file mode 100644 index 0000000..4b53a96 --- /dev/null +++ b/config/nvim/init.lua @@ -0,0 +1,10 @@ +-- Setup Config +require("config.colemak") +require("config.options") +require("config.keymaps") + +-- Setup Lazy Plugin Manager +require("manager") + +-- Test Script +require("scripts") diff --git a/config/nvim/lua/config/colemak.lua b/config/nvim/lua/config/colemak.lua new file mode 100644 index 0000000..e6ce33b --- /dev/null +++ b/config/nvim/lua/config/colemak.lua @@ -0,0 +1,32 @@ +local function map(mode, lhs, rhs, opts) + local options = { noremap = true, silent = true } + if opts then + options = vim.tbl_extend("force", options, opts) + end + vim.keymap.set(mode, lhs, rhs, options) +end + +map("", "n", "j") +map("", "e", "k") +map("", "i", "l") +map("", "j", "n") +map("", "k", "e") +map("", "l", "i") +map("", "K", "E") +map("", "N", "J") +map("", "E", "K") -- As in 'Explore' documentation +map("", "L", "I") +map("", "I", "L") +map("", "J", "N") + +map("n", "<c-w>h", "<c-w>h") +map("n", "<c-w>n", "<c-w>j") +map("n", "<c-w>e", "<c-w>k") +map("n", "<C-w>i", "<c-w>l") + +map ("", "gn", "gj") +map ("", "ge", "gk") + +-- Kakoune Holdover +map ("", "gh", "0") +map ("", "gi", "$") diff --git a/config/nvim/lua/config/keymaps.lua b/config/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..514a311 --- /dev/null +++ b/config/nvim/lua/config/keymaps.lua @@ -0,0 +1,53 @@ +vim.g.mapleader = " " +vim.keymap.set("n", "<leader>bk", vim.cmd.bdelete, + { desc = "Kill Buffer" }) +vim.keymap.set("n", "<leader>bn", vim.cmd.bnext, + { desc = "Next Buffer" }) +vim.keymap.set("n", "<leader>bp", vim.cmd.bprev, + { desc = "Previous Buffer" }) + +vim.keymap.set("n", "E", vim.lsp.buf.hover) +vim.keymap.set("n", "<C-e>", vim.diagnostic.open_float) +vim.keymap.set("n", "<leader>ld", vim.lsp.buf.definition, + { desc = "Go to Definition" }) +vim.keymap.set("n", "<leader>lt", vim.lsp.buf.type_definition, + { desc = "Go to Type Definition"} ) +vim.keymap.set("n", "<leader>li", vim.lsp.buf.implementation, + { desc = "Go to Implementation" }) +vim.keymap.set("n", "<leader>la", vim.lsp.buf.code_action, + { desc = "Show Code Actions" }) +vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format, + { desc = "Format Document" }) +vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename, + { desc = "Rename" }) +vim.keymap.set("n", "<leader>lk", function() + vim.diagnostic.jump({ count = 1, float = true }) +end, + { desc = "Next Error" }) +-- vim.keymap.set("n", "<leader>lh", vim.lsp.buf.hover, +-- { desc = "Hover Diagnostics" }) + +vim.keymap.set("n", "<leader>wh", vim.cmd.split, + { desc = "Split Window Horizontally" }) +vim.keymap.set("n", "<leader>wv", vim.cmd.vsplit, + { desc = "Split Window Vertically" }) +vim.keymap.set("n", "<leader>wc", "<C-w>q", + { desc = "Close Window" }) +vim.keymap.set("n", "<leader>ww", "<C-w>w", + { desc = "Next Window" }) + +vim.keymap.set("n", "<leader>foc", function() + vim.cmd('edit ~/.config/nvim/init.lua') +end, { desc = "Open Config File" }) + +vim.keymap.set("n", "<leader>fot", function() + vim.cmd('edit ~/Documents/TODO.org') +end, { desc = "Open Todo File" }) + +vim.keymap.set("n", "<leader>fon", function() + vim.cmd('edit ~/Documents/Notes.org') +end, { desc = "Open Notes File" }) + +vim.keymap.set('n', '<Tab>', '==', { noremap = true, silent = true }) + +vim.keymap.set('n', 'q:', ':q<CR>', { noremap = true }) diff --git a/config/nvim/lua/config/options.lua b/config/nvim/lua/config/options.lua new file mode 100644 index 0000000..f7bc9d8 --- /dev/null +++ b/config/nvim/lua/config/options.lua @@ -0,0 +1,107 @@ +vim.opt.nu = true +vim.opt.rnu = true + +vim.opt.tabstop = 2 +vim.opt.softtabstop = 2 +vim.opt.shiftwidth = 2 +vim.opt.expandtab = true +vim.opt.autoindent = true + +vim.opt.smartindent = true + +vim.opt.wrap = false + +vim.opt.swapfile = false +vim.opt.backup = false +vim.opt.undodir = os.getenv("HOME") .. "/.nvim/undodir" +vim.opt.undofile = true + +vim.opt.hlsearch = false +vim.opt.incsearch = true + +vim.opt.termguicolors = true + +vim.opt.scrolloff = 12 + +vim.opt.updatetime = 50 + +vim.opt.splitbelow = true +vim.opt.splitright = true + +vim.opt.encoding = "utf-8" + +vim.opt.shell = "zsh" + +vim.opt.mouse = "a" + +vim.opt.ignorecase = true +vim.opt.smartcase = true +vim.opt.incsearch = true + +-- vim.opt.cursorline = true + +vim.opt.title = true + +vim.opt.clipboard = "unnamedplus" + +-- vim.opt.colorcolumn = "80" + +vim.opt.signcolumn = 'no' + +vim.cmd "set showtabline=0 | set laststatus=0" + +vim.wo.fillchars='eob: ' + +vim.opt.conceallevel = 3 + +-- Window Borders +vim.o.winborder = 'rounded' + +-- Remove Whitespaces on File Save +vim.api.nvim_create_autocmd({ "BufWritePre" }, { + pattern = { "*" }, + command = [[%s/\s\+$//e]], +}) + +-- Define highlight groups for line numbers with diagnostics +vim.api.nvim_set_hl(0, "LineNrDiagnosticError", { bg = "#3f1d1d", fg = "#ff6c6b" }) +vim.api.nvim_set_hl(0, "LineNrDiagnosticWarn", { bg = "#3f311d", fg = "#ECBE7B" }) +vim.api.nvim_set_hl(0, "LineNrDiagnosticInfo", { bg = "#1d2d3f", fg = "#51afef" }) +vim.api.nvim_set_hl(0, "LineNrDiagnosticHint", { bg = "#1d3f2d", fg = "#98be65" }) + +local function set_line_number_highlight() + -- Clear existing highlights + vim.fn.sign_unplace("LineNrDiagnostics") + + -- Get diagnostics per buffer + for _, diag in ipairs(vim.diagnostic.get(0)) do + local hl_group = nil + if diag.severity == vim.diagnostic.severity.ERROR then + hl_group = "LineNrDiagnosticError" + elseif diag.severity == vim.diagnostic.severity.WARN then + hl_group = "LineNrDiagnosticWarn" + elseif diag.severity == vim.diagnostic.severity.INFO then + hl_group = "LineNrDiagnosticInfo" + elseif diag.severity == vim.diagnostic.severity.HINT then + hl_group = "LineNrDiagnosticHint" + end + + if hl_group then + vim.fn.sign_place(0, "LineNrDiagnostics", hl_group, vim.api.nvim_get_current_buf(), { + lnum = diag.lnum + 1, -- diagnostics are 0-indexed + priority = 10, + }) + end + end +end + +-- Create the sign definitions +vim.fn.sign_define("LineNrDiagnosticError", { text = "", texthl = "LineNrDiagnosticError", numhl = "LineNrDiagnosticError" }) +vim.fn.sign_define("LineNrDiagnosticWarn", { text = "", texthl = "LineNrDiagnosticWarn", numhl = "LineNrDiagnosticWarn" }) +vim.fn.sign_define("LineNrDiagnosticInfo", { text = "", texthl = "LineNrDiagnosticInfo", numhl = "LineNrDiagnosticInfo" }) +vim.fn.sign_define("LineNrDiagnosticHint", { text = "", texthl = "LineNrDiagnosticHint", numhl = "LineNrDiagnosticHint" }) + +-- Update line numbers when diagnostics change +vim.api.nvim_create_autocmd({ "DiagnosticChanged", "BufEnter", "CursorHold" }, { + callback = set_line_number_highlight, +}) diff --git a/config/nvim/lua/manager.lua b/config/nvim/lua/manager.lua new file mode 100644 index 0000000..f450d31 --- /dev/null +++ b/config/nvim/lua/manager.lua @@ -0,0 +1,26 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" + +require("lazy").setup({ + spec = { + { import = "plugins" }, + }, + install = { colorscheme = { "modus" } }, + checker = { enabled = true, notify = false }, +}) diff --git a/config/nvim/lua/plugins/autopairs.lua b/config/nvim/lua/plugins/autopairs.lua new file mode 100644 index 0000000..c37e301 --- /dev/null +++ b/config/nvim/lua/plugins/autopairs.lua @@ -0,0 +1,8 @@ +return { + "windwp/nvim-autopairs", + config = function() + require("nvim-autopairs").setup({ + disable_filetype = { "TelescopePrompt" , "vim" } + }) + end, +} diff --git a/config/nvim/lua/plugins/catppuccin.lua b/config/nvim/lua/plugins/catppuccin.lua new file mode 100644 index 0000000..9b09225 --- /dev/null +++ b/config/nvim/lua/plugins/catppuccin.lua @@ -0,0 +1,15 @@ +return { + 'catppuccin/nvim', + name = 'catppuccin', + priority = 1000, + config = function() + require('catppuccin').setup({ + flavour = 'mocha', + transparent_background = true, + float = { + transparent = true, + }, + }) + vim.cmd.colorscheme('catppuccin') + end, +} diff --git a/config/nvim/lua/plugins/cmp.lua b/config/nvim/lua/plugins/cmp.lua new file mode 100644 index 0000000..69a2396 --- /dev/null +++ b/config/nvim/lua/plugins/cmp.lua @@ -0,0 +1,99 @@ +return { + 'hrsh7th/nvim-cmp', + dependencies = { + 'neovim/nvim-lspconfig', + 'hrsh7th/cmp-nvim-lsp', + 'hrsh7th/cmp-buffer', + 'hrsh7th/cmp-path', + 'lukas-reineke/cmp-rg', + 'onsails/lspkind.nvim' + }, + config = function() + local cmp = require('cmp') + local lspkind = require('lspkind') + cmp.setup({ + -- preselect = cmp.PreselectMode.None, + completion = { + completeopt = "menu,menuone,noinsert", + callSnippet = "Replace", + keywordSnippet = "Replace", + }, + window = { + completion = cmp.config.window.bordered({}), + documentation = cmp.config.window.bordered({}), + }, + snippet = { + expand = function(arg) + vim.snippet.expand(arg.body) + end + }, + mapping = cmp.mapping.preset.insert({ + ['<Tab>'] = cmp.mapping.confirm({ select = true }), + ['<C-n>'] = cmp.mapping.select_next_item(), + ['<C-p>'] = cmp.mapping.select_prev_item(), + ['<C-g>'] = cmp.mapping.abort(), + }), + sources = cmp.config.sources( + { + { name = 'nvim_lsp' }, + }, + { + { name = 'path' }, + } + -- { + -- { name = 'buffer' }, + -- { name = 'rg', keyword_length = 3 } + -- } + ), + formatting = { + format = lspkind.cmp_format({ + mode = 'symbol' + }) + }, + -- view = { + -- entries = 'native' + -- }, + }) + + local capabilities = require('cmp_nvim_lsp').default_capabilities() + vim.lsp.config('lua_ls', { + -- cmd = { '/home/venomade/.local/share/lua-language-server/bin/lua-language-server' }, + capabilities = capabilities, + root_markers = { + ".luarc.json", + ".luarc.jsonc", + ".git", + }, + settings = { + Lua = { + runtime = { + version = 'Lua 5.4', + path = vim.list_extend( + vim.split(package.path, ';'), + { + '?.lua', + '?/init.lua', + './stubs/?.lua', + './stubs/?/init.lua' + }), + }, + workspace = { + library = { + vim.env.HOME .. '/.luarocks/share/lua/5.4', + './stubs' + }, + }, + diagnostics = { + enable = true, + }, + }, + }, + }) + + vim.lsp.enable('lua_ls') + vim.lsp.config('clangd', { + capabilities = capabilities + }) + vim.lsp.enable('clangd') + end +} diff --git a/config/nvim/lua/plugins/colorizer.lua b/config/nvim/lua/plugins/colorizer.lua new file mode 100644 index 0000000..460eb5c --- /dev/null +++ b/config/nvim/lua/plugins/colorizer.lua @@ -0,0 +1,15 @@ +return { + 'norcalli/nvim-colorizer.lua', + config = function() + require("colorizer").setup({ "*" }, { + RGB = true, + RRGGBB = true, + names = false, + RRGGBBAA = true, + rgb_fn = true, + hsl_fn = true, + css = false, + css_fn = false, + }) + end +} diff --git a/config/nvim/lua/plugins/compile.lua b/config/nvim/lua/plugins/compile.lua new file mode 100644 index 0000000..8d824de --- /dev/null +++ b/config/nvim/lua/plugins/compile.lua @@ -0,0 +1,20 @@ +return { + "ej-shafran/compile-mode.nvim", + branch = "latest", + dependencies = { + "nvim-lua/plenary.nvim", + }, + config = function() + vim.g.compile_mode = {} + + local compile_mode = require("compile-mode") + + vim.keymap.set("n", "<leader>cc", compile_mode.compile, + { desc = "Compile" }) + vim.keymap.set("n", "<leader>cr", compile_mode.recompile, + { desc = "Recompile" }) + vim.keymap.set("n", "<leader>cq", compile_mode.interrupt, + { desc = "Quit Compile (Interrupt)" }) + + end +} diff --git a/config/nvim/lua/plugins/image.lua b/config/nvim/lua/plugins/image.lua new file mode 100644 index 0000000..1ab0f9a --- /dev/null +++ b/config/nvim/lua/plugins/image.lua @@ -0,0 +1,20 @@ +return { + '3rd/image.nvim', + config = function() + require("image").setup({ + backend = "sixel", + processor = "magick_cli", + integrations = { + markdown = { + enabled = true, + only_render_image_at_cursor = true, + only_render_image_at_cursor_mode = "popup", -- or "inline" + floating_windows = true, -- if true, images will be rendered in floating markdown windows + }, + }, + window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs" }, + editor_only_render_when_focused = true, -- auto show/hide images when the editor gains/looses focus + }) + end, + build = false, +} diff --git a/config/nvim/lua/plugins/lazygit.lua b/config/nvim/lua/plugins/lazygit.lua new file mode 100644 index 0000000..f9ddc84 --- /dev/null +++ b/config/nvim/lua/plugins/lazygit.lua @@ -0,0 +1,20 @@ +return { + "kdheepak/lazygit.nvim", + lazy = true, + cmd = { + "LazyGit", + "LazyGitConfig", + "LazyGitCurrentFile", + "LazyGitFilter", + "LazyGitFilterCurrentFile", + }, + -- optional for floating window border decoration + dependencies = { + "nvim-lua/plenary.nvim", + }, + -- setting the keybinding for LazyGit with 'keys' is recommended in + -- order to load the plugin when the command is run for the first time + keys = { + { "<leader>g", "<cmd>LazyGit<cr>", desc = "LazyGit" } + } +} diff --git a/config/nvim/lua/plugins/lualine.lua b/config/nvim/lua/plugins/lualine.lua new file mode 100644 index 0000000..5412061 --- /dev/null +++ b/config/nvim/lua/plugins/lualine.lua @@ -0,0 +1,38 @@ +return { + "nvim-lualine/lualine.nvim", + dependencies = { 'nvim-tree/nvim-web-devicons' }, + config = function() + require("lualine").setup({ + options = { + icons_enabled = true, + component_separators = { left = '|', right = '|'}, + section_separators = { left = '', right = ''}, + theme = { + normal = { + a = { bg = '#000000' }, + b = { bg = '#000000' }, + c = { bg = '#000000' }, + }, + inactive = { + a = { bg = '#000000' }, + b = { bg = '#000000' }, + c = { bg = '#000000' }, + } + }, + }, + sections = { + lualine_a = {"mode", { + "filetype", + icon_only = true, + separator = "", + padding = { right = 0, left = 1 }, + }, "filename" }, + lualine_b = {}, + lualine_c = {}, + lualine_x = {"diagnostics"}, + lualine_y = {}, + lualine_z = {} + } + }) + end, +} diff --git a/config/nvim/lua/plugins/oil.lua b/config/nvim/lua/plugins/oil.lua new file mode 100644 index 0000000..3eb396d --- /dev/null +++ b/config/nvim/lua/plugins/oil.lua @@ -0,0 +1,28 @@ +return { + 'stevearc/oil.nvim', + dependencies = { "nvim-tree/nvim-web-devicons" }, + config = function() + + function _G.get_oil_winbar() + local bufnr = vim.api.nvim_win_get_buf(vim.g.statusline_winid) + local dir = require("oil").get_current_dir(bufnr) + if dir then + return vim.fn.fnamemodify(dir, ":~") + else + -- If there is no current directory (e.g. over ssh), just show the buffer name + return vim.api.nvim_buf_get_name(0) + end + end + + require('oil').setup({ + win_options = { + winbar = "%!v:lua.get_oil_winbar()", + }, + view_options = { + show_hidden = true + } + }) + vim.keymap.set('n', '-', '<CMD>Oil<CR>', {desc = "Open Dir in Oil"}) + end, + lazy = false, +} diff --git a/config/nvim/lua/plugins/rainbow-delimiters.lua b/config/nvim/lua/plugins/rainbow-delimiters.lua new file mode 100644 index 0000000..9fe4a06 --- /dev/null +++ b/config/nvim/lua/plugins/rainbow-delimiters.lua @@ -0,0 +1,6 @@ +return { + "hiphish/rainbow-delimiters.nvim", + config = function() + require('rainbow-delimiters.setup').setup({}) + end, +} diff --git a/config/nvim/lua/plugins/remember.lua b/config/nvim/lua/plugins/remember.lua new file mode 100644 index 0000000..911d9c6 --- /dev/null +++ b/config/nvim/lua/plugins/remember.lua @@ -0,0 +1,7 @@ +return { + 'vladdoster/remember.nvim', + config = function() + require'remember'.setup({}) + end +} + diff --git a/config/nvim/lua/plugins/render-markdown.lua b/config/nvim/lua/plugins/render-markdown.lua new file mode 100644 index 0000000..b87f8a1 --- /dev/null +++ b/config/nvim/lua/plugins/render-markdown.lua @@ -0,0 +1,114 @@ +return { + 'MeanderingProgrammer/render-markdown.nvim', + dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-tree/nvim-web-devicons' }, + config = function() + require('render-markdown').setup({ + link = { + enabled = true, + render_modes = false, + footnote = { + enabled = true, + superscript = true, + prefix = '', + suffix = '', + }, + image = ' ', + email = ' ', + hyperlink = ' ', + highlight = 'RenderMarkdownLink', + wiki = { + icon = ' ', + body = function() + return nil + end, + highlight = 'RenderMarkdownWikiLink', + }, + custom = { + web = { pattern = '^http', icon = ' ' }, + github = { pattern = 'github%.com', icon = ' ' }, + stackoverflow = { pattern = 'stackoverflow%.com', icon = ' ' }, + wikipedia = { pattern = 'wikipedia%.org', icon = ' ' }, + youtube = { pattern = 'youtube%.com', icon = ' ' }, + reddit = { pattern = 'reddit%.com', icon = ' ' }, + old_reddit = { pattern = 'old.reddit%.com', icon = ' ' }, + gvc = { pattern = 'git%.venomade%.com', icon = ' ' }, + catechism = { pattern = 'ccc%.directory', icon = ' ' }, + bible = { pattern = 'biblenow%.net', icon = ' ' }, + luarocks = { pattern = 'luarocks%.org', icon = ' ' }, + }, + }, + callout = { + note = { raw = '[!NOTE]', rendered = ' Note', highlight = 'RenderMarkdownInfo' }, + tip = { raw = '[!TIP]', rendered = ' Tip', highlight = 'RenderMarkdownSuccess' }, + important = { raw = '[!IMPORTANT]', rendered = ' Important', highlight = 'RenderMarkdownHint' }, + warning = { raw = '[!WARNING]', rendered = ' Warning', highlight = 'RenderMarkdownWarn' }, + caution = { raw = '[!CAUTION]', rendered = ' Caution', highlight = 'RenderMarkdownError' }, + abstract = { raw = '[!ABSTRACT]', rendered = ' Abstract', highlight = 'RenderMarkdownInfo' }, + summary = { raw = '[!SUMMARY]', rendered = ' Summary', highlight = 'RenderMarkdownInfo' }, + tldr = { raw = '[!TLDR]', rendered = ' Tldr', highlight = 'RenderMarkdownInfo' }, + info = { raw = '[!INFO]', rendered = ' Info', highlight = 'RenderMarkdownInfo' }, + todo = { raw = '[!TODO]', rendered = ' Todo', highlight = 'RenderMarkdownInfo' }, + hint = { raw = '[!HINT]', rendered = ' Hint', highlight = 'RenderMarkdownSuccess' }, + success = { raw = '[!SUCCESS]', rendered = ' Success', highlight = 'RenderMarkdownSuccess' }, + check = { raw = '[!CHECK]', rendered = ' Check', highlight = 'RenderMarkdownSuccess' }, + done = { raw = '[!DONE]', rendered = ' Done', highlight = 'RenderMarkdownSuccess' }, + question = { raw = '[!QUESTION]', rendered = ' Question', highlight = 'RenderMarkdownWarn' }, + help = { raw = '[!HELP]', rendered = ' Help', highlight = 'RenderMarkdownWarn' }, + faq = { raw = '[!FAQ]', rendered = ' Faq', highlight = 'RenderMarkdownWarn' }, + attention = { raw = '[!ATTENTION]', rendered = ' Attention', highlight = 'RenderMarkdownWarn' }, + failure = { raw = '[!FAILURE]', rendered = ' Failure', highlight = 'RenderMarkdownError' }, + fail = { raw = '[!FAIL]', rendered = ' Fail', highlight = 'RenderMarkdownError' }, + missing = { raw = '[!MISSING]', rendered = ' Missing', highlight = 'RenderMarkdownError' }, + danger = { raw = '[!DANGER]', rendered = ' Danger', highlight = 'RenderMarkdownError' }, + error = { raw = '[!ERROR]', rendered = ' Error', highlight = 'RenderMarkdownError' }, + bug = { raw = '[!BUG]', rendered = ' Bug', highlight = 'RenderMarkdownError' }, + example = { raw = '[!EXAMPLE]', rendered = ' Example', highlight = 'RenderMarkdownHint' }, + quote = { raw = '[!QUOTE]', rendered = ' Quote', highlight = 'RenderMarkdownQuote' }, + cite = { raw = '[!CITE]', rendered = ' Cite', highlight = 'RenderMarkdownQuote' }, + }, + checkbox = { + enabled = true, + render_modes = false, + bullet = false, + right_pad = 1, + unchecked = { + icon = ' ', + highlight = 'RenderMarkdownUnchecked', + scope_highlight = nil, + }, + checked = { + icon = ' ', + highlight = 'RenderMarkdownChecked', + scope_highlight = nil, + }, + custom = { + todo = { raw = '[-]', rendered = ' ', highlight = 'RenderMarkdownTodo', scope_highlight = nil }, + }, + }, + bullet = { + enabled = true, + render_modes = false, + icons = { '●', '○', '◆', '◇' }, + ordered_icons = function(ctx) + local value = vim.trim(ctx.value) + local index = tonumber(value:sub(1, #value - 1)) + return ('%d.'):format(index > 1 and index or ctx.index) + end, + left_pad = 0, + right_pad = 0, + highlight = 'RenderMarkdownBullet', + scope_highlight = {}, + }, + quote = { icon = '▋' }, + anti_conceal = { + enabled = false, + }, + heading = { + icons = { ' ', ' ', ' ', ' ', ' ', ' ' }, + backgrounds = {}, + }, + nested = false, + }) + end, +} + diff --git a/config/nvim/lua/plugins/telescope.lua b/config/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..7cfe5c5 --- /dev/null +++ b/config/nvim/lua/plugins/telescope.lua @@ -0,0 +1,40 @@ +return { + "nvim-telescope/telescope.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + config = function() + require("telescope").setup({ + -- defaults = { + -- borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" }, + -- }, + }) + + local tscope = require('telescope.builtin') + vim.keymap.set("n", "<leader>ff", function() + local cwd + if vim.bo.filetype == "oil" then + cwd = require("oil").get_current_dir() + else + cwd = vim.fn.expand("%:p:h") + end + tscope.find_files({ cwd = cwd }) + end, { desc = "Find File" }) + + vim.keymap.set("n", "<leader>fp", function() + tscope.find_files({ + cwd = vim.loop.cwd(), + }) + end, { desc = "Find Project File" }) + vim.keymap.set('n', '<leader>bb', tscope.buffers, + { desc = "Find Buffer" }) + vim.keymap.set('n', '<leader>fh', tscope.help_tags, + { desc = "Find Help" }) + vim.keymap.set('n', '<leader>fg', tscope.live_grep, + { desc = "Find by Grep" }) + vim.keymap.set('n', '<leader>fr', tscope.oldfiles, + { desc = "Find Recent Files" }) + vim.keymap.set('n', '<leader>lw', tscope.diagnostics, + { desc = "Search Diagnostics" }) + vim.keymap.set('n', '<leader>lg', tscope.lsp_references, + { desc = "Search References" }) + end, +} diff --git a/config/nvim/lua/plugins/todo-comments.lua b/config/nvim/lua/plugins/todo-comments.lua new file mode 100644 index 0000000..69f907e --- /dev/null +++ b/config/nvim/lua/plugins/todo-comments.lua @@ -0,0 +1,14 @@ +return { + "folke/todo-comments.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + opts = { + + }, + config = function() + require('todo-comments').setup({}) + vim.keymap.set('n', '<leader>ft', function() + vim.cmd('TodoTelescope') + end, + { desc = "Find Buffer" }) + end, +} diff --git a/config/nvim/lua/plugins/ui.lua b/config/nvim/lua/plugins/ui.lua new file mode 100644 index 0000000..5df6f44 --- /dev/null +++ b/config/nvim/lua/plugins/ui.lua @@ -0,0 +1,27 @@ +return { + "OXY2DEV/ui.nvim", + lazy = false, + config = function() + require("ui").setup({ + cmdline = { + enable = true, + row_offset = 0, + }, + messages = { + enable = true, + }, + popupmenu = { + enable = false, + }, + }); + + local spec = require("ui.spec") + + spec.config.message.showcmd.modifier = function(_, lines) + return { + lines = { "" }, + extmarks = { {} }, + } + end + end, +}; diff --git a/config/nvim/lua/plugins/which-key.lua b/config/nvim/lua/plugins/which-key.lua new file mode 100644 index 0000000..c068002 --- /dev/null +++ b/config/nvim/lua/plugins/which-key.lua @@ -0,0 +1,17 @@ +return { + 'folke/which-key.nvim', + event = 'VeryLazy', + opts = { + icons = { mappings = false }, + delay = 1000 + }, + keys = { + { + '<leader>?', + function() + require('which-key').show({ global = false }) + end, + desc = 'Buffer Local Keymaps', + }, + }, +} diff --git a/config/nvim/lua/plugins/zk.lua b/config/nvim/lua/plugins/zk.lua new file mode 100644 index 0000000..ce2e11a --- /dev/null +++ b/config/nvim/lua/plugins/zk.lua @@ -0,0 +1,26 @@ +return { + "zk-org/zk-nvim", + lazy = false, + config = function() + require("zk").setup({ + picker = "telescope", + lsp = { + config = { + name = "zk", + cmd = { "zk", "lsp" }, + filetypes = { "markdown" }, + }, + auto_attach = { + enabled = true, + }, + }, + }) + end, + keys = { + { "<leader>zz", "<cmd>ZkNotes<cr>", desc = "Notes" }, + { "<leader>zl", "<cmd>ZkLinks<cr>", desc = "Links" }, + { "<leader>zb", "<cmd>ZkBacklinks<cr>", desc = "Backlinks" }, + { "<leader>zi", "<cmd>ZkInsertLink<cr>", desc = "Insert Link" }, + { "<leader>zd", "<cmd>ZkCd<cr>", desc = "Enter Directory" }, + } +} diff --git a/config/nvim/lua/scripts/diagnostics.lua b/config/nvim/lua/scripts/diagnostics.lua new file mode 100644 index 0000000..0855af1 --- /dev/null +++ b/config/nvim/lua/scripts/diagnostics.lua @@ -0,0 +1,760 @@ +--[[ +*Fancy* diagnostics for `Neovim`. + +## Usage + +```lua +require("diagnostics").setup(); +``` + +You can then hit `D` to show diagnostics for the current line. + +## Highlight groups + +This script uses highlight groups provided by [highlights.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/highlights.lua). + +The used groups are, +- `FancyDiagnostic`, Default group for diagnostics. +- `FancyDiagnosticIcon`, Default group for the icons of diagnostics. +- `FancyDiagnosticInfo`, Group for `information` diagnostics. +- `FancyDiagnosticInfoIcon`, Group for the icons of `information` diagnostics. +- `FancyDiagnosticHint`, Group for `hint` diagnostics. +- `FancyDiagnosticHintIcon`, Group for the icons of `hint` diagnostics. +- `FancyDiagnosticWarn`, Group for `warning` diagnostics. +- `FancyDiagnosticWarnIcon`, Group for the icons of `warning` diagnostics. +- `FancyDiagnosticError`, Group for `error` diagnostics. +- `FancyDiagnosticErrorIcon`, Group for the icons of `error` diagnostics. + +## Dependencies + +- [beacon.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/beacon.lua), For highlighting cursor. +- [highlights.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/highlights.lua), For highlight groups. +- [types/diagnostics.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/types/diagnostics.lua), For type definition. + +## Configuration + +Use `setup()` for setting configuration. See [types/diagnostics.lua#diagnostics.config](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/types/diagnostics.lua#L3-L19) for the type definition. +]] +local diagnostics = {}; + +---@param level string +---@param icon string +---@return table +local function handle_diagnostic_level (level, icon) + ---|fS + + local default = string.format("FancyDiagnostic%s", "Default"); + local default_icon_hl = string.format("FancyDiagnostic%sIcon", "Default"); + + local bg = string.format("FancyDiagnostic%s", level); + local icon_hl = string.format("FancyDiagnostic%sIcon", level); + + return { + width = 3, + + line_hl_group = function (_, current) + return current and bg or default; + end, + icon = function (_, current) + return { + { "▌", current and icon_hl or default_icon_hl }, + { icon, current and icon_hl or default_icon_hl }, + { " ", current and bg or default }, + } + end, + padding = function (_, current) + return { + { "▌", current and icon_hl or default_icon_hl }, + { " ", current and icon_hl or default_icon_hl }, + { " ", current and bg or default }, + } + end + }; + + ---|fE +end + +---@class diagnostics.config +diagnostics.config = { + ---|fS + + keymap = "D", + + decoration_width = 4, + width = function (items) + local max = math.floor(vim.o.columns * 0.4); + local use = 1 + + for _, item in ipairs(items) do + local width = vim.fn.strdisplaywidth(item.message or ""); + + use = math.min( + math.max(width, 0), + max + ); + end + + return use; + end, + + max_height = function () + return math.floor(vim.o.lines * 0.4); + end, + + beacon = { + ---|fS + + default = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "@comment", link = false }).fg; + return fg and string.format("#%06x", fg) or "#9399b2"; + end, + to = function () + local bg = vim.api.nvim_get_hl(0, { name = vim.o.statusline and "Cursorline" or "Normal", link = false }).bg; + return bg and string.format("#%06x", bg) or "#1e1e2e"; + end, + + steps = 10, + interval = 100, + }, + + [vim.diagnostic.severity.INFO] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticInfoIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#94e2d5"; + end + }, + [vim.diagnostic.severity.HINT] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticHintIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#94e2d5"; + end + }, + [vim.diagnostic.severity.WARN] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticWarnIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#f9e2af"; + end + }, + [vim.diagnostic.severity.ERROR] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticErrorIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#f38ba8"; + end + }, + + ---|fE + }, + + decorations = { + ---|fS + + [vim.diagnostic.severity.INFO] = handle_diagnostic_level("Info", " "), + [vim.diagnostic.severity.HINT] = handle_diagnostic_level("Hint", " "), + [vim.diagnostic.severity.WARN] = handle_diagnostic_level("Warn", " "), + [vim.diagnostic.severity.ERROR] = handle_diagnostic_level("Error", " "), + + ---|fE + }, + + ---|fE +}; + +--[[ Evaluates `val`. ]] +---@param val any +---@param ... any +---@return any +local function eval(val, ...) + ---|fS + + if type(val) ~= "function" then + return val; + else + local can_call, new_val = pcall(val, ...); + + if can_call and new_val ~= nil then + return new_val; + end + end + + ---|fE +end + +--[[ Gets diagnostic item `decoration`. ]] +---@param level vim.diagnostic.Severity | "default" Diagnostic severity. +---@param ... any Extra arguments to be used for value evaluation. +---@return diagnostics.decorations__static decoration Static version of the diagnostic item's decoration. +local function get_decorations (level, ...) + ---|fS + + local output = {}; + + for k, v in pairs(diagnostics.config.decorations[level]) do + output[k] = eval(v, ...); + end + + return output; + + ---|fE +end + +--[[ Gets `beacon` configuration. ]] +---@param level? vim.diagnostic.Severity | "default" Diagnostic level. +---@param ... any Extra arguments to be used for value evaluation. +---@return table? +local function get_beacon_config (level, ...) + ---|fS + + if not level or not diagnostics.config.beacon then + return; + end + + local output = {}; + + for k, v in pairs(diagnostics.config.beacon[level]) do + output[k] = eval(v, ...); + end + + return output; + + ---|fE +end + +--[[ Turns given **virtual text** into **format string** for the statusline. ]] +---@param virt_text diagnostics.decoration_fragment[] Virtual text. +---@return string sign Virtual text as a sign(use in `statuscolumn`, `statusline`, `tabline` or `winbar`) +local function virt_text_to_sign (virt_text) + ---|fS + + local output = ""; + + for _, item in ipairs(virt_text) do + if type(item[2]) == "string" then + output = output .. string.format("%%#%s#%s", item[2], item[1]) .. "%#Normal#"; + else + output = output .. item[1]; + end + end + + return output; + + ---|fE +end + +------------------------------------------------------------------------------ + +---@type integer Decoration namespace. +diagnostics.ns = vim.api.nvim_create_namespace("fancy_diagnostics"); + +---@type integer, integer Diagnostics buffer & window. +diagnostics.buffer, diagnostics.window = nil, nil; + +--[[ Which *quadrant* the diagnostics window is currently using? ]] +---@type +---| "top_left" +---| "top_right" +---| "bottom_left" +---| "bottom_right" +---| "center" +diagnostics.quad = nil; + +---@type diagnostics.signs.entry[] +diagnostics.sign_data = {}; + +--[[ Prepares the buffer for the diagnostics window. ]] +diagnostics.__prepare = function () + ---|fS + + if not diagnostics.buffer or not vim.api.nvim_buf_is_valid(diagnostics.buffer) then + diagnostics.buffer = vim.api.nvim_create_buf(false, true); + end + + ---|fE +end + +--[[ Updates the *quadrant* which is being used by the diagnostics window. ]] +---@param quad +---| "top_left" +---| "top_right" +---| "bottom_left" +---| "bottom_right" +---| "center" +---@param state boolean +diagnostics.update_quad = function (quad, state) + ---|fS + + if not _G.__used_quads then + -- NIT: Should this set a default state value? + return; + end + + _G.__used_quads[quad] = state; + + ---|fE +end + +--[[ Returns `{opts}` for `nvim_open_win()` based on the parameters. ]] +---@param window integer Window ID. +---@param w integer Window width. +---@param h integer Window height. +---@return string | string[] border Window border. +---@return "editor" | "cursor" relative Relative position for floating window. +---@return "NE" | "NW" | "SE" | "SW" anchor Anchor position. +---@return integer row Window position in Y-axis. +---@return integer col Window position in X-axis. +diagnostics.__win_args = function (window, w, h) + ---|fS + + ---@type [ integer, integer ] + local cursor = vim.api.nvim_win_get_cursor(window); + ---@type table<string, integer> + local screenpos = vim.fn.screenpos(window, cursor[1], cursor[2]); + + local screen_width = vim.o.columns - 2; + local screen_height = vim.o.lines - vim.o.cmdheight - 2; + + local quad_pref = { "bottom_right", "top_right", "bottom_left", "top_left" }; + local quads = { + ---|fS + + center = { + relative = "editor", + anchor = "NW", + + row = math.ceil((vim.o.lines - h) / 2), + col = math.ceil((vim.o.columns - w) / 2), + border = "rounded" + }, + + top_left = { + condition = function () + if h >= screenpos.row then + -- Not enough space above. + return false; + elseif screenpos.curscol <= w then + -- Not enough space before. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "╭", "─", "╮", "│", "┤", "─", "╰", "│" }, + anchor = "SE", + row = 0, + col = 1 + }, + top_right = { + condition = function () + if h >= screenpos.row then + -- Not enough space above. + return false; + elseif screenpos.curscol + w > screen_width then + -- Not enough space after. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "╭", "─", "╮", "│", "╯", "─", "├", "│" }, + anchor = "SW", + row = 0, + col = 0 + }, + + bottom_left = { + condition = function () + if screenpos.row + h > screen_height then + -- Not enough space below. + return false; + elseif screenpos.curscol <= w then + -- Not enough space before. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "╭", "─", "┤", "│", "╯", "─", "╰", "│" }, + anchor = "NE", + row = 1, + col = 1 + }, + bottom_right = { + condition = function () + if screenpos.row + h > screen_height then + -- Not enough space below. + return false; + elseif screenpos.curscol + w > screen_width then + -- Nor enough space after. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "├", "─", "╮", "│", "╯", "─", "╰", "│" }, + anchor = "NW", + row = 1, + col = 0 + } + + ---|fE + }; + + for _, pref in ipairs(quad_pref) do + if _G.__used_quads and _G.__used_quads[pref] == true then + goto continue; + elseif not quads[pref] then + goto continue; + end + + local quad = quads[pref]; + local ran_cond, cond = pcall(quad.condition); + + if ran_cond and cond then + diagnostics.quad = pref; + return quad.border, quad.cursor, quad.anchor, quad.row, quad.col; + end + + ::continue:: + end + + diagnostics.quad = "center"; + + local fallback = quads.center; + return fallback.border, fallback.cursor, fallback.anchor, fallback.row, fallback.col; + + ---|fE +end + +------------------------------------------------------------------------------ + +--[[ Closes diagnostics window. ]] +diagnostics.close = function () + ---|fS + + if diagnostics.window and vim.api.nvim_win_is_valid(diagnostics.window) then + pcall(vim.api.nvim_win_close, diagnostics.window, true); + diagnostics.window = nil; + + if diagnostics.quad then + diagnostics.update_quad(diagnostics.quad, false); + diagnostics.quad = nil; + end + end + + ---|fE +end + +---@type beacon.instance Beacon instance to use for the Cursor. +diagnostics.__beacon = nil; + +--[[ External integrations. ]] +---@param window integer Window Id. +---@param beacon_config beacon.instance.config Configuration for `beacon`. +diagnostics.__integration = function (window, beacon_config) + ---|fS + + -- Markdown rendering. + if package.loaded["markview"] then + package.loaded["markview"].render(diagnostics.buffer, { + enable = true, + hybrid_mode = false + }, { + markdown_inline = { + inline_codes = { + virtual = true + } + } + }); + end + + -- Beacon. + if package.loaded["scripts.beacon"] then + if not diagnostics.__beacon then + diagnostics.__beacon = require("scripts.beacon").new(window, beacon_config); + else + diagnostics.__beacon:update(window, beacon_config); + end + + diagnostics.__beacon:start(); + end + + ---|fE +end + +--- Custom statuscolumn. +---@return string +_G.fancy_diagnostics_statuscolumn = function () + ---|fS + + if vim.tbl_isempty(diagnostics.sign_data) then + return ""; + end + + local lnum = vim.v.lnum; + + local data = diagnostics.sign_data[lnum]; + local start = data.start_row; + + if not data then + return ""; + elseif vim.v.virtnum == 0 and start == lnum then + return virt_text_to_sign(data.icon); + else + return virt_text_to_sign(data.padding or data.icon); + end + + ---|fE +end + +--- Hover function for diagnostics. +---@param window integer +diagnostics.hover = function (window) + ---|fS + + window = window or vim.api.nvim_get_current_win(); + + ---@type integer Source buffer. + local buffer = vim.api.nvim_win_get_buf(window); + ---@type [ integer, integer ] + local cursor = vim.api.nvim_win_get_cursor(window); + + local items = vim.diagnostic.get(buffer, { lnum = cursor[1] - 1 }); + + ---@type boolean Is the window already open? + local already_open = diagnostics.window and vim.api.nvim_win_is_valid(diagnostics.window); + + if #items == 0 then + -- No diagnostics available. + diagnostics.close(); + vim.api.nvim_echo({ + { " diagnostics.lua ", "DiagnosticVirtualTextWarn" }, + { ": ", "@comment" }, + { "No diagnostic under cursor", "@comment" }, + }, true, {}); + return; + elseif already_open then + vim.api.nvim_set_current_win(diagnostics.window); + return; + end + + if diagnostics.quad then + -- If the old window's quadrant wasn't freed, we free it here. + diagnostics.update_quad(diagnostics.quad, false) + end + + diagnostics.__prepare(); + vim.bo[diagnostics.buffer].ft = "markdown"; + + -- Clear old decorations. + vim.api.nvim_buf_clear_namespace(diagnostics.buffer, diagnostics.ns, 0, -1); + vim.api.nvim_buf_set_lines(diagnostics.buffer, 0, -1, false, {}); + + local W = eval(diagnostics.config.width, items); + local D = eval(diagnostics.config.decoration_width, items); + + ---@type table Configuration used for calculating window height. + local height_calc_config = { + relative = "editor", + + row = 0, col = 1, + width = W - D, height = 2, + + style = "minimal", + hide = true, + }; + + if not diagnostics.window or not vim.api.nvim_win_is_valid(diagnostics.window) then + diagnostics.window = vim.api.nvim_open_win(diagnostics.buffer, false, height_calc_config); + else + vim.api.nvim_win_set_config(diagnostics.window, height_calc_config); + end + + vim.wo[diagnostics.window].wrap = true; + vim.wo[diagnostics.window].linebreak = true; + vim.wo[diagnostics.window].breakindent = true; + + local diagnostic_lines = 0; + + ---@type integer Line where the cursor should be placed. + local cursor_y = 1; + local ranges = {}; + + local start_row = 1; + ---@type vim.diagnostic.Severity | nil + local level; + + diagnostics.sign_data = {}; + + for i, item in ipairs(items) do + ---|fS + + local from = i == 1 and 0 or -1; + local lines = vim.split(item.message, "\n", { trimempty = true }) + + local start = item.col; + local stop = item.end_col; + + local current = false; + + if cursor[2] >= start and cursor[2] <= stop then + cursor_y = i; + current = true; + end + + vim.api.nvim_buf_set_lines(diagnostics.buffer, from, -1, false, lines); + local decorations = get_decorations(item.severity, item, current); + + ranges[i] = { item.lnum, item.col }; + + vim.api.nvim_buf_set_extmark(diagnostics.buffer, diagnostics.ns, diagnostic_lines, 0, { + end_row = diagnostic_lines + #lines, + line_hl_group = decorations.line_hl_group, + }); + + diagnostic_lines = diagnostic_lines + #lines; + + if current == true and ( not level or item.severity < level ) then + level = item.severity; + end + + for _ = 1, #lines do + -- Signs + table.insert(diagnostics.sign_data, { + start_row = start_row, + + current = current, + width = decorations.width, + + icon = decorations.icon, + line_hl_group = decorations.line_hl_group, + padding = decorations.padding, + }); + end + + start_row = start_row + #lines; + + ---|fE + end + + local beacon_config = vim.tbl_extend("force", + get_beacon_config("default", {}, true), + get_beacon_config(level, {}, true) or {} + ); + + local H = vim.api.nvim_win_text_height(diagnostics.window, { start_row = 0, end_row = -1 }).all; + + local _, relative, anchor, row, col = diagnostics.__win_args(window, W, H); + + local win_config = { + relative = relative or "cursor", + + row = row or 0, col = col or 0, + width = W, height = H, + + anchor = anchor, + border = "none", + + style = "minimal", + hide = false, + }; + + vim.api.nvim_win_set_config(diagnostics.window, win_config); + vim.api.nvim_win_set_cursor(diagnostics.window, { cursor_y, 0 }); + + -- Update quadrant state. + diagnostics.update_quad(diagnostics.quad, true); + + -- Set necessary options. + vim.wo[diagnostics.window].signcolumn = "no"; + vim.wo[diagnostics.window].statuscolumn = "%!v:lua.fancy_diagnostics_statuscolumn()"; + + vim.wo[diagnostics.window].conceallevel = 3; + vim.wo[diagnostics.window].concealcursor = "ncv"; + + vim.wo[diagnostics.window].winhl = "FloatBorder:@comment,Normal:Normal"; + + diagnostics.__integration(window, beacon_config); + + ---|fS + + + vim.api.nvim_buf_set_keymap(diagnostics.buffer, "n", "<CR>", "", { + desc = "Go to diagnostic location", + callback = function () + ---|fS + + ---@type [ integer, integer ] Selected item. + local _cursor = vim.api.nvim_win_get_cursor(diagnostics.window); + ---@type [ integer, integer ]? Diagnostic location. + local location = ranges[_cursor[1]]; + + if location then + location[1] = location[1] + 1; + + vim.api.nvim_win_set_cursor(window, location); + vim.api.nvim_set_current_win(window); + + diagnostics.close(); + end + + ---|fE + end + }); + + vim.api.nvim_buf_set_keymap(diagnostics.buffer, "n", "q", "", { + desc = "Exit diagnostics window", + callback = function () + pcall(vim.api.nvim_set_current_win, window); + diagnostics.close(); + end + }); + + ---|fE + + ---|fE +end + +--- Configuration for the diagnostics module. +---@param config? diagnostics.config +diagnostics.setup = function (config) + ---|fS + + if type(config) == "table" then + diagnostics.config = vim.tbl_extend("force", diagnostics.config, config); + end + + if diagnostics.config.keymap then + vim.api.nvim_set_keymap("n", diagnostics.config.keymap, "", { + callback = diagnostics.hover + }); + end + + vim.api.nvim_create_autocmd({ + "CursorMoved", "CursorMovedI" + }, { + callback = function () + local win = vim.api.nvim_get_current_win(); + + if diagnostics.window and win ~= diagnostics.window then + diagnostics.close(); + + if diagnostics.quad then + diagnostics.update_quad(diagnostics.quad, false); + diagnostics.quad = nil; + end + end + end + }); + + ---|fE +end + +return diagnostics; diff --git a/config/nvim/lua/scripts/init.lua b/config/nvim/lua/scripts/init.lua new file mode 100644 index 0000000..0933bb0 --- /dev/null +++ b/config/nvim/lua/scripts/init.lua @@ -0,0 +1,4 @@ +require("scripts.diagnostics").setup({ + keymap = '<leader>le' + -- TODO: Find out how to which-key this +}) diff --git a/config/shell/alias b/config/shell/alias new file mode 100644 index 0000000..8c17329 --- /dev/null +++ b/config/shell/alias @@ -0,0 +1,10 @@ +alias rgf='rg --files | rg' +alias ls='eza --icons=auto' +alias md='mkdir' +alias cat='bat -pp' +alias man='batman' +alias diff='batdiff' +alias fzf="fzf --preview 'bat --style=numbers --color=always {}'" +alias vi="nvim" +alias vim="nvim" +alias em="emacs -nw" diff --git a/config/shell/functions b/config/shell/functions new file mode 100644 index 0000000..a300316 --- /dev/null +++ b/config/shell/functions @@ -0,0 +1,16 @@ +gvc() { + if [[ $1 == "clone" ]]; then + shift + git clone git@git.venomade.com:"$@" + else + ssh git@git.venomade.com "$@" + fi +} + +function y() { + local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd + command yazi "$@" --cwd-file="$tmp" + IFS= read -r -d '' cwd < "$tmp" + [ "$cwd" != "$PWD" ] && [ -d "$cwd" ] && builtin cd -- "$cwd" + rm -f -- "$tmp" +} diff --git a/config/shell/vars b/config/shell/vars new file mode 100644 index 0000000..b74f722 --- /dev/null +++ b/config/shell/vars @@ -0,0 +1,5 @@ +export EDITOR=nvim +export ZK_NOTEBOOK_DIR=$HOME/Documents/Notes +export XDG_CONFIG_HOME=$HOME/.config +export GOPATH=$HOME/.go +export LIMA_SHELL=/bin/zsh diff --git a/config/starship/config.toml b/config/starship/config.toml new file mode 100644 index 0000000..d9cd4d2 --- /dev/null +++ b/config/starship/config.toml @@ -0,0 +1,97 @@ +# Get editor completions based on the config schema +"$schema" = 'https://starship.rs/config-schema.json' + +# Inserts a blank line between shell prompts +add_newline = true + +format = """ +${custom.linux} +$nix_shell\ +$directory\ +$git_branch\ +$git_status\ +$git_commit\ +$status\ +$fill\ +$lua\ +$rust\ +$golang\ +$haskell\ +$jobs\ +$cmd_duration\ +$line_break\ +$character""" + +[custom.linux] +format = '[$symbol \[$output\]]($style) ' +symbol = ' ' +command = "cat /etc/os-release | grep '^ID=' | sed 's/ID=//' | sed 's/^./\\U&/'" +os = 'linux' +style = 'bold #f5e0dc' +when = true + +[nix_shell] +format = '[$symbol]($style) ' +symbol = ' ' +style = 'bold #74c7ec' + +[directory] +style = '#b2bbfb' +truncation_length = 2 + +[git_branch] +symbol = ' ' +format = '[$symbol$branch(:$remote_branch)]($style) ' +style = 'bold #eba0ac' +ignore_branches = ['master', 'main'] + +[git_status] +format = '([\[$all_status$ahead_behind\]]($style) )' +style = 'bold #89dceb' + +[git_commit] +format = '[\[#$hash$tag\]]($style) ' +style = 'bold #94e2d5' + +[status] +format = '[\[$status\]]($style)' +disabled = false + +[fill] +symbol = ' ' + +[lua] +format = '[$symbol($version )]($style)' +version_format = '$major.$minor' +symbol = ' ' +detect_files = ['.lua-version', '.luarc.json'] + +[rust] +format = '[$symbol($version )]($style)' +version_format = '$major.$minor' +symbol = ' ' +style = 'bold #fab387' + +[golang] +format = '[$symbol($version )]($style)' +version_format = '$major.$minor' +symbol = ' ' +style = 'bold #94e2d5' + +[haskell] +format = '[$symbol($ghc_version )]($style)' +symbol = ' ' +style = 'bold #cba6f7' + +[cmd_duration] +format = '[ $duration]($style) ' +style = 'bold #f9e2af' + +# Replace the '❯' symbol in the prompt with '➜' +[character] # The name of the module we are configuring is 'character' +success_symbol = '[](bold #a6e3a1)' +error_symbol = '[](bold #f38ba8)' + +# TODO +# - [direnv] + diff --git a/config/yazi/keymap.toml b/config/yazi/keymap.toml new file mode 100644 index 0000000..27da4fc --- /dev/null +++ b/config/yazi/keymap.toml @@ -0,0 +1,164 @@ +"$schema" = "https://yazi-rs.github.io/schemas/keymap.json" + +# Manager / File list layer +[[mgr.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[mgr.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + +[[mgr.prepend_keymap]] +on = [ "E" ] +run = "arrow -5" + +[[mgr.prepend_keymap]] +on = [ "N" ] +run = "arrow 5" + +[[mgr.prepend_keymap]] +on = [ "h" ] +run = "leave" + +[[mgr.prepend_keymap]] +on = [ "i" ] +run = "enter" + +[[mgr.prepend_keymap]] +on = [ "H" ] +run = "back" + +[[mgr.prepend_keymap]] +on = [ "I" ] +run = "forward" + +[[mgr.prepend_keymap]] +on = [ "<C-e>" ] +run = "seek -5" + +[[mgr.prepend_keymap]] +on = [ "<C-n>" ] +run = "seek 5" + +[[mgr.prepend_keymap]] +on = [ "k" ] +run = "link" + +[[mgr.prepend_keymap]] +on = [ "K" ] +run = "link --relative" + +[[mgr.prepend_keymap]] +on = [ "j" ] +run = "find_arrow" + +[[mgr.prepend_keymap]] +on = [ "J" ] +run = "find_arrow --previous" + + +# Tasks layer +[[tasks.prepend_keymap]] +on = [ "W" ] +run = "close" + +[[tasks.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[tasks.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + + +# Select layer (spot/picker remnants) +[[spot.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[spot.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + +[[spot.prepend_keymap]] +on = [ "E" ] +run = "arrow -5" + +[[spot.prepend_keymap]] +on = [ "N" ] +run = "arrow 5" + + +# Input layer +[[input.prepend_keymap]] +on = [ "l" ] +run = "insert" + +[[input.prepend_keymap]] +on = [ "<C-h>" ] +run = [ "move -999", "insert" ] + +[[input.prepend_keymap]] +on = [ "<C-i>" ] +run = [ "move 999", "insert --append" ] + +[[input.prepend_keymap]] +on = [ "h" ] +run = "move -1" + +[[input.prepend_keymap]] +on = [ "i" ] +run = "move 1" + +[[input.prepend_keymap]] +on = [ "=" ] +run = "forward --end-of-word" + +[[input.prepend_keymap]] +on = [ "H" ] +run = "move -999" + +[[input.prepend_keymap]] +on = [ "I" ] +run = "move 999" + +[[input.prepend_keymap]] +on = [ "x" ] +run = [ "delete", "move 1 --in-operating" ] + +[[input.prepend_keymap]] +on = [ "u" ] +run = "undo" + +[[input.prepend_keymap]] +on = [ "U" ] +run = "redo" + + +# Completion layer +[[cmp.prepend_keymap]] +on = [ "<C-e>" ] +run = "arrow -1" + +[[cmp.prepend_keymap]] +on = [ "<C-n>" ] +run = "arrow 1" + + +# Help layer +[[help.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[help.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + +[[help.prepend_keymap]] +on = [ "E" ] +run = "arrow -5" + +[[help.prepend_keymap]] +on = [ "N" ] +run = "arrow 5" diff --git a/config/yazi/modus_vivendi.tmTheme b/config/yazi/modus_vivendi.tmTheme new file mode 100644 index 0000000..15d2429 --- /dev/null +++ b/config/yazi/modus_vivendi.tmTheme @@ -0,0 +1,439 @@ +<!-- Modus Themes for Bat --> +<!-- Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/bat.lua --> + +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>name</key> + <string>modus_vivendi</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#989898</string> + <key>foreground</key> + <string>#ffffff</string> + <key>invisibles</key> + <string>#989898</string> + <key>lineHighlight</key> + <string>#2f3849</string> + <key>selection</key> + <string>#7030af</string> + <key>findHighlight</key> + <string>#7a6100</string> + <key>selectionBorder</key> + <string>#646464</string> + <key>gutterForeground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Ruby's @variable</string> + <key>scope</key> + <string>variable.other.readwrite.instance</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String interpolation</string> + <key>scope</key> + <string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#4f1119</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00381f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#363300</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#2fafff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>message.error</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#ff7f9f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Structure</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00c06f</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>09CE9B40-0137-442C-8512-7CEAFC78C153</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>Modus Vivendi</string> + </dict> +</plist> diff --git a/config/yazi/theme.toml b/config/yazi/theme.toml new file mode 100644 index 0000000..7e83248 --- /dev/null +++ b/config/yazi/theme.toml @@ -0,0 +1,135 @@ +# Modus Themes for Yazi +# Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/yazi.lua + +[manager] +# NOTE: can combined with tmTheme (sublime colorshceme file) for preview code highlight +highlight = "~/.config/yazi/modus_vivendi.tmTheme" + +cwd = { fg = "#00d3d0", italic = true } + +# Hovered +hovered = { bg = "#2f3849" } +preview_hovered = { bg = "#2f3849" } + +# Find +find_keyword = { fg = "#ffffff", bg = "#7030af", bold = true } +find_position = { fg = "#79a8ff", bg = "#1e1e1e", bold = true } + +# Marker +marker_copied = { fg = "#70b900", bg = "#70b900" } +marker_cut = { fg = "#ff5f59", bg = "#ff5f59" } +marker_marked = { fg = "#feacd0", bg = "#feacd0" } +marker_selected = { fg = "#2fafff", bg = "#2fafff" } + +# Tab +tab_active = { fg = "#000000", bg = "#2fafff" } +tab_inactive = { fg = "#989898", bg = "#000000" } +tab_width = 1 + +# Count +count_copied = { fg = "#000000", bg = "#70b900" } +count_cut = { fg = "#000000", bg = "#ff6b55" } +count_selected = { fg = "#000000", bg = "#79a8ff" } + +# Border +border_symbol = "│" +border_style = { fg = "#C4C4C4" } + +[status] +separator_open = "" +separator_close = "" +separator_style = { fg = "#0f0f0f", bg = "#0f0f0f" } + +# Mode +mode_normal = { fg = "#000000", bg = "#2fafff", bold = true } +mode_select = { fg = "#000000", bg = "#f78fe7", bold = true } +mode_unset = { fg = "#000000", bg = "#db7b5f", bold = true } + +# Progress +progress_label = { fg = "#989898", bold = true } +progress_normal = { fg = "#000000" } +progress_error = { fg = "#ff5f59" } + +# Permissions +permissions_t = { fg = "#2fafff" } +permissions_r = { fg = "#d0bc00" } +permissions_w = { fg = "#ff5f59" } +permissions_x = { fg = "#44bc44" } +permissions_s = { fg = "#989898" } + +[select] +border = { fg = "#C4C4C4" } +active = { fg = "#ffffff", bg = "#646464" } +inactive = { fg = "#ffffff" } + +# Input +[input] +border = { fg = "#00bcff" } +title = {} +value = { fg = "#f78fe7" } +selected = { bg = "#646464" } + +# Completion +[completion] +border = { fg = "#00bcff" } +active = { fg = "#ffffff", bg = "#646464" } +inactive = { fg = "#ffffff" } + +# Tasks +[tasks] +border = { fg = "#C4C4C4" } +title = {} +hovered = { fg = "#ffffff", bg="#646464" } + +# Which +[which] +cols = 3 +mask = { bg = "#0f0f0f" } +cand = { fg = "#00d3d0" } +rest = { fg = "#2fafff" } +desc = { fg = "#feacd0" } +separator = " " +separator_style = { fg = "#989898" } + +# Notify +[notify] +title_info = { fg = "#00bcff" } +title_warn = { fg = "#d0bc00" } +title_error = { fg = "#ff5f59" } + +# Help +[help] +on = { fg = "#44bc44" } +run = { fg = "#feacd0" } +hovered = { bg = "#646464" } +footer = { fg = "#ffffff", bg = "#0f0f0f" } + +[filetype] + +rules = [ + # Images + { mime = "image/*", fg = "#00d3d0" }, + + # Media + { mime = "{audio,video}/*", fg = "#fec43f" }, + + # Archives + { mime = "application/*zip", fg = "#feacd0" }, + { mime = "application/x-{tar,bzip*,7z-compressed,xz,rar}", fg = "#feacd0" }, + + # Documents + { mime = "application/{pdf,doc,rtf,vnd.*}", fg = "#00d3d0" }, + + # Empty files + # { mime = "inode/x-empty", fg = "#ff5f59" }, + + # Special files + { name = "*", is = "orphan", bg = "#ff5f59" }, + { name = "*", is = "exec" , fg = "#44bc44" }, + + { name = "*.rs", fg = "#db7b5f" }, + + # Fallback + { name = "*/", fg = "#2fafff" } +] + diff --git a/config/yazi/yazi.toml b/config/yazi/yazi.toml new file mode 100644 index 0000000..4f05c94 --- /dev/null +++ b/config/yazi/yazi.toml @@ -0,0 +1,7 @@ +[mgr] +sort_by = "mtime" +sort_reverse = true +show_hidden = true +linemode = "size" +scrolloff = 12 +ratio = [1,2,0] diff --git a/config/zk/config.toml b/config/zk/config.toml new file mode 100644 index 0000000..b9d3ca2 --- /dev/null +++ b/config/zk/config.toml @@ -0,0 +1,35 @@ +[notebook] +dir = "~/Documents/Notes" + +[note] +filename = "{{slug title}}" +template = "note.md" + +[extra] +author = "Venomade" + +[format.markdown] +link-format = "wiki" +hashtags = true +colon-tags = false +multiword-tags = true + +[tool] +editor = "nvim" +shell = "/bin/zsh" +fzf-preview = "bat -p --color always {-1}" + +[alias] +todo = "zk edit TODO" + +push = "git fetch && if [ \"$(git rev-parse @)\" = \"$(git rev-parse @{u})\" ]; then git add -A && git commit -m \"Update: $(date '+%Y-%m-%d %H:%M:%S')\" && git push; else echo \"Local branch is not up‑to‑date with the remote; aborting.\"; fi" +pull = "git pull" +history = "git log --pretty=format:\"%s\" | tail -10; echo" + +rm = "rm -i $@.md" + +[lsp] +[lsp.diagnostics] +wiki-title = "hint" +dead-link = "error" +missing-backlink = { level = "warning", position = "bottom" } diff --git a/config/zk/templates/note.md b/config/zk/templates/note.md new file mode 100644 index 0000000..be4c1d2 --- /dev/null +++ b/config/zk/templates/note.md @@ -0,0 +1,6 @@ +--- +title: {{title}} +tags: [] +--- + +{{content}} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..0d96965 --- /dev/null +++ b/flake.lock @@ -0,0 +1,48 @@ +{ + "nodes": { + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771102945, + "narHash": "sha256-e5NfW8NhC3qChR8bHVni/asrig/ZFzd1wzpq+cEE/tg=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "ff5e5d882c51f9a032479595cbab40fd04f56399", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1771008912, + "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a82ccc39b39b621151d6732718e3e250109076fa", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..93a558c --- /dev/null +++ b/flake.nix @@ -0,0 +1,31 @@ +{ + description = "Home Manager configuration of venomade"; + + inputs = { + # Specify the source of Home Manager and Nixpkgs. + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + { nixpkgs, home-manager, ... }: + let + system = "aarch64-darwin"; + pkgs = nixpkgs.legacyPackages.${system}; + in + { + homeConfigurations."venomade" = home-manager.lib.homeManagerConfiguration { + inherit pkgs; + + # Specify your home configuration modules here, for example, + # the path to your home.nix. + modules = [ ./home.nix ]; + + # Optionally use extraSpecialArgs + # to pass through arguments to home.nix + }; + }; +} diff --git a/home.nix b/home.nix new file mode 100644 index 0000000..49dd79a --- /dev/null +++ b/home.nix @@ -0,0 +1,66 @@ +{ config, lib, pkgs, ... }: + +let + emacsFlake = builtins.getFlake "github:nix-giant/nix-darwin-emacs/065050b9e06a30c01b41539b75464fff972fecd6"; +in +{ + home.username = "venomade"; + home.homeDirectory = "/Users/venomade"; + + home.packages = with pkgs; [ + + # Neovim + neovim + imagemagick + fzf + ripgrep + + # Emacs + (emacsFlake.packages.${system}.emacs-30) + + # Nix + nil + + # Lua + lua-language-server + lua5_4 + lua5_4.pkgs.luarocks + + # Personal + bat + eza + jellyfin-tui + lazygit + starship + yazi + zk + lima + + ]; + + programs.git = { + enable = true; + settings.user = { + name = "venomade"; + email = "venomade@venomade.com"; + }; + }; + + home.stateVersion = "25.11"; + + programs.home-manager.enable = true; + + home.file = + let + dir = "${config.home.homeDirectory}/.dotfiles/config"; + in + lib.mapAttrs + (name: _: { + target = ".config/${name}"; + source = config.lib.file.mkOutOfStoreSymlink "${dir}/${name}"; + recursive = true; + }) + (lib.filterAttrs + (name: type: type == "directory") + (builtins.readDir ./config)); +} |
