Compare commits

...

24 Commits

Author SHA1 Message Date
8322ef1997 Weird LFS bug 2025-11-06 18:59:02 +01:00
96416217ba [emacs] Clean lsp-inline-comment-mode integration
Cleanly integrate it with company and other.
2025-10-30 22:24:56 +01:00
f16574af53 Adds completion for some custom tools 2025-10-30 09:56:15 +01:00
0daf243692 Adds completion for some utilities 2025-10-30 08:59:49 +01:00
c6cf796f15 Adds a setting to spawn a new instance.
With stacking in my WM like cosmic, it is almost all I need. Goodbye gnome-terminal.
2025-10-30 00:05:56 +01:00
d1a7c54680 Adds alacritty support 2025-10-30 00:00:22 +01:00
65d7b932d4 Fixes electric indentation 2025-10-29 23:11:46 +01:00
4f7cf6bf36 [emacs] Fixes quelpa-use-package git repo path 2025-10-22 12:03:51 +02:00
62c33db5fa Adds stule for cosmic-terminal.
Not in script.
2025-10-17 21:50:19 +02:00
11bdeaedb3 Uses quelpa instead of straight.
I was getting tired of the message. Also just configure it for github remote.
2025-10-17 21:49:43 +02:00
3afb8761d4 Enables .c <-> .h projectile switch 2025-10-17 19:15:03 +02:00
993fa7eec3 Fixes fish version check 2025-10-17 19:14:45 +02:00
5f80da627b [emacs] add spdx 2025-04-11 13:14:03 +02:00
51a438c12a Updates to emacs 30.1 2025-02-26 11:40:46 +01:00
98d609d561 Updates to emacs 29.4 fresh install 2025-01-23 19:56:39 +01:00
d9d4ff91e3 Formats cmake file only if a project-wide configuration file is found
Otherwise do nothing.
2024-12-18 10:31:23 +01:00
4f4d5a4109 Better completion 2024-12-18 09:55:30 +01:00
a486930b32 Forces a newer version of fish from the PPA 2024-10-23 14:48:22 +02:00
4b6ff16d03 Uses opencl-c-mode instead of opencl-mode 2024-08-14 10:10:58 +02:00
d855e8dc9d Adds string-inflection 2024-08-13 14:49:00 +02:00
a0916297ce Polymode PIO 2024-06-22 08:43:35 +02:00
c0e142ff40 Adds pio-mode support through polymode 2024-04-16 11:33:49 +02:00
c94ff5b11c Corrects whitelisting of arm-none-eabi-(gcc|g++) 2024-04-11 11:53:05 +02:00
0d77b01922 Whitelist driver for arm-none-eabi 2024-04-11 11:43:00 +02:00
10 changed files with 290 additions and 147 deletions

58
.config/alacritty.toml Normal file
View File

@@ -0,0 +1,58 @@
[font]
size = 12.0
[font.bold]
family = "UbuntuMono Nerd Font Mono"
style = "Bold"
[font.bold_italic]
family = "UbuntuMono Nerd Font Mono"
style = "Bold Italic"
[font.normal]
family = "UbuntuMono Nerd Font Mono"
style = "Regular"
[font.italic]
family = "UbuntuMono Nerd Font Mono"
style = "Italic"
[colors.primary]
foreground = "#C5C8C6"
background = "#282A2E"
[colors.cursor]
text = '#1d1f21'
cursor='#F6F6F6'
[colors.normal]
black= "#282A2E"
red= "#CC6666"
green= "#B5BD68"
yellow= "#F0C674"
blue= "#81A2BE"
magenta= "#B294BB"
cyan= "#8ABEB7"
white= "#969896"
[colors.bright]
black= "#373B41"
red= "#FF9999"
green= "#E5ED98"
yellow= "#FFF6A4"
blue= "#B1D2EE"
magenta= "#E2C4EB"
cyan= "#BAEEE7"
white= "#C5C8C6"
[keyboard]
bindings = [
{ key = "T", mods = "Control|Shift", action = "SpawnNewInstance" }
]
[window]
decorations = "Full"
# Local Variables:
# vc-follow-symlinks: t
# End:

View File

