bunch of stuff
This commit is contained in:
+150
-41
@@ -75,15 +75,7 @@
|
|||||||
|
|
||||||
(use-package helpful
|
(use-package helpful
|
||||||
:straight t
|
:straight t
|
||||||
:commands (helpful-callable helpful-variable helpful-command helpful-key)
|
:commands (helpful-callable helpful-variable helpful-command helpful-key))
|
||||||
:custom
|
|
||||||
(counsel-describe-function-function #'helpful-callable)
|
|
||||||
(counsel-describe-variable-function #'helpful-variable)
|
|
||||||
:bind
|
|
||||||
([remap describe-function] . counsel-describe-function)
|
|
||||||
([remap describe-command] . helpful-command)
|
|
||||||
([remap describe-variable] . counsel-describe-variable)
|
|
||||||
([remap describe-key] . helpful-key))
|
|
||||||
|
|
||||||
(use-package super-save
|
(use-package super-save
|
||||||
:straight t
|
:straight t
|
||||||
@@ -127,7 +119,7 @@
|
|||||||
|
|
||||||
(global-set-key (kbd "<escape>") 'keyboard-escape-quit) ;; Escape exits out of prompts
|
(global-set-key (kbd "<escape>") 'keyboard-escape-quit) ;; Escape exits out of prompts
|
||||||
|
|
||||||
;; Define Leader Key
|
;; Define Leader Key
|
||||||
(use-package general
|
(use-package general
|
||||||
:straight t
|
:straight t
|
||||||
:config
|
:config
|
||||||
@@ -136,9 +128,9 @@
|
|||||||
:keymaps '(normal insert visual emacs)
|
:keymaps '(normal insert visual emacs)
|
||||||
:prefix "SPC"
|
:prefix "SPC"
|
||||||
:global-prefix "C-SPC")
|
:global-prefix "C-SPC")
|
||||||
;; Define Keybindings (potentially move into own file)
|
;; Define Keybindings (potentially move into own file)
|
||||||
(opal/leader-keys
|
(opal/leader-keys
|
||||||
;; Leader-map
|
;; Leader-map
|
||||||
";" #'pp-eval-expression ;; Eval expression
|
";" #'pp-eval-expression ;; Eval expression
|
||||||
":" #'execute-extended-command ;; Eq to M-x
|
":" #'execute-extended-command ;; Eq to M-x
|
||||||
"u" #'universal-argument ;; Universal argument
|
"u" #'universal-argument ;; Universal argument
|
||||||
@@ -152,21 +144,25 @@
|
|||||||
"gg" #'magit-status
|
"gg" #'magit-status
|
||||||
"gi" #'magit-init
|
"gi" #'magit-init
|
||||||
"gc" #'magit-clone
|
"gc" #'magit-clone
|
||||||
|
|
||||||
;; Buffers
|
;; Workspaces
|
||||||
"bd" #'kill-buffer
|
"bi" #'persp-ibuffer
|
||||||
|
"bl" #'persp-next
|
||||||
|
"bh" #'persp-prev
|
||||||
|
"br" #'persp-rename
|
||||||
|
"bd" #'persp-remove-buffer
|
||||||
|
|
||||||
;; Terminal/Shell
|
;; Terminal/Shell
|
||||||
"tt" #'vterm
|
"tt" #'vterm
|
||||||
"te" #'eshell
|
"te" #'eshell
|
||||||
|
|
||||||
;; Org
|
;; Org
|
||||||
; Babel
|
;; Babel
|
||||||
"obt" #'org-babel-tangle
|
"obt" #'org-babel-tangle
|
||||||
; Gen
|
;; Gen
|
||||||
"ol" #'org-insert-link
|
"ol" #'org-insert-link
|
||||||
"or" #'org-reload
|
"or" #'org-reload
|
||||||
; Agenda
|
;; Agenda
|
||||||
"oa" #'org-agenda
|
"oa" #'org-agenda
|
||||||
|
|
||||||
;; Eval
|
;; Eval
|
||||||
@@ -284,11 +280,53 @@
|
|||||||
:init
|
:init
|
||||||
(marginalia-mode))
|
(marginalia-mode))
|
||||||
|
|
||||||
|
(use-package company
|
||||||
|
:straight t
|
||||||
|
:commands (company-complete-common
|
||||||
|
company-complete-common-or-cycle
|
||||||
|
company-manual-begin
|
||||||
|
company-grab-line)
|
||||||
|
:init
|
||||||
|
(setq company-minimum-prefix-length 2
|
||||||
|
company-tooltip-limit 14
|
||||||
|
company-tooltip-align-annotations t
|
||||||
|
company-require-match 'never
|
||||||
|
company-global-modes
|
||||||
|
'(not erc-mode
|
||||||
|
message-mode
|
||||||
|
help-mode
|
||||||
|
vterm-mode)
|
||||||
|
company-frontends
|
||||||
|
'(company-pseudo-tooltip-frontend ; always show candidates in overlay tooltip
|
||||||
|
company-echo-metadata-frontend) ; show selected candidate docs in echo area
|
||||||
|
company-backends '(company-capf)
|
||||||
|
company-auto-commit nil
|
||||||
|
company-dabbrev-other-buffers nil
|
||||||
|
company-dabbrev-ignore-case nil
|
||||||
|
company-dabbrev-downcase nil))
|
||||||
|
|
||||||
|
(use-package perspective
|
||||||
|
:straight t
|
||||||
|
:config
|
||||||
|
(persp-mode))
|
||||||
|
|
||||||
(use-package bufler :straight t)
|
(use-package bufler :straight t)
|
||||||
|
|
||||||
(use-package winner
|
(use-package winner
|
||||||
:straight t)
|
:straight t)
|
||||||
|
|
||||||
|
(use-package dired
|
||||||
|
:init
|
||||||
|
(setq dired-auto-revert-buffer t
|
||||||
|
dired-dwim-target t
|
||||||
|
dired-hide-details-hide-symlink-targets nil
|
||||||
|
dired-recursive-copies 'always
|
||||||
|
dired-recursive-deletes 'top
|
||||||
|
dired-create-destination-dirs 'ask))
|
||||||
|
|
||||||
|
(use-package dired-rsync
|
||||||
|
:straight t
|
||||||
|
:general (dired-mode-map "C-c C-r" #'dired-rsync))
|
||||||
(use-package all-the-icons-dired :straight t)
|
(use-package all-the-icons-dired :straight t)
|
||||||
(use-package dired-single :straight t)
|
(use-package dired-single :straight t)
|
||||||
(use-package dired-collapse :straight t)
|
(use-package dired-collapse :straight t)
|
||||||
@@ -319,16 +357,6 @@
|
|||||||
(dired-rainbow-define vc "#0074d9" ("git" "gitignore" "gitattributes" "gitmodules"))
|
(dired-rainbow-define vc "#0074d9" ("git" "gitignore" "gitattributes" "gitmodules"))
|
||||||
(dired-rainbow-define-chmod executable-unix "#38c172" "-.*x.*"))
|
(dired-rainbow-define-chmod executable-unix "#38c172" "-.*x.*"))
|
||||||
|
|
||||||
;; Set org agenda dir
|
|
||||||
(setq org-directory "~/Org/")
|
|
||||||
|
|
||||||
;; Tell Org to stop indenting inside of org source blocks.
|
|
||||||
(setq org-edit-src-content-indentation 0)
|
|
||||||
|
|
||||||
;; Open links in browser
|
|
||||||
(setq browse-url-browser-function 'browse-url-generic
|
|
||||||
browse-url-generic-program "firefox")
|
|
||||||
|
|
||||||
(defun opal/org-font-setup ()
|
(defun opal/org-font-setup ()
|
||||||
;; Replace list hyphen with dot
|
;; Replace list hyphen with dot
|
||||||
(font-lock-add-keywords 'org-mode
|
(font-lock-add-keywords 'org-mode
|
||||||
@@ -439,6 +467,16 @@
|
|||||||
("pp" "Project File" entry (file+olp "~/org/projects/auto-infra-overview.org" "Inbox")
|
("pp" "Project File" entry (file+olp "~/org/projects/auto-infra-overview.org" "Inbox")
|
||||||
"* TODO %?\n %U\n %a\n %i" :empty-lines 1)))
|
"* TODO %?\n %U\n %a\n %i" :empty-lines 1)))
|
||||||
|
|
||||||
|
;; Tell Org to stop indenting inside of org source blocks.
|
||||||
|
(setq org-edit-src-content-indentation 0)
|
||||||
|
|
||||||
|
;; Set org agenda dir
|
||||||
|
(setq org-directory "~/Org/")
|
||||||
|
|
||||||
|
;; Open links in browser
|
||||||
|
(setq browse-url-browser-function 'browse-url-generic
|
||||||
|
browse-url-generic-program "firefox")
|
||||||
|
|
||||||
;; Init org font setup
|
;; Init org font setup
|
||||||
(opal/org-font-setup))
|
(opal/org-font-setup))
|
||||||
|
|
||||||
@@ -449,6 +487,8 @@
|
|||||||
:custom
|
:custom
|
||||||
(org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●")))
|
(org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●")))
|
||||||
|
|
||||||
|
(use-package org-make-toc :straight t)
|
||||||
|
|
||||||
(defun opal/org-mode-visual-fill ()
|
(defun opal/org-mode-visual-fill ()
|
||||||
(setq visual-fill-column-width 100
|
(setq visual-fill-column-width 100
|
||||||
visual-fill-column-center-text t)
|
visual-fill-column-center-text t)
|
||||||
@@ -462,7 +502,8 @@
|
|||||||
(with-eval-after-load 'org
|
(with-eval-after-load 'org
|
||||||
(org-babel-do-load-languages
|
(org-babel-do-load-languages
|
||||||
'org-babel-load-languages
|
'org-babel-load-languages
|
||||||
'((emacs-lisp . t)))
|
'((emacs-lisp . t)
|
||||||
|
(lisp . t)))
|
||||||
|
|
||||||
(push '("conf-unix" . conf-unix) org-src-lang-modes))
|
(push '("conf-unix" . conf-unix) org-src-lang-modes))
|
||||||
|
|
||||||
@@ -474,12 +515,7 @@
|
|||||||
|
|
||||||
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
|
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
|
||||||
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
|
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
|
||||||
(add-to-list 'org-structure-template-alist '("py" . "src python"))
|
|
||||||
(add-to-list 'org-structure-template-alist '("yml" . "src yaml"))
|
|
||||||
(add-to-list 'org-structure-template-alist '("scm" . "src scheme"))
|
(add-to-list 'org-structure-template-alist '("scm" . "src scheme"))
|
||||||
(add-to-list 'org-structure-template-alist '("js" . "src javascript"))
|
|
||||||
(add-to-list 'org-structure-template-alist '("html" . "src html"))
|
|
||||||
(add-to-list 'org-structure-template-alist '("css" . "src css"))
|
|
||||||
(add-to-list 'org-structure-template-alist '("cl" . "src lisp")))
|
(add-to-list 'org-structure-template-alist '("cl" . "src lisp")))
|
||||||
|
|
||||||
(use-package flycheck :straight t)
|
(use-package flycheck :straight t)
|
||||||
@@ -509,6 +545,7 @@
|
|||||||
evil))
|
evil))
|
||||||
(add-hook 'prog-mode-hook #'parinfer-mode)))
|
(add-hook 'prog-mode-hook #'parinfer-mode)))
|
||||||
|
|
||||||
|
(defvar inferior-lisp-program "sbcl")
|
||||||
(use-package sly :straight t)
|
(use-package sly :straight t)
|
||||||
|
|
||||||
(use-package magit
|
(use-package magit
|
||||||
@@ -517,7 +554,6 @@
|
|||||||
(use-package eshell-git-prompt :straight t)
|
(use-package eshell-git-prompt :straight t)
|
||||||
|
|
||||||
(use-package eshell
|
(use-package eshell
|
||||||
:hook (eshell-first-time-mode . eshell-config)
|
|
||||||
:config
|
:config
|
||||||
;; Save command history when commands are entered
|
;; Save command history when commands are entered
|
||||||
(add-hook 'eshell-pre-command-hook 'eshell-save-some-history)
|
(add-hook 'eshell-pre-command-hook 'eshell-save-some-history)
|
||||||
@@ -529,16 +565,28 @@
|
|||||||
(evil-define-key '(normal insert visual) eshell-mode-map (kbd "<home>") 'eshell-bol)
|
(evil-define-key '(normal insert visual) eshell-mode-map (kbd "<home>") 'eshell-bol)
|
||||||
(evil-normalize-keymaps)
|
(evil-normalize-keymaps)
|
||||||
|
|
||||||
(setq eshell-history-size 10000
|
|
||||||
eshell-buffer-maximum-lines 10000
|
|
||||||
eshell-hist-ignoredups t
|
|
||||||
eshell-scroll-to-bottom-on-input t)
|
|
||||||
|
|
||||||
(with-eval-after-load 'esh-opt
|
(with-eval-after-load 'esh-opt
|
||||||
(setq eshell-destroy-buffer-when-process-dies t)
|
(setq eshell-destroy-buffer-when-process-dies t)
|
||||||
(setq eshell-visual-commands '("htop" "zsh" "vim")))
|
(setq eshell-visual-commands '("htop" "zsh" "vim")))
|
||||||
|
|
||||||
(eshell-git-prompt-use-theme 'powerline))
|
(eshell-git-prompt-use-theme 'powerline)
|
||||||
|
|
||||||
|
(setq eshell-banner-message
|
||||||
|
'(format "%s %s\n"
|
||||||
|
(propertize (format " %s " (string-trim (buffer-name)))
|
||||||
|
'face 'mode-line-highlight)
|
||||||
|
(propertize (current-time-string)
|
||||||
|
'face 'font-lock-keyword-face))
|
||||||
|
eshell-scroll-to-bottom-on-input 'all
|
||||||
|
eshell-scroll-to-bottom-on-output 'all
|
||||||
|
eshell-kill-processes-on-exit t
|
||||||
|
eshell-hist-ignoredups t
|
||||||
|
;; em-prompt
|
||||||
|
eshell-prompt-regexp "^.* λ "
|
||||||
|
;; em-glob
|
||||||
|
eshell-history-size 10000
|
||||||
|
eshell-buffer-maximum-lines 10000
|
||||||
|
eshell-scroll-to-bottom-on-input t))
|
||||||
|
|
||||||
(use-package vterm
|
(use-package vterm
|
||||||
:straight t
|
:straight t
|
||||||
@@ -601,3 +649,64 @@
|
|||||||
;; erc-interpret-mirc-color t
|
;; erc-interpret-mirc-color t
|
||||||
;; erc-rename-buffers t
|
;; erc-rename-buffers t
|
||||||
;; erc-track-exclude-server-buffer t))
|
;; erc-track-exclude-server-buffer t))
|
||||||
|
|
||||||
|
;; (defun efs/exwm-update-class ()
|
||||||
|
;; (exwm-workspace-rename-buffer exwm-class-name))
|
||||||
|
|
||||||
|
;; (use-package exwm
|
||||||
|
;; :config
|
||||||
|
;; (setq exwm-workspace-number 5)
|
||||||
|
|
||||||
|
;; ;; These keys will pass through to Emacs
|
||||||
|
;; (setq exwm-input-prefix-keys
|
||||||
|
;; '(?\C-x
|
||||||
|
;; ?\C-u
|
||||||
|
;; ?\C-h
|
||||||
|
;; ?\M-x
|
||||||
|
;; ?\M-`
|
||||||
|
;; ?\M-&
|
||||||
|
;; ?\M-:
|
||||||
|
;; ?\C-\M-j ;; Buffer list
|
||||||
|
;; ?\C-\ )) ;; Ctrl+Space
|
||||||
|
|
||||||
|
;; ;; This will allow the next key to be sent directly
|
||||||
|
;; (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key)
|
||||||
|
|
||||||
|
;; ;; Set up global key bindings. These always work, no matter the input state!
|
||||||
|
;; ;; Keep in mind that changing this list after EXWM initializes has no effect.
|
||||||
|
;; (setq exwm-input-global-keys
|
||||||
|
;; `(
|
||||||
|
;; ;; Reset to line-mode (C-c C-k switches to char-mode via exwm-input-release-keyboard)
|
||||||
|
;; ([?\s-r] . exwm-reset)
|
||||||
|
|
||||||
|
;; ;; Move between windows
|
||||||
|
;; ([s-h] . windmove-left)
|
||||||
|
;; ([s-l] . windmove-right)
|
||||||
|
;; ([s-k] . windmove-up)
|
||||||
|
;; ([s-j] . windmove-down)
|
||||||
|
|
||||||
|
;; ;; Launch applications via shell command
|
||||||
|
;; ([?\s-&] . (lambda (command)
|
||||||
|
;; (interactive (list (read-shell-command "$ ")))
|
||||||
|
;; (start-process-shell-command command nil command)))
|
||||||
|
|
||||||
|
;; ;; Switch workspace
|
||||||
|
;; ([?\s-w] . exwm-workspace-switch)
|
||||||
|
|
||||||
|
;; ;; 's-N': Switch to certain workspace with Super (Win) plus a number key (0 - 9)
|
||||||
|
;; ,@(mapcar (lambda (i)
|
||||||
|
;; `(,(kbd (format "s-%d" i)) .
|
||||||
|
;; (lambda ()
|
||||||
|
;; (interactive)
|
||||||
|
;; (exwm-workspace-switch-create ,i))))
|
||||||
|
;; (number-sequence 0 9))))
|
||||||
|
|
||||||
|
;; (start-process-shell-command "xrandr" nil "")
|
||||||
|
;; (start-process-shell-command "xmodmap" nil "xmodmap ~/.config/exwm/Xmodmap")
|
||||||
|
|
||||||
|
;; (require 'exwm-randr)
|
||||||
|
;; (exwm-randr-enable)
|
||||||
|
|
||||||
|
;; (require 'exwm-systemtray)
|
||||||
|
;; (exwm-systemtray-enable)
|
||||||
|
;; (exwm-enable))
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
clear lock
|
||||||
|
keycode 66 = Escape Caps_Lock NoSymbol NoSymbol
|
||||||
+60
-1
@@ -1,4 +1,9 @@
|
|||||||
(load-after-system :slynk "~/.config/nyxt/my-slynk.lisp")
|
(in-package :nyxt)
|
||||||
|
(load "~/quicklisp/setup.lisp")
|
||||||
|
(ql:quickload 'slynk)
|
||||||
|
|
||||||
|
(load-after-system :slynk (nyxt-init-file "my-slink.lisp"))
|
||||||
|
;; (load-after-system :slynk "~/.config/nyxt/my-slynk.lisp")
|
||||||
|
|
||||||
;; Vim-normal mode by default
|
;; Vim-normal mode by default
|
||||||
(define-configuration buffer
|
(define-configuration buffer
|
||||||
@@ -125,6 +130,47 @@
|
|||||||
(define-configuration buffer
|
(define-configuration buffer
|
||||||
((password-interface (make-instance 'password:user-keepassxc-interface))))
|
((password-interface (make-instance 'password:user-keepassxc-interface))))
|
||||||
|
|
||||||
|
(define-command set-url (&key (prefill-current-url-p t))
|
||||||
|
"Set the URL for the current buffer, completing with history."
|
||||||
|
(let ((history (set-url-history *browser*))
|
||||||
|
(actions (list (make-command buffer-load* (suggestion-values)
|
||||||
|
"Load first selected URL in current buffer and the rest in new buffer(s)."
|
||||||
|
(mapc (lambda (suggestion) (make-buffer :url (url suggestion))) (rest suggestion-values))
|
||||||
|
(buffer-load (url (first suggestion-values))))
|
||||||
|
(make-command new-buffer-load (suggestion-values)
|
||||||
|
"Load URL(s) in new buffer(s)."
|
||||||
|
(mapc (lambda (suggestion) (make-buffer :url (url suggestion))) (rest suggestion-values))
|
||||||
|
(make-buffer-focus :url (url (first suggestion-values)))))))
|
||||||
|
(pushnew-url-history history (url (current-buffer)))
|
||||||
|
(prompt
|
||||||
|
:prompt "Open URL"
|
||||||
|
:input (if prefill-current-url-p
|
||||||
|
(render-url (url (current-buffer))) "")
|
||||||
|
:history history
|
||||||
|
:sources (list (make-instance 'user-new-url-or-search-source :actions actions)
|
||||||
|
(make-instance 'bookmark-source :actions actions)
|
||||||
|
(make-instance 'user-global-history-source :actions actions)
|
||||||
|
(make-instance 'search-engine-url-source :actions actions)))))
|
||||||
|
|
||||||
|
(define-command set-url-new-buffer (&key (prefill-current-url-p t))
|
||||||
|
"Prompt for a URL and set it in a new focused buffer."
|
||||||
|
(let ((history (set-url-history *browser*))
|
||||||
|
(actions (list (make-command new-buffer-load (suggestion-values)
|
||||||
|
"Load URL(s) in new buffer(s)"
|
||||||
|
(mapc (lambda (suggestion) (make-buffer :url (url suggestion)))
|
||||||
|
(rest suggestion-values))
|
||||||
|
(make-buffer-focus :url (url (first suggestion-values)))))))
|
||||||
|
(pushnew-url-history history (url (current-buffer)))
|
||||||
|
(prompt
|
||||||
|
:prompt "Open URL in new buffer"
|
||||||
|
:input (if prefill-current-url-p
|
||||||
|
(render-url (url (current-buffer))) "")
|
||||||
|
:history history
|
||||||
|
:sources (list (make-instance 'user-new-url-or-search-source :actions actions)
|
||||||
|
(make-instance 'bookmark-source :actions actions)
|
||||||
|
(make-instance 'user-global-history-source :actions actions)
|
||||||
|
(make-instance 'search-engine-url-source :actions actions)))))
|
||||||
|
|
||||||
;; I would like to implement redirection, or some extension to handle it for me.
|
;; I would like to implement redirection, or some extension to handle it for me.
|
||||||
;; todo: Redirect reddit to teddit
|
;; todo: Redirect reddit to teddit
|
||||||
;; (defun old-reddit-handler (request-data)
|
;; (defun old-reddit-handler (request-data)
|
||||||
@@ -142,3 +188,16 @@
|
|||||||
;; ((request-resource-hook
|
;; ((request-resource-hook
|
||||||
;; (hooks:add-hook %slot-default% (make-handler-resource #'old-reddit-handler)))))
|
;; (hooks:add-hook %slot-default% (make-handler-resource #'old-reddit-handler)))))
|
||||||
;; (See url-dispatching-handler for a simpler way to achieve the same result.)
|
;; (See url-dispatching-handler for a simpler way to achieve the same result.)
|
||||||
|
|
||||||
|
(defun nyxt-init-file (&optional subpath)
|
||||||
|
"Return SUBPATH relative to `*init-file-path*'.
|
||||||
|
Return nil if `*init-file-path*' is nil.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
If we want to load a define-command procedure that lives in ~/path/to/nyxt/config/dir/my-slink.lisp
|
||||||
|
(load-after-system :slynk (nyxt-init-file \"my-slink.lisp\"))"
|
||||||
|
(if subpath
|
||||||
|
(uiop:subpathname* (uiop:pathname-directory-pathname
|
||||||
|
(expand-path *init-file-path*))
|
||||||
|
subpath)
|
||||||
|
(expand-path *init-file-path*)))
|
||||||
|
|||||||
+1
-1
@@ -19,4 +19,4 @@
|
|||||||
!.config/doom
|
!.config/doom
|
||||||
!.config/user-dirs.dirs
|
!.config/user-dirs.dirs
|
||||||
!.gitignore
|
!.gitignore
|
||||||
!.stow-local-ignore
|
!.stow-local-ignore
|
||||||
@@ -1,10 +1,32 @@
|
|||||||
#+TITLE: Emacs Configuration
|
#+TITLE: Emacs Configuration
|
||||||
#+PROPERTY: header-args:emacs-lisp :tangle ~/Dotfiles/.config/emacs/init.el :mkdirp yes :lexical yes
|
#+PROPERTY: header-args:emacs-lisp :tangle ~/Dotfiles/.config/emacs/init.el :mkdirp yes :lexical yes
|
||||||
|
|
||||||
* Emacs Configuration
|
* Configuration
|
||||||
|
** Table of Contents
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:VISIBILITY: children
|
:TOC: :include all :depth 3 :force (depth) :ignore (this) :local (depth)
|
||||||
:END:
|
:END:
|
||||||
|
:CONTENTS:
|
||||||
|
- [[#configuration][Configuration]]
|
||||||
|
- [[#package-management][Package Management]]
|
||||||
|
- [[#general][General]]
|
||||||
|
- [[#theme][Theme]]
|
||||||
|
- [[#fonts][Fonts]]
|
||||||
|
- [[#keybinding][Keybinding]]
|
||||||
|
- [[#completion-frameworks][Completion Frameworks]]
|
||||||
|
- [[#buffer--workspaces][Buffer & Workspaces]]
|
||||||
|
- [[#file-browser][File Browser]]
|
||||||
|
- [[#org][Org]]
|
||||||
|
- [[#programmingeditor][Programming/Editor]]
|
||||||
|
- [[#tools][Tools]]
|
||||||
|
- [[#magit][Magit]]
|
||||||
|
- [[#eshell][Eshell]]
|
||||||
|
- [[#vterm][Vterm]]
|
||||||
|
- [[#pdf][PDF]]
|
||||||
|
- [[#e-mail][E-Mail]]
|
||||||
|
- [[#irc][IRC]]
|
||||||
|
:END:
|
||||||
|
|
||||||
** Package Management
|
** Package Management
|
||||||
I use [[https://github.com/raxod502/straight.el][straight.el]] for managing packages as it's fairly simple and robust. At some point I'd like to move to primarily using Guix for Emacs package management.
|
I use [[https://github.com/raxod502/straight.el][straight.el]] for managing packages as it's fairly simple and robust. At some point I'd like to move to primarily using Guix for Emacs package management.
|
||||||
|
|
||||||
@@ -114,15 +136,7 @@ Helpful.el is a package that reformats the describe-X functions to be much more
|
|||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package helpful
|
(use-package helpful
|
||||||
:straight t
|
:straight t
|
||||||
:commands (helpful-callable helpful-variable helpful-command helpful-key)
|
:commands (helpful-callable helpful-variable helpful-command helpful-key))
|
||||||
:custom
|
|
||||||
(counsel-describe-function-function #'helpful-callable)
|
|
||||||
(counsel-describe-variable-function #'helpful-variable)
|
|
||||||
:bind
|
|
||||||
([remap describe-function] . counsel-describe-function)
|
|
||||||
([remap describe-command] . helpful-command)
|
|
||||||
([remap describe-variable] . counsel-describe-variable)
|
|
||||||
([remap describe-key] . helpful-key))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
*** Autosaves
|
*** Autosaves
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
@@ -188,7 +202,7 @@ I really enjoy having a leader key and eschewing the Control and Alt keys entire
|
|||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(global-set-key (kbd "<escape>") 'keyboard-escape-quit) ;; Escape exits out of prompts
|
(global-set-key (kbd "<escape>") 'keyboard-escape-quit) ;; Escape exits out of prompts
|
||||||
|
|
||||||
;; Define Leader Key
|
;; Define Leader Key
|
||||||
(use-package general
|
(use-package general
|
||||||
:straight t
|
:straight t
|
||||||
:config
|
:config
|
||||||
@@ -197,9 +211,9 @@ I really enjoy having a leader key and eschewing the Control and Alt keys entire
|
|||||||
:keymaps '(normal insert visual emacs)
|
:keymaps '(normal insert visual emacs)
|
||||||
:prefix "SPC"
|
:prefix "SPC"
|
||||||
:global-prefix "C-SPC")
|
:global-prefix "C-SPC")
|
||||||
;; Define Keybindings (potentially move into own file)
|
;; Define Keybindings (potentially move into own file)
|
||||||
(opal/leader-keys
|
(opal/leader-keys
|
||||||
;; Leader-map
|
;; Leader-map
|
||||||
";" #'pp-eval-expression ;; Eval expression
|
";" #'pp-eval-expression ;; Eval expression
|
||||||
":" #'execute-extended-command ;; Eq to M-x
|
":" #'execute-extended-command ;; Eq to M-x
|
||||||
"u" #'universal-argument ;; Universal argument
|
"u" #'universal-argument ;; Universal argument
|
||||||
@@ -213,21 +227,25 @@ I really enjoy having a leader key and eschewing the Control and Alt keys entire
|
|||||||
"gg" #'magit-status
|
"gg" #'magit-status
|
||||||
"gi" #'magit-init
|
"gi" #'magit-init
|
||||||
"gc" #'magit-clone
|
"gc" #'magit-clone
|
||||||
|
|
||||||
;; Buffers
|
;; Workspaces
|
||||||
"bd" #'kill-buffer
|
"bi" #'persp-ibuffer
|
||||||
|
"bl" #'persp-next
|
||||||
|
"bh" #'persp-prev
|
||||||
|
"br" #'persp-rename
|
||||||
|
"bd" #'persp-remove-buffer
|
||||||
|
|
||||||
;; Terminal/Shell
|
;; Terminal/Shell
|
||||||
"tt" #'vterm
|
"tt" #'vterm
|
||||||
"te" #'eshell
|
"te" #'eshell
|
||||||
|
|
||||||
;; Org
|
;; Org
|
||||||
; Babel
|
;; Babel
|
||||||
"obt" #'org-babel-tangle
|
"obt" #'org-babel-tangle
|
||||||
; Gen
|
;; Gen
|
||||||
"ol" #'org-insert-link
|
"ol" #'org-insert-link
|
||||||
"or" #'org-reload
|
"or" #'org-reload
|
||||||
; Agenda
|
;; Agenda
|
||||||
"oa" #'org-agenda
|
"oa" #'org-agenda
|
||||||
|
|
||||||
;; Eval
|
;; Eval
|
||||||
@@ -241,8 +259,7 @@ I really enjoy having a leader key and eschewing the Control and Alt keys entire
|
|||||||
"dv" #'describe-variable
|
"dv" #'describe-variable
|
||||||
"ds" #'describe-symbol
|
"ds" #'describe-symbol
|
||||||
"dk" #'describe-key
|
"dk" #'describe-key
|
||||||
"dp" #'describe-package))
|
"dp" #'describe-package))
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Evil
|
*** Evil
|
||||||
@@ -330,7 +347,7 @@ Persistent history
|
|||||||
(savehist-mode))
|
(savehist-mode))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*** Counsel
|
*** Consult
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package consult
|
(use-package consult
|
||||||
:straight t
|
:straight t
|
||||||
@@ -369,7 +386,42 @@ Marginalia provides annotations next to minibuffer items.
|
|||||||
(marginalia-mode))
|
(marginalia-mode))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Company
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package company
|
||||||
|
:straight t
|
||||||
|
:commands (company-complete-common
|
||||||
|
company-complete-common-or-cycle
|
||||||
|
company-manual-begin
|
||||||
|
company-grab-line)
|
||||||
|
:init
|
||||||
|
(setq company-minimum-prefix-length 2
|
||||||
|
company-tooltip-limit 14
|
||||||
|
company-tooltip-align-annotations t
|
||||||
|
company-require-match 'never
|
||||||
|
company-global-modes
|
||||||
|
'(not erc-mode
|
||||||
|
message-mode
|
||||||
|
help-mode
|
||||||
|
vterm-mode)
|
||||||
|
company-frontends
|
||||||
|
'(company-pseudo-tooltip-frontend ; always show candidates in overlay tooltip
|
||||||
|
company-echo-metadata-frontend) ; show selected candidate docs in echo area
|
||||||
|
company-backends '(company-capf)
|
||||||
|
company-auto-commit nil
|
||||||
|
company-dabbrev-other-buffers nil
|
||||||
|
company-dabbrev-ignore-case nil
|
||||||
|
company-dabbrev-downcase nil))
|
||||||
|
#+end_src
|
||||||
|
|
||||||
** Buffer & Workspaces
|
** Buffer & Workspaces
|
||||||
|
*** Perspective
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package perspective
|
||||||
|
:straight t
|
||||||
|
:config
|
||||||
|
(persp-mode))
|
||||||
|
#+end_src
|
||||||
*** Bufler
|
*** Bufler
|
||||||
Helps organize buffers in groups.
|
Helps organize buffers in groups.
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
@@ -384,6 +436,18 @@ Allows window undo
|
|||||||
** File Browser
|
** File Browser
|
||||||
I don't even think I've heard of an alternative to Dired...
|
I don't even think I've heard of an alternative to Dired...
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
|
(use-package dired
|
||||||
|
:init
|
||||||
|
(setq dired-auto-revert-buffer t
|
||||||
|
dired-dwim-target t
|
||||||
|
dired-hide-details-hide-symlink-targets nil
|
||||||
|
dired-recursive-copies 'always
|
||||||
|
dired-recursive-deletes 'top
|
||||||
|
dired-create-destination-dirs 'ask))
|
||||||
|
|
||||||
|
(use-package dired-rsync
|
||||||
|
:straight t
|
||||||
|
:general (dired-mode-map "C-c C-r" #'dired-rsync))
|
||||||
(use-package all-the-icons-dired :straight t)
|
(use-package all-the-icons-dired :straight t)
|
||||||
(use-package dired-single :straight t)
|
(use-package dired-single :straight t)
|
||||||
(use-package dired-collapse :straight t)
|
(use-package dired-collapse :straight t)
|
||||||
@@ -417,16 +481,6 @@ I don't even think I've heard of an alternative to Dired...
|
|||||||
** Org
|
** Org
|
||||||
*** General Configuration
|
*** General Configuration
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
;; Set org agenda dir
|
|
||||||
(setq org-directory "~/Org/")
|
|
||||||
|
|
||||||
;; Tell Org to stop indenting inside of org source blocks.
|
|
||||||
(setq org-edit-src-content-indentation 0)
|
|
||||||
|
|
||||||
;; Open links in browser
|
|
||||||
(setq browse-url-browser-function 'browse-url-generic
|
|
||||||
browse-url-generic-program "firefox")
|
|
||||||
|
|
||||||
(defun opal/org-font-setup ()
|
(defun opal/org-font-setup ()
|
||||||
;; Replace list hyphen with dot
|
;; Replace list hyphen with dot
|
||||||
(font-lock-add-keywords 'org-mode
|
(font-lock-add-keywords 'org-mode
|
||||||
@@ -537,6 +591,16 @@ I don't even think I've heard of an alternative to Dired...
|
|||||||
("pp" "Project File" entry (file+olp "~/org/projects/auto-infra-overview.org" "Inbox")
|
("pp" "Project File" entry (file+olp "~/org/projects/auto-infra-overview.org" "Inbox")
|
||||||
"* TODO %?\n %U\n %a\n %i" :empty-lines 1)))
|
"* TODO %?\n %U\n %a\n %i" :empty-lines 1)))
|
||||||
|
|
||||||
|
;; Tell Org to stop indenting inside of org source blocks.
|
||||||
|
(setq org-edit-src-content-indentation 0)
|
||||||
|
|
||||||
|
;; Set org agenda dir
|
||||||
|
(setq org-directory "~/Org/")
|
||||||
|
|
||||||
|
;; Open links in browser
|
||||||
|
(setq browse-url-browser-function 'browse-url-generic
|
||||||
|
browse-url-generic-program "firefox")
|
||||||
|
|
||||||
;; Init org font setup
|
;; Init org font setup
|
||||||
(opal/org-font-setup))
|
(opal/org-font-setup))
|
||||||
#+end_src
|
#+end_src
|
||||||
@@ -552,6 +616,11 @@ Creates nicer (-) bullets.
|
|||||||
(org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●")))
|
(org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●")))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Org Table of Contents
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-make-toc :straight t)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
*** Visual Fill Mode
|
*** Visual Fill Mode
|
||||||
Creates margins in Org mode to make it more pleasant to look at.
|
Creates margins in Org mode to make it more pleasant to look at.
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
@@ -631,6 +700,7 @@ Sets HTML strings to have the background of the color they represent.
|
|||||||
#+end_src
|
#+end_src
|
||||||
*** Common Lisp
|
*** Common Lisp
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
|
(defvar inferior-lisp-program "sbcl")
|
||||||
(use-package sly :straight t)
|
(use-package sly :straight t)
|
||||||
#+end_src
|
#+end_src
|
||||||
* Tools
|
* Tools
|
||||||
@@ -644,7 +714,6 @@ Sets HTML strings to have the background of the color they represent.
|
|||||||
(use-package eshell-git-prompt :straight t)
|
(use-package eshell-git-prompt :straight t)
|
||||||
|
|
||||||
(use-package eshell
|
(use-package eshell
|
||||||
:hook (eshell-first-time-mode . eshell-config)
|
|
||||||
:config
|
:config
|
||||||
;; Save command history when commands are entered
|
;; Save command history when commands are entered
|
||||||
(add-hook 'eshell-pre-command-hook 'eshell-save-some-history)
|
(add-hook 'eshell-pre-command-hook 'eshell-save-some-history)
|
||||||
@@ -656,16 +725,28 @@ Sets HTML strings to have the background of the color they represent.
|
|||||||
(evil-define-key '(normal insert visual) eshell-mode-map (kbd "<home>") 'eshell-bol)
|
(evil-define-key '(normal insert visual) eshell-mode-map (kbd "<home>") 'eshell-bol)
|
||||||
(evil-normalize-keymaps)
|
(evil-normalize-keymaps)
|
||||||
|
|
||||||
(setq eshell-history-size 10000
|
|
||||||
eshell-buffer-maximum-lines 10000
|
|
||||||
eshell-hist-ignoredups t
|
|
||||||
eshell-scroll-to-bottom-on-input t)
|
|
||||||
|
|
||||||
(with-eval-after-load 'esh-opt
|
(with-eval-after-load 'esh-opt
|
||||||
(setq eshell-destroy-buffer-when-process-dies t)
|
(setq eshell-destroy-buffer-when-process-dies t)
|
||||||
(setq eshell-visual-commands '("htop" "zsh" "vim")))
|
(setq eshell-visual-commands '("htop" "zsh" "vim")))
|
||||||
|
|
||||||
(eshell-git-prompt-use-theme 'powerline))
|
(eshell-git-prompt-use-theme 'powerline)
|
||||||
|
|
||||||
|
(setq eshell-banner-message
|
||||||
|
'(format "%s %s\n"
|
||||||
|
(propertize (format " %s " (string-trim (buffer-name)))
|
||||||
|
'face 'mode-line-highlight)
|
||||||
|
(propertize (current-time-string)
|
||||||
|
'face 'font-lock-keyword-face))
|
||||||
|
eshell-scroll-to-bottom-on-input 'all
|
||||||
|
eshell-scroll-to-bottom-on-output 'all
|
||||||
|
eshell-kill-processes-on-exit t
|
||||||
|
eshell-hist-ignoredups t
|
||||||
|
;; em-prompt
|
||||||
|
eshell-prompt-regexp "^.* λ "
|
||||||
|
;; em-glob
|
||||||
|
eshell-history-size 10000
|
||||||
|
eshell-buffer-maximum-lines 10000
|
||||||
|
eshell-scroll-to-bottom-on-input t))
|
||||||
#+end_src
|
#+end_src
|
||||||
** Vterm
|
** Vterm
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
@@ -742,3 +823,67 @@ Right now I'm pretty happy with Matrix bridging into IRC rooms so this will stay
|
|||||||
;; erc-rename-buffers t
|
;; erc-rename-buffers t
|
||||||
;; erc-track-exclude-server-buffer t))
|
;; erc-track-exclude-server-buffer t))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
* Window Management (EXWM)
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
;; (defun efs/exwm-update-class ()
|
||||||
|
;; (exwm-workspace-rename-buffer exwm-class-name))
|
||||||
|
|
||||||
|
;; (use-package exwm
|
||||||
|
;; :config
|
||||||
|
;; (setq exwm-workspace-number 5)
|
||||||
|
|
||||||
|
;; ;; These keys will pass through to Emacs
|
||||||
|
;; (setq exwm-input-prefix-keys
|
||||||
|
;; '(?\C-x
|
||||||
|
;; ?\C-u
|
||||||
|
;; ?\C-h
|
||||||
|
;; ?\M-x
|
||||||
|
;; ?\M-`
|
||||||
|
;; ?\M-&
|
||||||
|
;; ?\M-:
|
||||||
|
;; ?\C-\M-j ;; Buffer list
|
||||||
|
;; ?\C-\ )) ;; Ctrl+Space
|
||||||
|
|
||||||
|
;; ;; This will allow the next key to be sent directly
|
||||||
|
;; (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key)
|
||||||
|
|
||||||
|
;; ;; Set up global key bindings. These always work, no matter the input state!
|
||||||
|
;; ;; Keep in mind that changing this list after EXWM initializes has no effect.
|
||||||
|
;; (setq exwm-input-global-keys
|
||||||
|
;; `(
|
||||||
|
;; ;; Reset to line-mode (C-c C-k switches to char-mode via exwm-input-release-keyboard)
|
||||||
|
;; ([?\s-r] . exwm-reset)
|
||||||
|
|
||||||
|
;; ;; Move between windows
|
||||||
|
;; ([s-h] . windmove-left)
|
||||||
|
;; ([s-l] . windmove-right)
|
||||||
|
;; ([s-k] . windmove-up)
|
||||||
|
;; ([s-j] . windmove-down)
|
||||||
|
|
||||||
|
;; ;; Launch applications via shell command
|
||||||
|
;; ([?\s-&] . (lambda (command)
|
||||||
|
;; (interactive (list (read-shell-command "$ ")))
|
||||||
|
;; (start-process-shell-command command nil command)))
|
||||||
|
|
||||||
|
;; ;; Switch workspace
|
||||||
|
;; ([?\s-w] . exwm-workspace-switch)
|
||||||
|
|
||||||
|
;; ;; 's-N': Switch to certain workspace with Super (Win) plus a number key (0 - 9)
|
||||||
|
;; ,@(mapcar (lambda (i)
|
||||||
|
;; `(,(kbd (format "s-%d" i)) .
|
||||||
|
;; (lambda ()
|
||||||
|
;; (interactive)
|
||||||
|
;; (exwm-workspace-switch-create ,i))))
|
||||||
|
;; (number-sequence 0 9))))
|
||||||
|
|
||||||
|
;; (start-process-shell-command "xrandr" nil "")
|
||||||
|
;; (start-process-shell-command "xmodmap" nil "xmodmap ~/.config/exwm/Xmodmap")
|
||||||
|
|
||||||
|
;; (require 'exwm-randr)
|
||||||
|
;; (exwm-randr-enable)
|
||||||
|
|
||||||
|
;; (require 'exwm-systemtray)
|
||||||
|
;; (exwm-systemtray-enable)
|
||||||
|
;; (exwm-enable))
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|||||||
@@ -4,18 +4,15 @@
|
|||||||
Nyxt is a browser written in Common Lisp that follows the same philosophy of extensibility as Emacs. This makes it a perfect companion to an Emacs centered eco-system when you need a browser with more features than Eww or w3m.
|
Nyxt is a browser written in Common Lisp that follows the same philosophy of extensibility as Emacs. This makes it a perfect companion to an Emacs centered eco-system when you need a browser with more features than Eww or w3m.
|
||||||
|
|
||||||
* Load Quicklisp
|
* Load Quicklisp
|
||||||
#+begin_src emacs-lisp
|
#+begin_src lisp
|
||||||
|
(in-package :nyxt)
|
||||||
(load "~/quicklisp/setup.lisp")
|
(load "~/quicklisp/setup.lisp")
|
||||||
(ql:quickload 'slynk)
|
(ql:quickload 'slynk)
|
||||||
;; #-quicklisp
|
|
||||||
;; (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
|
|
||||||
;; (user-homedir-pathname))))
|
|
||||||
;; (when (probe-file quicklisp-init)
|
|
||||||
;; (load quicklisp-init)))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
* Start Slynk server
|
* Import Functions
|
||||||
#+begin_src lisp
|
#+begin_src lisp
|
||||||
(load-after-system :slynk "~/.config/nyxt/my-slynk.lisp")
|
(load-after-system :slynk (nyxt-init-file "my-slink.lisp"))
|
||||||
|
;; (load-after-system :slynk "~/.config/nyxt/my-slynk.lisp")
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Keybindings
|
* Keybindings
|
||||||
@@ -153,8 +150,9 @@ Password managers are an essential feature and thankfully Nyxt allows me to inte
|
|||||||
((password-interface (make-instance 'password:user-keepassxc-interface))))
|
((password-interface (make-instance 'password:user-keepassxc-interface))))
|
||||||
#+end_src
|
#+end_src
|
||||||
* Functions
|
* Functions
|
||||||
#+begin_src emacs-lisp
|
** Show bookmarks first
|
||||||
(in-package :nyxt)
|
I've ripped these functions out of the source code and swapped the sources in order to have bookmarks show up first upon executing set-url or set-url-new-buffer.
|
||||||
|
#+begin_src lisp
|
||||||
(define-command set-url (&key (prefill-current-url-p t))
|
(define-command set-url (&key (prefill-current-url-p t))
|
||||||
"Set the URL for the current buffer, completing with history."
|
"Set the URL for the current buffer, completing with history."
|
||||||
(let ((history (set-url-history *browser*))
|
(let ((history (set-url-history *browser*))
|
||||||
@@ -220,3 +218,18 @@ I would like to keep expanding on these redirection functions so I can have nati
|
|||||||
;; (hooks:add-hook %slot-default% (make-handler-resource #'old-reddit-handler)))))
|
;; (hooks:add-hook %slot-default% (make-handler-resource #'old-reddit-handler)))))
|
||||||
;; (See url-dispatching-handler for a simpler way to achieve the same result.)
|
;; (See url-dispatching-handler for a simpler way to achieve the same result.)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
* Testing
|
||||||
|
#+begin_src lisp
|
||||||
|
(defun nyxt-init-file (&optional subpath)
|
||||||
|
"Return SUBPATH relative to `*init-file-path*'.
|
||||||
|
Return nil if `*init-file-path*' is nil.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
If we want to load a define-command procedure that lives in ~/path/to/nyxt/config/dir/my-slink.lisp
|
||||||
|
(load-after-system :slynk (nyxt-init-file \"my-slink.lisp\"))"
|
||||||
|
(if subpath
|
||||||
|
(uiop:subpathname* (uiop:pathname-directory-pathname
|
||||||
|
(expand-path *init-file-path*))
|
||||||
|
subpath)
|
||||||
|
(expand-path *init-file-path*)))
|
||||||
|
#+end_src
|
||||||
|
|||||||
Reference in New Issue
Block a user