@@ -0,0 +1 @@
complete -c arkedump -f -a "(GO_FLAGS_COMPLETION=1 arkedump (string split ' ' (commandline -cp)))"

View File

@@ -0,0 +1 @@
complete -c arkesend -f -a "(GO_FLAGS_COMPLETION=1 arkesend (string split ' ' (commandline -cp)))"

View File

@@ -0,0 +1 @@
complete -c leto-cli -f -a "(GO_FLAGS_COMPLETION=1 leto-cli (string split ' ' (commandline -cp)))"

View File

@@ -0,0 +1 @@
complete -c zeus-cli -f -a "(GO_FLAGS_COMPLETION=1 zeus-cli (string split ' ' (commandline -cp)))"

View File

@@ -1,6 +1,6 @@
# This file contains fish universal variable definitions. # This file contains fish universal variable definitions.
# VERSION: 3.0 # VERSION: 3.0
SETUVAR __fish_initialized:3100 SETUVAR __fish_initialized:3400
SETUVAR fish_color_autosuggestion:969896 SETUVAR fish_color_autosuggestion:969896
SETUVAR fish_color_cancel:\x2dr SETUVAR fish_color_cancel:\x2dr
SETUVAR fish_color_command:b294bb SETUVAR fish_color_command:b294bb

View File

@@ -7,8 +7,3 @@
tool = meld tool = meld
[init] [init]
defaultBranch = main defaultBranch = main
[filter "lfs"]
process = git-lfs filter-process
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f

300
.emacs
View File

@@ -12,7 +12,18 @@
'(c-basic-offset 4) '(c-basic-offset 4)
'(compilation-scroll-output 'first-error) '(compilation-scroll-output 'first-error)
'(custom-safe-themes '(custom-safe-themes
'("162201cf5b5899938cfaec99c8cb35a2f1bf0775fc9ccbf5e63130a1ea217213" "e3daa8f18440301f3e54f2093fe15f4fe951986a8628e98dcd781efbec7a46f2" "6622bb651e72d8ebd66454bd86db6c3990324243ff4325c1b6df252aba63b13e" "2f8eadc12bf60b581674a41ddc319a40ed373dd4a7c577933acaff15d2bf7cc6" "f458b92de1f6cf0bdda6bce23433877e94816c3364b821eb4ea9852112f5d7dc" "016f665c0dd5f76f8404124482a0b13a573d17e92ff4eb36a66b409f4d1da410" "13096a9a6e75c7330c1bc500f30a8f4407bd618431c94aeab55c9855731a95e1" "8b148cf8154d34917dfc794b5d0fe65f21e9155977a36a5985f89c09a9669aa0" "bf948e3f55a8cd1f420373410911d0a50be5a04a8886cabe8d8e471ad8fdba8e" "680f62b751481cc5b5b44aeab824e5683cf13792c006aeba1c25ce2d89826426" "631c52620e2953e744f2b56d102eae503017047fb43d65ce028e88ef5846ea3b" default)) '("162201cf5b5899938cfaec99c8cb35a2f1bf0775fc9ccbf5e63130a1ea217213"
"e3daa8f18440301f3e54f2093fe15f4fe951986a8628e98dcd781efbec7a46f2"
"6622bb651e72d8ebd66454bd86db6c3990324243ff4325c1b6df252aba63b13e"
"2f8eadc12bf60b581674a41ddc319a40ed373dd4a7c577933acaff15d2bf7cc6"
"f458b92de1f6cf0bdda6bce23433877e94816c3364b821eb4ea9852112f5d7dc"
"016f665c0dd5f76f8404124482a0b13a573d17e92ff4eb36a66b409f4d1da410"
"13096a9a6e75c7330c1bc500f30a8f4407bd618431c94aeab55c9855731a95e1"
"8b148cf8154d34917dfc794b5d0fe65f21e9155977a36a5985f89c09a9669aa0"
"bf948e3f55a8cd1f420373410911d0a50be5a04a8886cabe8d8e471ad8fdba8e"
"680f62b751481cc5b5b44aeab824e5683cf13792c006aeba1c25ce2d89826426"
"631c52620e2953e744f2b56d102eae503017047fb43d65ce028e88ef5846ea3b"
default))
'(display-time-24hr-format t) '(display-time-24hr-format t)
'(display-time-default-load-average nil) '(display-time-default-load-average nil)
'(doom-modeline-github t) '(doom-modeline-github t)
@@ -35,19 +46,19 @@
'(lisp-simple-loop-indentation 4) '(lisp-simple-loop-indentation 4)
'(lisp-tag-body-indentation 4) '(lisp-tag-body-indentation 4)
'(lisp-tag-indentation 4) '(lisp-tag-indentation 4)
'(lsp-copilot-enabled t)
'(lsp-inline-completion-idle-delay 99999999)
'(org-agenda-files '("~/org/1.TODO.org")) '(org-agenda-files '("~/org/1.TODO.org"))
'(package-enable-at-startup nil) '(package-enable-at-startup nil)
'(package-selected-packages '(package-selected-packages nil)
'(code-cells clang-format+ cmake-format xterm-color dockerfile-mode web-mode prettier json-mode py-isort blacken pyvenv yaml-mode lsp-pyright ng2-mode lsp-ltex lsp-treemacs treemacs-nerd-icons treemacs-projectile treemacs lsp-ui lsp-mode which-key flycheck vterm projectile yasnippet-snippets yasnippet aggressive-indent doom-themes company-go zenburn-theme langtool smart-tabs-mode typescript-mode protobuf-mode opencl-mode glsl-mode go-mode markdown-mode srefactor irony cmake-mode company magit use-package))
'(safe-local-variable-values '(safe-local-variable-values
'((vc-follow-symlinks . t) '((vc-follow-symlinks . t) (TeX-master . t) (TeX-parse-self . t)))
(TeX-master . t)
(TeX-parse-self . t)))
'(system-packages-noconfirm t) '(system-packages-noconfirm t)
'(tab-width 4) '(tab-width 4)
'(warning-suppress-log-types '((comp))) '(warning-suppress-log-types '((comp)))
'(whitespace-style '(whitespace-style
'(face trailing tabs lines-tail newline space-before-tab::tab space-before-tab::space space-before-tab tab-mark))) '(face trailing tabs lines-tail newline space-before-tab::tab
space-before-tab::space space-before-tab tab-mark)))
(if (display-graphic-p) (if (display-graphic-p)
(if (fboundp 'tool-bar-mode) (if (fboundp 'tool-bar-mode)
@@ -70,28 +81,28 @@
("gnu" . "https://elpa.gnu.org/packages/"))) ("gnu" . "https://elpa.gnu.org/packages/")))
(package-initialize) (package-initialize)
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name
"straight/repos/straight.el/bootstrap.el"
(or (bound-and-true-p straight-base-dir)
user-emacs-directory)))
(bootstrap-version 7))
(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))
(straight-use-package 'use-package)
(unless (package-installed-p 'quelpa)
(with-temp-buffer
(url-insert-file-contents "https://raw.githubusercontent.com/quelpa/quelpa/master/quelpa.el")
(eval-buffer)
(quelpa-self-upgrade)))
(setq quelpa-checkout-melpa-p nil)
(setq quelpa-use-package-inhibit-loading-quelpa t)
(quelpa
'(quelpa-use-package
:fetcher github
:repo "quelpa/quelpa-use-package"))
(require 'quelpa-use-package)
(require 'use-package-ensure) (require 'use-package-ensure)
(setq use-package-always-ensure t) (setq use-package-always-ensure t)
(use-package system-packages)
(use-package use-package-ensure-system-package) ;(use-package use-package-ensure-system-package)
;; required because vterm wants this before loading. ;; required because vterm wants this before loading.
@@ -151,6 +162,7 @@
(setq vertico-cycle t) (setq vertico-cycle t)
:config :config
(vertico-reverse-mode) (vertico-reverse-mode)
(keymap-set vertico-map "TAB" #'minibuffer-complete)
) )
;; Persist history over Emacs restarts. Vertico sorts by history position. ;; Persist history over Emacs restarts. Vertico sorts by history position.
@@ -165,9 +177,9 @@
;; Configure a custom style dispatcher (see the Consult wiki) ;; Configure a custom style dispatcher (see the Consult wiki)
;; (setq orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch) ;; (setq orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch)
;; orderless-component-separator #'orderless-escapable-split-on-space) ;; orderless-component-separator #'orderless-escapable-split-on-space)
(setq completion-styles '(orderless basic) (setq completion-styles '(partial-completion orderless basic)
completion-category-defaults nil ;;completion-category-defaults nil
completion-category-overrides '((file (styles partial-completion)))) completion-category-overrides '((file (styles basic partial-completion ))))
) )
;; Example configuration for Consult ;; Example configuration for Consult
@@ -348,12 +360,6 @@
) )
) )
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
(use-package xterm-color (use-package xterm-color
:config :config
@@ -366,49 +372,6 @@
) )
(use-package smart-tabs-mode
:config
(setq-default tab-width 4) ; or any other preferred value
(setq cua-auto-tabify-rectangles nil)
(smart-tabs-advice c-indent-line c-basic-offset)
(smart-tabs-advice c-indent-region c-basic-offset)
(smart-tabs-add-language-support cmake cmake-mode-hook
(
(cmake-indent . cmake-tab-width)
)
)
(smart-tabs-add-language-support protobuf protobuf-mode-hook
(
(c-indent-line . c-basic-offset)
(c-indent-region . c-basic-offset)
)
)
(smart-tabs-add-language-support glsl glsl-mode-hook
(
(c-indent-line . c-basic-offset)
(c-indent-region . c-basic-offset)
)
)
(smart-tabs-add-language-support opencl opencl-mode-hook
(
(c-indent-line . c-basic-offset)
(c-indent-region . c-basic-offset)
)
)
(smart-tabs-add-language-support elisp emacs-lisp-mode-hook
(
(lisp-indent-line . lisp-indent-offset)
(lisp-indent-region . lisp-indent-offset)
)
)
(smart-tabs-insinuate 'c 'c++ 'cmake 'nxml 'protobuf 'glsl 'elisp)
)
(use-package aggressive-indent (use-package aggressive-indent
:hook :hook
@@ -425,7 +388,24 @@
(magit-credential-cache-daemon-socket nil) (magit-credential-cache-daemon-socket nil)
) )
(use-package yasnippet
:delight yas-minor-mode
:bind ( :map yas-minor-mode-map
("TAB" . nil)
)
)
(use-package yasnippet-snippets
:after yasnippet
)
(use-package company (use-package company
:after yasnippet
:delight :delight
:bind ( ("M-TAB" . company-complete) ) :bind ( ("M-TAB" . company-complete) )
:init :init
@@ -453,9 +433,9 @@
(use-package cmake-mode (use-package cmake-mode
:ensure-system-package ( :ensure-system-package (
(cmake . cmake) (cmake . cmake)
(pip . python3-pip) (pipx . pipx)
(cmake-format . "pip install --user cmakelang[YAML]") (cmake-format . "pipx install cmakelang[YAML]")
(cmake-language-server . "pip install --user cmake-language-server") (cmake-language-server . "pipx install cmake-language-server")
) )
:config :config
(setq cmake-tab-width 4) (setq cmake-tab-width 4)
@@ -472,33 +452,41 @@
(defun atu/cmake-format-buffer () (defun atu/cmake-format-buffer ()
"Formats the current buffer using cmake-format" "Formats the current buffer using cmake-format"
(interactive) (interactive)
(let ((error-buffer (atu/create-or-erase-buffer "*cmake-format:stderr*"))) (let (
(error-buffer (atu/create-or-erase-buffer "*cmake-format:stderr*"))
(cmake-format-config-file-exists
(file-exists-p (projectile-expand-root ".cmake-format.yaml"))
)
)
(setq-local atu/after-save-message nil) (setq-local atu/after-save-message nil)
(if (eq 0 (call-process-region (if cmake-format-config-file-exists
;;region (if (eq 0 (call-process-region
(point-min) ;;region
(point-max) (point-min)
"cmake-format" (point-max)
nil ;do not delete buffer "cmake-format"
;; discard stdout copy stderr to buffer nil ;do not delete buffer
error-buffer ;; discard stdout copy stderr to buffer
nil ;dont-redisplay buffer error-buffer
"-" nil ;dont-redisplay buffer
)) "-"
(let ((current-point (point))) ))
(call-process-region (let ((current-point (point)))
(point-min) (point-max) (call-process-region
"cmake-format" (point-min) (point-max)
t t t; replace current buffer and redisplay it "cmake-format"
"-" t t t; replace current buffer and redisplay it
"--log-level=error" "-"
)
(goto-char (+ (point-min) current-point))
nil
) )
(goto-char (+ (point-min) current-point)) (message
nil "cmake-format: could not format %s see buffer %s for details"
(buffer-name) error-buffer)
(current-message)
) )
(message (message "cmake-format: skipping as no configuration file found")
"cmake-format: could not format %s see buffer %s for details"
(buffer-name) error-buffer)
(current-message)
) )
) )
) )
@@ -527,9 +515,13 @@
:ensure nil :ensure nil
:ensure-system-package :ensure-system-package
(clangd . clangd) (clangd . clangd)
:config
(setq lsp-clients-clangd-args
'("--header-insertion-decorators=0" "--query-driver=/**/arm-none-eabi-*" "--log=verbose"))
:hook :hook
(c-mode . lsp-deferred) (c-mode . lsp-deferred)
(c++-mode . lsp-deferred) (c++-mode . lsp-deferred)
(c++-mode . (lambda () (setq-local lsp-enable-on-type-formatting nil)))
) )
(use-package clang-format+ (use-package clang-format+
@@ -539,29 +531,31 @@
(c-mode-common . clang-format+-mode) (c-mode-common . clang-format+-mode)
) )
(use-package yasnippet (use-package string-inflection
:delight yas-minor-mode :bind
("C-c u" . string-inflection-all-cycle)
)
(use-package polymode
:config :config
:bind ( :map yas-minor-mode-map (define-hostmode poly-pio-hostmode
("TAB" . nil) :mode 'asm-mode)
)
(define-auto-innermode poly-pio-c-innermode
:mode 'c-mode
:head-matcher "^%c-sdk{$"
:tail-matcher "^%}$"
:head-mode 'host
:tail-mode 'host)
(define-polymode poly-pio-mode
:hostmode 'poly-pio-hostmode
:innermodes '(poly-pio-c-innermode))
(add-to-list 'auto-mode-alist '("\\.pio$" . poly-pio-mode))
) )
(use-package yasnippet-snippets
:after yasnippet
)
(use-package yasnippet-licenses
:straight (yasnippet-licenses
:type git
:host github
:repo "atuleu/yasnippet-licenses"
:files (:defaults "*.el" "snippets")
)
:after yasnippet
)
(use-package projectile (use-package projectile
:bind ( :map projectile-mode-map :bind ( :map projectile-mode-map
( "C-c p" . 'projectile-command-map) ( "C-c p" . 'projectile-command-map)
@@ -620,6 +614,7 @@
(concat "-imp." ext) (concat "-imp." ext)
(concat "-impl." ext) (concat "-impl." ext)
".cpp" ".cpp"
".c"
))) )))
) )
(when (member ext '("c" "cc" "cpp")) (when (member ext '("c" "cc" "cpp"))
@@ -645,6 +640,27 @@
) )
) )
;; (use-package polymode
;; :config
;; (define-hostmode poly-pio-hostmode
;; :mode 'asm-mode)
;; (define-innermode poly-pio-c-innermode
;; :mode 'c-mode
;; :head-matcher "^% c-sdk {$"
;; :tail-matcher "^%}$"
;; :head-mode 'host
;; :tail-mode 'host)
;; (define-polymode poly-pio-mode
;; :hostmode 'poly-pio-hostmode
;; :innermodes '(poly-pio-c-innermode))
;; (add-to-list 'auto-mode-alist '("\\.pio$" . poly-pio-mode))
;; )
(use-package vterm) (use-package vterm)
(use-package flycheck (use-package flycheck
@@ -689,19 +705,22 @@
(setq lsp-ui-doc-use-webkit t) (setq lsp-ui-doc-use-webkit t)
) )
(add-to-list 'lsp-language-id-configuration '("\\.postcss\\'" . "css")) (add-to-list 'lsp-language-id-configuration '("\\.postcss\\'" . "css"))
(advice-add 'lsp :before (defun atu/lsp-inline-completion-display-toggle-key ()
(lambda (&rest _args) "Add or remove `i` key from the lsp-command-map` depending on `lsp-inline-completion-mode`"
(eval '(setf (lsp-session-server-id->folders (lsp-session)) (ht) (if lsp-inline-completion-mode
) (define-key lsp-command-map (kbd "i") #'lsp-inline-completion-display)
) (define-key lsp-command-map (kbd "i") nil)))
)
(with-eval-after-load 'lsp-inline-completion
(define-key lsp-inline-completion-active-map (kbd "C-j") #'lsp-inline-completion-accept)
) )
(setq lsp-completion-provider :none) :bind (("C-c C-d" . lsp-ui-doc-toggle))
:bind (
("C-c C-d" . lsp-ui-doc-toggle) :hook (
) (lsp-mode . lsp-enable-which-key-integration)
:hook (lsp-inline-completion-mode . lsp-inline-completion-company-integration-mode)
(lsp-mode . lsp-enable-which-key-integration) (lsp-inline-completion-mode . atu/lsp-inline-completion-display-toggle-key)
)
:commands :commands
(lsp lsp-deferred) (lsp lsp-deferred)
) )
@@ -950,7 +969,7 @@
) )
(use-package glsl-mode) (use-package glsl-mode)
(use-package opencl-mode) (use-package opencl-c-mode)
(use-package protobuf-mode (use-package protobuf-mode
:mode "\\.proto\\'" :mode "\\.proto\\'"
@@ -1002,6 +1021,15 @@
) )
(use-package spdx
:quelpa (spdx :fetcher github :repo "condy0919/spdx.el")
:bind (:map prog-mode-map
("C-c i l" . spdx-insert-spdx))
:custom
(spdx-copyright-holder 'auto)
(spdx-project-detection 'auto))
;; Local Variables: ;; Local Variables:
;; vc-follow-symlinks: t ;; vc-follow-symlinks: t

View File

@@ -0,0 +1,37 @@
(
name: "Tomorrow Night - Tweeked",
foreground: "#C5C8C6",
background: "#282A2E",
cursor: "#F6F6F6",
dim_foreground: "#282A2E",
normal: (
black: "#282A2E",
red: "#CC6666",
green: "#B5BD68",
yellow: "#F0C674",
blue: "#81A2BE",
magenta: "#B294BB",
cyan: "#8ABEB7",
white: "#969896",
),
bright: (
black: "#373B41",
red: "#FF9999",
green: "#E5ED98",
yellow: "#FFF6A4",
blue: "#B1D2EE",
magenta: "#E2C4EB",
cyan: "#BAEEE7",
white: "#C5C8C6",
),
dim: (
black: "#1f1d21",
red: "#BB5555",
green: "#A4AC57",
yellow: "#DFB563",
blue: "#7091AD",
magenta: "#A183AA",
cyan: "#79ADA6",
white: "#858785",
),
)

View File

@@ -102,7 +102,8 @@ files=".config/fish \
.config/starship.toml \ .config/starship.toml \
.local/share/omf \ .local/share/omf \
.emacs \ .emacs \
.tmux.conf.local" .tmux.conf.local \
.config/alacritty.toml"
@@ -151,10 +152,30 @@ function load_gnome_terminal_profiles() {
function install_fish() { function install_fish() {
echo "--- Ensuring fish is current shell" echo "--- Ensuring fish is current shell"
if ! which fish 1>/dev/null local fish_good=0
then if ! which fish 1>/dev/null
echo "+++ Installing fish" then
run sudo apt-get install -y fish fish_good=1
fi
local current_version=$(fish --version | cut -d " " -f 3)
local current_version_test=$(cat <<EOF
${current_version}
3.4.0
EOF
)
if [ $(echo "${current_version_test}" | sort -n | head -1) != "3.4.0" ]
then
echo "Wrong version of fish ${current_version}"
fish_good=1
fi
if [ $fish_good -eq 1 ]
then
echo "+++ Installing fish from PPA"
run sudo add-apt-repository -y ppa:fish-shell/release-3
run sudo apt update
run sudo apt install -y fish
else else
echo "+++ Fish is installed" echo "+++ Fish is installed"
fi fi