feat(arch): finalize Universal Literate Note transition for all projects and skills
This commit is contained in:
26
projects/dotemacs/docs/README.org
Normal file
26
projects/dotemacs/docs/README.org
Normal file
@@ -0,0 +1,26 @@
|
||||
#+title: Emacs Setup Improvement & Documentation Project
|
||||
#+author: Amero Garcia
|
||||
#+created: [2026-03-16 Mon 13:58]
|
||||
#+begin_comment
|
||||
This file outlines the project to collaboratively improve and document Amr's Emacs setup, aiming to make Emacs his primary computing tool.
|
||||
#+end_comment
|
||||
|
||||
* Emacs Setup Improvement & Documentation Project
|
||||
|
||||
*Goal:** To collaboratively improve and comprehensively document Amr's Emacs configuration, transitioning Emacs into his primary computing environment.
|
||||
|
||||
*Initial Scope:**
|
||||
- Reviewing the existing Emacs Org-mode configuration file (tangled to set up Emacs).
|
||||
- Identifying areas for optimization, new functionalities, and better integration with workflows.
|
||||
- Documenting each significant setting, function, and package.
|
||||
|
||||
*Information Needed from Amr:**
|
||||
- Location of the current Emacs Org-mode configuration file.
|
||||
- Key pain points or areas where Emacs currently falls short as a "main computing tool."
|
||||
- Specific desired functionalities or integrations (e.g., mail, calendar, task management, coding environments, note-taking, web browsing within Emacs).
|
||||
- Any existing documentation or design principles for the current setup.
|
||||
|
||||
*Next Steps:**
|
||||
1. Receive Emacs configuration file location from Amr.
|
||||
2. Analyze current setup.
|
||||
3. Propose documentation structure and initial improvements.
|
||||
27
projects/dotemacs/docs/dotemacs.org
Normal file
27
projects/dotemacs/docs/dotemacs.org
Normal file
@@ -0,0 +1,27 @@
|
||||
#+TITLE: Amr's Modular Emacs Configuration
|
||||
#+PROPERTY: header-args :tangle no ; This file is for loading other modules, not for tangling itself.
|
||||
|
||||
* Configuration Modules
|
||||
|
||||
This file loads the modular Emacs configuration files. It should be the primary way Emacs is configured, replacing or integrating with the original `~/.emacs`, `~/.emacs.d/init.el`, `~/.emacs.d/early-init.el`, and `~/.emacs.d/config.el`.
|
||||
|
||||
#+begin_src emacs-lisp :exports none
|
||||
;; Load early-init.el first, if it exists and is separate (though it's now part of emacs-early-init.org)
|
||||
;; (load-file (expand-file-name "emacs-early-init.org" (file-name-directory load-file-name)))
|
||||
|
||||
;; Load the core settings, including package management and essential setup.
|
||||
(org-babel-load-file (expand-file-name "emacs-core.org" (file-name-directory load-file-name)))
|
||||
|
||||
;; Load early init settings (if separate and not fully covered by core)
|
||||
(org-babel-load-file (expand-file-name "emacs-early-init.org" (file-name-directory load-file-name)))
|
||||
|
||||
;; Load other modules in a logical order
|
||||
(org-babel-load-file (expand-file-name "emacs-org.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-gtd.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-roam.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-writing.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-media.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-shell.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-ai.org" (file-name-directory load-file-name)))
|
||||
(org-babel-load-file (expand-file-name "emacs-misc.org" (file-name-directory load-file-name)))
|
||||
#+end_src
|
||||
104
projects/dotemacs/docs/emacs-ai.org
Normal file
104
projects/dotemacs/docs/emacs-ai.org
Normal file
@@ -0,0 +1,104 @@
|
||||
#+TITLE: AI Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* AI Settings
|
||||
|
||||
** Ellama
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
;; YOU DON'T NEED NONE OF THIS CODE FOR SIMPLE INSTALL
|
||||
;; IT IS AN EXAMPLE OF CUSTOMIZATION.
|
||||
(use-package ellama
|
||||
:init
|
||||
(require 'llm-openai)
|
||||
;; setup key bindings
|
||||
(setq ellama-keymap-prefix "C-c e")
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp ~/.emacs.d/custom.el :tangle no
|
||||
(setopt ellama-providers
|
||||
'(
|
||||
;; Ollama Provider (added here with a name)
|
||||
("ollama" . (make-llm-ollama
|
||||
;; Consider a dedicated embedding model if gemma isn't ideal for it.
|
||||
:chat-model "gemma3:latest"
|
||||
:embedding-model "gemma3:latest" ; Or e.g., "nomic-embed-text"
|
||||
:default-chat-non-standard-params '(("num_ctx" . 8192))))
|
||||
|
||||
("openai" . (make-llm-openai
|
||||
:key (auth-source-pass-get "api-key" "www/openai.com/amr@gharbeia.net")
|
||||
:chat-model "gpt-4o"
|
||||
:embedding-model "text-embedding-3-large"))
|
||||
|
||||
("groq" . (make-llm-openai-compatible
|
||||
:url "https://api.groq.com/openai/v1"
|
||||
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net")
|
||||
;; Check Groq console for available models, these might change
|
||||
:chat-model "llama3-70b-8192" ; Example, verify on Groq
|
||||
:embedding-model "llama3-70b-8192")) ; Groq might not offer dedicated embedding models via this API
|
||||
))
|
||||
|
||||
;; --- Set Active Providers ---
|
||||
;; Choose your default provider from the list above by its name
|
||||
(setopt ellama-provider "ollama") ; Or "ollama", "openai", "groq"
|
||||
|
||||
;; You can specify different providers for different tasks if needed
|
||||
(setopt ellama-translation-provider "ollama")
|
||||
(setopt ellama-naming-provider "ollama")
|
||||
(setopt ellama-naming-scheme 'ellama-generate-name-by-llm)
|
||||
|
||||
(setq llm-debug t)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package ellama
|
||||
:ensure t
|
||||
:bind ("C-c e" . ellama)
|
||||
;; send last message in chat buffer with C-c C-c
|
||||
:hook (org-ctrl-c-ctrl-c-final . ellama-chat-send-last-message)
|
||||
:init (setopt ellama-auto-scroll t)
|
||||
:config
|
||||
;; show ellama context in header line in all buffers
|
||||
(ellama-context-header-line-global-mode +1)
|
||||
;; show ellama session id in header line in all buffers
|
||||
(ellama-session-header-line-global-mode +1))
|
||||
#+end_src
|
||||
|
||||
** GPTel
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package gptel)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(setq gptel-api-key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net"))
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(gptel-make-openai "Groq" ;Any name you want
|
||||
:host "api.groq.com"
|
||||
:endpoint "/openai/v1/chat/completions"
|
||||
:stream t
|
||||
:key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net") ;can be a function that returns the key
|
||||
:models '(llama-3.1-70b-versatile
|
||||
llama-3.1-8b-instant
|
||||
llama3-70b-8192
|
||||
llama3-8b-8192
|
||||
mixtral-8x7b-32768
|
||||
gemma-7b-it))
|
||||
#+end_src
|
||||
|
||||
** Elisa
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package elisa
|
||||
:init
|
||||
(setopt elisa-limit 5)
|
||||
(require 'llm-ollama)
|
||||
(setopt elisa-embeddings-provider (make-llm-ollama :embedding-model "nomic-embed-text"))
|
||||
(setopt elisa-chat-provider (make-llm-ollama
|
||||
:chat-model "sskostyaev/openchat:8k-rag"
|
||||
:embedding-model "nomic-embed-text"))
|
||||
)
|
||||
#+end_src
|
||||
169
projects/dotemacs/docs/emacs-core.org
Normal file
169
projects/dotemacs/docs/emacs-core.org
Normal file
@@ -0,0 +1,169 @@
|
||||
#+TITLE: Core Emacs Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Front matter
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
;;; .emacs --- Global settings
|
||||
;;; Commentary:
|
||||
;;; Code:
|
||||
|
||||
;; -*- lexical-binding: t; -*-
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
;;; config.el --- Summary
|
||||
;;; Commentary:
|
||||
;;; Code:
|
||||
|
||||
;; -*- lexical-binding: t; -*-
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
;;; custom.el --- Summary
|
||||
;;; Commentary:
|
||||
;;; Code:
|
||||
|
||||
;; -*- lexical-binding: t; -*-
|
||||
#+end_src
|
||||
|
||||
* Garbage collector
|
||||
|
||||
Increase threshold to 500 MB to ease startup
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(setq gc-cons-threshold (* 500 1024 1024))
|
||||
#+end_src
|
||||
|
||||
Decrease threshold to 5 MB after init
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
|
||||
#+end_src
|
||||
|
||||
* Straight.el and use-package
|
||||
|
||||
Bootstrap Straight.el and install use-package
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(setq straight-repository-branch "develop") ;; Using develop branch temporarily to fix the org-roam-dailies issue.
|
||||
|
||||
(eval-and-compile
|
||||
(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)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Integrate use-package and straight
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(setq straight-use-package-by-default t)
|
||||
#+end_src
|
||||
|
||||
Make sure Org is installed (straight.el)
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(unless (file-directory-p "~/.emacs.d/straight/versions") (make-directory (concat user-emacs-directory "straight/versions")))
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(use-package org)
|
||||
#+end_src
|
||||
|
||||
A use-package declaration for simplifying your .emacs
|
||||
#+begin_src elisp
|
||||
(require 'use-package)
|
||||
#+end_src
|
||||
|
||||
* Custom file
|
||||
|
||||
#+begin_src elisp
|
||||
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
|
||||
(when (file-exists-p custom-file) (load custom-file))
|
||||
#+end_src
|
||||
|
||||
* System information
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
(defvar my-laptop-p (equal (system-name) "lilitop"))
|
||||
(defvar my-server-p (and (equal (system-name) "localhost") (equal user-login-name "root")))
|
||||
(defvar my-phone-p (not (null (getenv "ANDROID_ROOT")))
|
||||
"If non-nil, GNU Emacs is running on Termux.")
|
||||
(when my-phone-p (defvar gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
|
||||
(global-auto-revert-mode) ; simplifies syncing
|
||||
#+end_src
|
||||
|
||||
* Persistent history
|
||||
|
||||
#+begin_src elisp
|
||||
(savehist-mode)
|
||||
#+end_src
|
||||
|
||||
* Backup and versioning
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(use-package magit
|
||||
:ensure t
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* Personal information
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
(setq user-full-name "Amr Gharbeia")
|
||||
(defvar email-address "amr@gharbeia.net")
|
||||
(defvar calendar-latitude 39.0)
|
||||
(defvar calendar-longitude -77.1)
|
||||
(defvar calendar-location-name "Washington, DC")
|
||||
(defvar calendar-time-zone -300)
|
||||
(defvar calendar-standard-time-zone-name "EST")
|
||||
(defvar calendar-daylight-time-zone-name "EDT")
|
||||
#+end_src
|
||||
|
||||
* Saving Emacs Sessions
|
||||
|
||||
Close frame when done
|
||||
#+begin_src elisp
|
||||
(add-hook 'server-done-hook (lambda () (delete-frame)))
|
||||
#+end_src
|
||||
|
||||
Save desktop session
|
||||
#+begin_src elisp
|
||||
(desktop-save-mode t)
|
||||
#+end_src
|
||||
|
||||
* Security
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package password-store)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package auth-source
|
||||
:config (auth-source-pass-enable)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* End matter
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs
|
||||
(provide '.emacs)
|
||||
;;; .emacs ends here
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(provide 'config)
|
||||
;;; config.el ends here
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
(provide 'custom)
|
||||
;;; custom.el ends here
|
||||
#+end_src
|
||||
18
projects/dotemacs/docs/emacs-early-init.org
Normal file
18
projects/dotemacs/docs/emacs-early-init.org
Normal file
@@ -0,0 +1,18 @@
|
||||
#+TITLE: Early Init Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/early-init.el
|
||||
|
||||
* early-init.el
|
||||
|
||||
For straight.el to pick up before package.el
|
||||
|
||||
#+begin_src elisp
|
||||
(setq package-enable-at-startup nil)
|
||||
#+end_src
|
||||
|
||||
* Run Emacs as a server
|
||||
|
||||
#+begin_src elisp
|
||||
(require 'server)
|
||||
(unless (server-running-p) (server-start))
|
||||
(defvar server-max-buffers 100)
|
||||
#+end_src
|
||||
157
projects/dotemacs/docs/emacs-gtd.org
Normal file
157
projects/dotemacs/docs/emacs-gtd.org
Normal file
@@ -0,0 +1,157 @@
|
||||
#+TITLE: GTD & Agenda Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Agenda
|
||||
|
||||
Basic agenda settings
|
||||
#+begin_src elisp
|
||||
(setq org-deadline-warning-days 7)
|
||||
(setq org-agenda-skip-additional-timestamps-same-entry t)
|
||||
(setq org-agenda-span 'fortnight)
|
||||
(setq org-agenda-tags-column 'auto)
|
||||
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
|
||||
#+end_src
|
||||
|
||||
Agenda files
|
||||
#+begin_src elisp
|
||||
(setq org-agenda-files (list
|
||||
(concat org-directory "inbox.org")
|
||||
(concat org-directory "gtd.org")
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Better agenda views
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package org-super-agenda)
|
||||
#+end_src
|
||||
|
||||
* To-do
|
||||
|
||||
Basic todo
|
||||
#+begin_src elisp
|
||||
(setq org-todo-keywords
|
||||
'(
|
||||
(sequence "TODO(t)" "NEXT(n)" "WAIT(w@/!)" "|" "DONE(d!)" "CNCL(c@)")
|
||||
)
|
||||
)
|
||||
|
||||
(setq org-todo-keyword-faces
|
||||
'(
|
||||
("TODO" :foreground "red" :weight bold)
|
||||
("NEXT" :foreground "red" :weight bold)
|
||||
("WAIT" :foreground "yellow" :weight bold)
|
||||
("DONE" :foreground "green" :weight bold)
|
||||
("CNCL" :foreground "blue" :weight bold)
|
||||
)
|
||||
)
|
||||
|
||||
(setq org-enforce-todo-dependencies t)
|
||||
(setq org-tags-exclude-from-inheritance '("crypt" "!private"))
|
||||
#+end_src
|
||||
|
||||
Switch entry to 'DONE' when all subentries are done
|
||||
#+begin_src elisp
|
||||
(defun org-summary-todo (n-done n-not-done)
|
||||
"Switch entry to 'DONE' when all subentries are done, to 'TODO' otherwise.
|
||||
Uses N-DONE and N-NOT-DONE"
|
||||
(let (org-log-done org-log-states) ; turn off logging
|
||||
(org-todo (if (= n-not-done 0) "DONE" "TODO")
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(add-hook 'org-after-todo-statistics-hook #'org-summary-todo)
|
||||
#+end_src
|
||||
|
||||
* Getting Things Done (GTD)
|
||||
#+begin_src elisp
|
||||
(use-package org-gtd
|
||||
:defer t
|
||||
:init (setq org-gtd-update-ack "4.0.0")
|
||||
:after org
|
||||
:config
|
||||
(setq org-edna-use-inheritance t)
|
||||
(org-edna-mode)
|
||||
(setq org-gtd-keyword-mapping
|
||||
'((todo . "TODO")
|
||||
(next . "NEXT")
|
||||
(wait . "WAIT")
|
||||
(done . "DONE")
|
||||
(canceled . "CNCL")))
|
||||
(setq org-gtd-custom-node-paths
|
||||
'(("Actionable" . '("~/memex/gtd.org" "Actions"))
|
||||
("Incubate" . '("~/memex/gtd.org" "Incubate"))))
|
||||
(org-gtd-mode)
|
||||
:bind (
|
||||
("C-c d c" . org-gtd-capture)
|
||||
("C-c d e" . org-gtd-engage)
|
||||
("C-c d p" . org-gtd-process-inbox)
|
||||
:map org-gtd-clarify-map
|
||||
("C-c c" . org-gtd-organize)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar org-gtd-directory org-directory)
|
||||
(defvar org-gtd-organize-hooks '(org-gtd-set-area-of-focus org-set-tags-command))
|
||||
(defvar org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
|
||||
(defvar org-gtd-areas-of-focus '(
|
||||
"Atoms"
|
||||
"Bits"
|
||||
"Cells"
|
||||
"Flags"
|
||||
"Business"
|
||||
"Wealth"
|
||||
"Learning"
|
||||
"Skills"
|
||||
"Privacy"
|
||||
"Archive"
|
||||
"Library"
|
||||
"Writing"
|
||||
"Health"
|
||||
"Home"
|
||||
"Family"
|
||||
"Social"
|
||||
"Egypt"
|
||||
)
|
||||
)
|
||||
(defvar org-gtd-clarify-show-horizons 'right)
|
||||
#+end_src
|
||||
|
||||
Logging
|
||||
#+begin_src elisp
|
||||
(setq org-log-into-drawer "LOGBOOK")
|
||||
#+end_src
|
||||
|
||||
Clocking work in drawer
|
||||
#+begin_src elisp :tangle no
|
||||
(setq org-clock-into-drawer t)
|
||||
#+end_src
|
||||
|
||||
Habits
|
||||
#+begin_src elisp :tangle no
|
||||
(setq org-habit-graph-column 80)
|
||||
(setq org-habit-show-habits-only-for-today nil)
|
||||
#+end_src
|
||||
|
||||
* Refile
|
||||
|
||||
org-refile targets
|
||||
#+begin_src elisp
|
||||
(setq org-refile-targets '((nil :maxlevel . 9)
|
||||
(org-agenda-files :maxlevel . 9)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Set type of refile targets completion
|
||||
#+begin_src elisp
|
||||
(setq org-outline-path-complete-in-steps nil)
|
||||
#+end_src
|
||||
|
||||
Allow refiling to new parents created on the go after confirmation
|
||||
#+begin_src elisp
|
||||
(setq org-refile-allow-creating-parent-nodes 'confirm)
|
||||
#+end_src
|
||||
175
projects/dotemacs/docs/emacs-media.org
Normal file
175
projects/dotemacs/docs/emacs-media.org
Normal file
@@ -0,0 +1,175 @@
|
||||
#+TITLE: Media and Books Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Read ebooks (calibredb)
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package calibredb
|
||||
:defer t
|
||||
:config
|
||||
(setq calibredb-format-all-the-icons t)
|
||||
(setq calibredb-format-icons-in-terminal t)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
;; Forcefully reset the variable after loading calibredb
|
||||
(defvar calibredb-root-dir (concat (getenv "HOME") "/library/books"))
|
||||
(defvar calibredb-db-dir (expand-file-name "metadata.db" calibredb-root-dir))
|
||||
; (defvar calibredb-library-alist (concat (getenv "HOME") "/library/books"))
|
||||
;; (defvar calibredb-search-page-max-rows 1000)
|
||||
(defvar calibredb-id-width 6)
|
||||
(defvar calibredb-title-width 100)
|
||||
(defvar calibredb-format-width 0)
|
||||
(defvar calibredb-date-width 0)
|
||||
(defvar calibredb-author-width 20)
|
||||
(defvar calibredb-comment-width 0)
|
||||
(defvar calibredb-tag-width 0)
|
||||
#+end_src
|
||||
|
||||
Some keybindings
|
||||
|
||||
#+begin_src elisp ~/.emacs.d/custom.el
|
||||
(defvar calibredb-show-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map "?" #'calibredb-entry-dispatch)
|
||||
(define-key map "o" #'calibredb-find-file)
|
||||
(define-key map "O" #'calibredb-find-file-other-frame)
|
||||
(define-key map "V" #'calibredb-open-file-with-default-tool)
|
||||
(define-key map "s" #'calibredb-set-metadata-dispatch)
|
||||
(define-key map "e" #'calibredb-export-dispatch)
|
||||
(define-key map "q" #'calibredb-entry-quit)
|
||||
(define-key map "y" #'calibredb-yank-dispatch)
|
||||
(define-key map "," #'calibredb-quick-look)
|
||||
(define-key map "." #'calibredb-dired-open)
|
||||
(define-key map "\M-/" #'calibredb-rga)
|
||||
(define-key map "\M-t" #'calibredb-set-metadata--tags)
|
||||
(define-key map "\M-a" #'calibredb-set-metadata--author_sort)
|
||||
(define-key map "\M-A" #'calibredb-set-metadata--authors)
|
||||
(define-key map "\M-T" #'calibredb-set-metadata--title)
|
||||
(define-key map "\M-c" #'calibredb-set-metadata--comments)
|
||||
map)
|
||||
"Keymap for `calibredb-show-mode'.")
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar calibredb-search-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map [mouse-3] #'calibredb-search-mouse)
|
||||
(define-key map (kbd "<RET>") #'calibredb-find-file)
|
||||
(define-key map "?" #'calibredb-dispatch)
|
||||
(define-key map "a" #'calibredb-add)
|
||||
(define-key map "A" #'calibredb-add-dir)
|
||||
(define-key map "c" #'calibredb-clone)
|
||||
(define-key map "d" #'calibredb-remove)
|
||||
(define-key map "D" #'calibredb-remove-marked-items)
|
||||
(define-key map "j" #'calibredb-next-entry)
|
||||
(define-key map "k" #'calibredb-previous-entry)
|
||||
(define-key map "l" #'calibredb-virtual-library-list)
|
||||
(define-key map "L" #'calibredb-library-list)
|
||||
(define-key map "n" #'calibredb-virtual-library-next)
|
||||
(define-key map "N" #'calibredb-library-next)
|
||||
(define-key map "p" #'calibredb-virtual-library-previous)
|
||||
(define-key map "P" #'calibredb-library-previous)
|
||||
(define-key map "s" #'calibredb-set-metadata-dispatch)
|
||||
(define-key map "S" #'calibredb-switch-library)
|
||||
(define-key map "o" #'calibredb-find-file)
|
||||
(define-key map "O" #'calibredb-find-file-other-frame)
|
||||
(define-key map "v" #'calibredb-view)
|
||||
(define-key map "V" #'calibredb-open-file-with-default-tool)
|
||||
(define-key map "," #'calibredb-quick-look)
|
||||
(define-key map "." #'calibredb-dired-open)
|
||||
(define-key map "y" #'calibredb-yank-dispatch)
|
||||
(define-key map "b" #'calibredb-catalog-bib-dispatch)
|
||||
(define-key map "e" #'calibredb-export-dispatch)
|
||||
(define-key map "r" #'calibredb-search-refresh-and-clear-filter)
|
||||
(define-key map "R" #'calibredb-search-clear-filter)
|
||||
(define-key map "q" #'calibredb-search-quit)
|
||||
(define-key map "m" #'calibredb-mark-and-forward)
|
||||
(define-key map "f" #'calibredb-toggle-favorite-at-point)
|
||||
(define-key map "x" #'calibredb-toggle-archive-at-point)
|
||||
(define-key map "h" #'calibredb-toggle-highlight-at-point)
|
||||
(define-key map "u" #'calibredb-unmark-and-forward)
|
||||
(define-key map "i" #'calibredb-edit-annotation)
|
||||
(define-key map (kbd "<DEL>") #'calibredb-unmark-and-backward)
|
||||
(define-key map (kbd "<backtab>") #'calibredb-toggle-view)
|
||||
(define-key map (kbd "TAB") #'calibredb-toggle-view-at-point)
|
||||
(define-key map "\M-n" #'calibredb-show-next-entry)
|
||||
(define-key map "\M-p" #'calibredb-show-previous-entry)
|
||||
(define-key map "/" #'calibredb-search-live-filter)
|
||||
(define-key map "\M-t" #'calibredb-set-metadata--tags)
|
||||
(define-key map "\M-a" #'calibredb-set-metadata--author_sort)
|
||||
(define-key map "\M-A" #'calibredb-set-metadata--authors)
|
||||
(define-key map "\M-T" #'calibredb-set-metadata--title)
|
||||
(define-key map "\M-c" #'calibredb-set-metadata--comments)
|
||||
map)
|
||||
"Keymap for `calibredb-search-mode'.")
|
||||
#+end_src
|
||||
|
||||
* Annotate PDFs and EPUBs (org-noter)
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package org-noter)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
(defvar org-noter-notes-search-path (list (concat org-directory "/library/books")))
|
||||
(defvar org-noter-default-notes-file-names '("books.org"))
|
||||
#+end_src
|
||||
|
||||
* Link PDFs (org-noter-pdftools)
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package org-noter-pdftools
|
||||
:after org-noter
|
||||
:config
|
||||
;; Add a function to ensure precise note is inserted
|
||||
(defun org-noter-pdftools-insert-precise-note (&optional toggle-no-questions)
|
||||
(interactive "P")
|
||||
(org-noter--with-valid-session
|
||||
(let ((org-noter-insert-note-no-questions (if toggle-no-questions
|
||||
(not org-noter-insert-note-no-questions)
|
||||
org-noter-insert-note-no-questions))
|
||||
(org-pdftools-use-isearch-link t)
|
||||
(org-pdftools-use-freepointer-annot t))
|
||||
(org-noter-insert-note (org-noter--get-precise-info)))))
|
||||
|
||||
;; fix https://github.com/weirdNox/org-noter/pull/93/commits/f8349ae7575e599f375de1be6be2d0d5de4e6cbf
|
||||
(defun org-noter-set-start-location (&optional arg)
|
||||
"When opening a session with this document, go to the current location.
|
||||
With a prefix ARG, remove start location."
|
||||
(interactive "P")
|
||||
(org-noter--with-valid-session
|
||||
(let ((inhibit-read-only t)
|
||||
(ast (org-noter--parse-root))
|
||||
(location (org-noter--doc-approx-location (when (called-interactively-p 'any) 'interactive))))
|
||||
(with-current-buffer (org-noter--session-notes-buffer session)
|
||||
(org-with-wide-buffer
|
||||
(goto-char (org-element-property :begin ast))
|
||||
(if arg
|
||||
(org-entry-delete nil org-noter-property-note-location)
|
||||
(org-entry-put nil org-noter-property-note-location
|
||||
(org-noter--pretty-print-location location))))))))
|
||||
(with-eval-after-load 'pdf-annot
|
||||
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* View EPUBs (nov.el)
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package nov
|
||||
:config
|
||||
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* Zotero (helm-bibtex)
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package helm-bibtex)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
(defvar bibtex-completion-bibliography '("~/bibliography/zotero.bib"))
|
||||
#+end_src
|
||||
46
projects/dotemacs/docs/emacs-misc.org
Normal file
46
projects/dotemacs/docs/emacs-misc.org
Normal file
@@ -0,0 +1,46 @@
|
||||
#+TITLE: Miscellaneous Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Browser (eww)
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package eww
|
||||
:bind* (("M-m g x" . eww)
|
||||
("M-m g :" . eww-browse-with-external-browser)
|
||||
("M-m g #" . eww-list-histories)
|
||||
("M-m g {" . eww-back-url)
|
||||
("M-m g }" . eww-forward-url))
|
||||
:config
|
||||
(progn
|
||||
(add-hook 'eww-mode-hook 'visual-line-mode)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* Manage Docker in Emacs
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package docker
|
||||
:bind ("C-c d" . docker)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* Periodic table of the elements
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package chemtable)
|
||||
#+end_src
|
||||
|
||||
* Accounting (beancount)
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package beancount
|
||||
:straight (beancount :type git :host github :repo "beancount/beancount-mode")
|
||||
:config
|
||||
(add-to-list 'auto-mode-alist '("\\.beancount\\'" . beancount-mode))
|
||||
(add-hook 'beancount-mode-hook #'outline-minor-mode)
|
||||
(define-key beancount-mode-map (kbd "C-c C-n") #'outline-next-visible-heading)
|
||||
(define-key beancount-mode-map (kbd "C-c C-p") #'outline-previous-visible-heading)
|
||||
(add-hook 'beancount-mode-hook #'flymake-bean-check-enable)
|
||||
)
|
||||
#+end_src
|
||||
233
projects/dotemacs/docs/emacs-org.org
Normal file
233
projects/dotemacs/docs/emacs-org.org
Normal file
@@ -0,0 +1,233 @@
|
||||
#+TITLE: Org Mode Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Org Mode
|
||||
|
||||
** Basic setup
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package org
|
||||
:config
|
||||
(defvar org-outline-path-complete-in-steps nil)
|
||||
:bind (("C-c l" . org-store-link)
|
||||
("C-c a" . org-agenda)
|
||||
("C-c c" . org-capture)
|
||||
:map org-mode-map)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar org-directory (concat (getenv "HOME") "/memex/"))
|
||||
#+end_src
|
||||
|
||||
** Looks
|
||||
|
||||
Basic
|
||||
#+begin_src elisp
|
||||
(defvar org-pretty-entities t) ; Improve org mode looks
|
||||
(defvar org-hide-emphasis-markers t) ; Hide emphasis markup
|
||||
(defvar org-num-mode nil)
|
||||
(defvar org-startup-folded 'shw2levels)
|
||||
#+end_src
|
||||
|
||||
Indentation of headers
|
||||
#+begin_src elisp
|
||||
(defvar org-startup-indented t) ; Indent org heirarchy
|
||||
(defvar org-adapt-indentation t)
|
||||
(defvar org-hide-leading-stars t) ; Minimal Outline
|
||||
(defvar org-odd-levels-only nil)
|
||||
#+end_src
|
||||
|
||||
Indentation of lists
|
||||
#+begin_src elisp
|
||||
(setq org-list-demote-modify-bullet t)
|
||||
#+end_src
|
||||
|
||||
Org-modern
|
||||
#+begin_src elisp
|
||||
(use-package org-modern
|
||||
:ensure t
|
||||
:config
|
||||
;; Choose some fonts
|
||||
(set-face-attribute 'default nil :family "sans-serif")
|
||||
(set-face-attribute 'variable-pitch nil :family "sans-serif")
|
||||
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
|
||||
|
||||
;; Edit settings
|
||||
(defvar org-auto-align-tags nil)
|
||||
(defvar org-tags-column 0)
|
||||
(defvar org-catch-invisible-edits 'show-and-error)
|
||||
(defvar org-special-ctrl-a/e t)
|
||||
(defvar org-insert-heading-respect-content t)
|
||||
|
||||
;; Org styling, hide markup etc.
|
||||
(defvar org-hide-emphasis-markers t)
|
||||
(defvar org-pretty-entities t)
|
||||
|
||||
;; Agenda styling
|
||||
(defvar org-agenda-tags-column 0)
|
||||
(defvar org-agenda-block-separator ?─)
|
||||
(defvar org-agenda-time-grid
|
||||
'((daily today require-timed)
|
||||
(800 1000 1200 1400 1600 1800 2000)
|
||||
" ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄"))
|
||||
(defvar org-agenda-current-time-string
|
||||
"◀── now ─────────────────────────────────────────────────")
|
||||
|
||||
;; Ellipsis styling
|
||||
(defvar org-ellipsis "…")
|
||||
(set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)
|
||||
|
||||
(global-org-modern-mode)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Highlight Sourcecode Syntax
|
||||
#+begin_src elisp
|
||||
(setq org-src-fontify-natively t)
|
||||
(setq org-src-tab-acts-natively t)
|
||||
#+end_src
|
||||
|
||||
Images
|
||||
#+begin_src elisp
|
||||
(setq org-startup-with-inline-images t)
|
||||
(setq org-image-actual-width '(300))
|
||||
#+end_src
|
||||
|
||||
** Capture
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar org-default-notes-file (concat org-directory "inbox.org"))
|
||||
#+end_src
|
||||
|
||||
*** Org-protocol
|
||||
|
||||
Linux configuration
|
||||
#+begin_src bash :tangle no
|
||||
[Desktop Entry]
|
||||
Name=org-protocol
|
||||
Comment=Intercept calls from emacsclient to trigger custom actions
|
||||
Categories=Other;
|
||||
Keywords=org-protocol;
|
||||
Icon=emacs
|
||||
Type=Application
|
||||
Exec=emacsclient -- %u
|
||||
Terminal=false
|
||||
StartupWMClass=Emacs
|
||||
MimeType=x-scheme-handler/org-protocol;
|
||||
#+end_src
|
||||
|
||||
#+begin_src bash :tangle no
|
||||
update-desktop-database ~/.local/share/applications/
|
||||
#+end_src
|
||||
|
||||
Basic configuration
|
||||
#+begin_src elisp
|
||||
(require 'org-protocol)
|
||||
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
|
||||
#+end_src
|
||||
|
||||
Org-protocol templates
|
||||
#+begin_src elisp :tangle ~/.emacs.d/custom.el
|
||||
(defvar org-capture-templates '(
|
||||
("p" "Protocol"
|
||||
entry
|
||||
(file "inbox.org")
|
||||
"* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
|
||||
)
|
||||
("L" "Protocol Link"
|
||||
entry
|
||||
(file "inbox.org")
|
||||
"* %? [[%:link][%:description]]\n:PROPERTIES:\n:TITLE: %:description\n:URI: %:link\n:CREATED: %U\n:END:"
|
||||
:prepend nil
|
||||
:empty-lines 1
|
||||
:created t
|
||||
:kill-buffer t
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(setq org-protocol-default-template-key "L")
|
||||
#+end_src
|
||||
|
||||
Convert Orgzly captures to org-protocol captures standard
|
||||
#+begin_src elisp
|
||||
(defun my/org-convert-orgzly-to-org-protocol ()
|
||||
"Reformat Orgzly bookmark at point to org-protocol bookmark."
|
||||
(interactive)
|
||||
(when (org-at-heading-p)
|
||||
(let ((headline (nth 4 (org-heading-components))))
|
||||
;; Find and store the link. Delete the link line.
|
||||
(search-forward-regexp "^https?://\\S-*" nil t)
|
||||
(let ((link (match-string 0)))
|
||||
(beginning-of-line)
|
||||
(kill-line)
|
||||
;; Delete any trailing blank spaces
|
||||
(org-back-to-heading)
|
||||
(end-of-line)
|
||||
(when (not (org-on-heading-p))
|
||||
(delete-char 1)
|
||||
)
|
||||
;; Set new headline
|
||||
(goto-char (org-entry-beginning-position))
|
||||
(org-edit-headline (format "[[%s][%s]]" link headline))
|
||||
;; Set new properties
|
||||
(org-set-property "TITLE" headline)
|
||||
(org-set-property "URI" link)
|
||||
(message "Reformatted Orgzly bookmark at point to org-protocol bookmark")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Exporting
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(setq org-export-with-smart-quotes t)
|
||||
(setq org-export-backends '(beamer html latex md))
|
||||
#+end_src
|
||||
|
||||
Export to EPUB
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package ox-epub)
|
||||
#+end_src
|
||||
|
||||
** org-attach
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar org-attach-id-dir (concat org-directory "/library"))
|
||||
#+end_src
|
||||
|
||||
** Enable shell scripting support in org-babel
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar org-babel-do-load-languages 'org-babel-load-languages '((shell . t)))
|
||||
#+end_src
|
||||
|
||||
** Insert org-mode links from clipboard
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package org-cliplink
|
||||
:bind
|
||||
(("C-x p i" . org-cliplink))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Deft
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package deft
|
||||
:commands (deft)
|
||||
:init
|
||||
(defvar deft-extensions '("org"))
|
||||
(defvar deft-recursive nil)
|
||||
(defvar deft-use-filename-as-title t)
|
||||
:config
|
||||
(defvar deft-directory org-directory)
|
||||
(defvar deft-recursive t)
|
||||
(defvar deft-strip-summary-regexp ":PROPERTIES:\n\\(.+\n\\)+:END:\n")
|
||||
(defvar deft-use-filename-as-title t)
|
||||
:bind ("C-c n d" . deft)
|
||||
)
|
||||
#+end_src
|
||||
140
projects/dotemacs/docs/emacs-roam.org
Normal file
140
projects/dotemacs/docs/emacs-roam.org
Normal file
@@ -0,0 +1,140 @@
|
||||
#+TITLE: Org-Roam Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Org-roam
|
||||
|
||||
** Basic org-roam setup
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package org-roam
|
||||
:init (setq org-roam-v2-ack t) ;; Acknowledge V2 upgrade
|
||||
:after org
|
||||
:config
|
||||
(org-roam-db-autosync-enable)
|
||||
(require 'org-roam-dailies)
|
||||
:bind (
|
||||
("C-c n f" . org-roam-node-find)
|
||||
("C-c n g" . org-roam-graph)
|
||||
("C-c n r" . org-roam-node-random)
|
||||
("C-c n h" . org-roam-node-convert-headline)
|
||||
("C-c n i" . org-roam-node-insert)
|
||||
("C-c n o" . org-id-get-create)
|
||||
("C-c n t" . org-roam-tag-add)
|
||||
("C-c n a" . org-roam-alias-add)
|
||||
("C-c n l" . org-roam-buffer-display-dedicated)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(setq org-roam-directory (concat org-directory "notes"))
|
||||
(setq org-roam-dailies-directory (concat org-directory "daily"))
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package sqlite3)
|
||||
(require 'sqlite3)
|
||||
#+end_src
|
||||
|
||||
Include subdirectories in org-roam
|
||||
#+begin_src elisp
|
||||
(setq org-roam-file-exclude-regexp "^[.][.]?/")
|
||||
#+end_src
|
||||
|
||||
** Display in org-roam-buffer
|
||||
#+begin_src elisp :tangle no
|
||||
(setq org-roam-mode-sections
|
||||
(list #'org-roam-backlinks-section
|
||||
#'org-roam-reflinks-section
|
||||
#'org-roam-unlinked-references-section
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Filter org-roam nodes find by tag
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(defun my/org-roam-node-has-tag (node tag)
|
||||
"Filter function to check if the given NODE has the specified TAG."
|
||||
(member tag (org-roam-node-tags node))
|
||||
)
|
||||
|
||||
(defun my/org-roam-node-find-by-tag ()
|
||||
"Find and open an Org-roam node based on a specified tag."
|
||||
(interactive)
|
||||
(let ((tag (read-string "Enter tag: ")))
|
||||
(org-roam-node-find nil nil (lambda (node) (my/org-roam-node-has-tag node tag))))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** org-roam-capture templates
|
||||
#+begin_src elisp
|
||||
(setq org-roam-capture-templates
|
||||
'(
|
||||
("L" "link" plain
|
||||
(function org-roam--capture-get-point)
|
||||
"%?"
|
||||
:file-name "web/%<%Y-%m-%dT%H%M%S>.org"
|
||||
:head "#+TITLE: ${title}\n#+CREATED: %<%Y-%m-%dT%H%M%S>"
|
||||
:immediate-finish t
|
||||
:unnarrowed t
|
||||
)
|
||||
|
||||
("h" "hugo post" plain
|
||||
"%?"
|
||||
:target (file+head "posts/${slug}.org"
|
||||
"#+TITLE: ${title}\n#+DATE: %U\n#+HUGO_BASE_DIR: ~/gharbeia.net\n#+HUGO_SECTION: ./posts\n#+HUGO_AUTO_SET_LASTMOD: t\n#+HUGO_TAGS: article\n#+HUGO_DRAFT: true\n")
|
||||
:immediate-finish t
|
||||
:unnarrowed t
|
||||
)
|
||||
|
||||
("p" "person" plain
|
||||
"%?"
|
||||
:if-new (file+head "people/${slug}.org"
|
||||
"#+TITLE: ${title}")
|
||||
:immediate-finish t
|
||||
:unnarrowed t
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(setq org-roam-dailies-capture-templates
|
||||
'(
|
||||
("d" "daily" plain
|
||||
""
|
||||
:target ("file+heaed %<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n\n")
|
||||
:immediate-finish t
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Move org header to org-roam-daily
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(defun my/org-move-entry-to-daily-notes ()
|
||||
"Move the current org-mode headline to the daily notes file based on its :CREATED: property."
|
||||
(interactive)
|
||||
(let*
|
||||
(
|
||||
(created-prop (org-entry-get nil "CREATED"))
|
||||
(created-date (when created-prop
|
||||
(org-parse-time-string created-prop)))
|
||||
(year (nth 5 created-date)) ; Extract year (6th element)
|
||||
(month (nth 4 created-date)) ; Extract month (5th element)
|
||||
(day (nth 3 created-date)) ; Extract day (4th element)
|
||||
(target-date (format "%04d-%02d-%02d" year month day)) ; Format date string
|
||||
(target-file (org-roam-dailies-goto target-date))
|
||||
)
|
||||
(when target-file
|
||||
(org-cut-subtree)
|
||||
(find-file target-file)
|
||||
(goto-char (point-max))
|
||||
(unless (bolp) (newline))
|
||||
(org-paste-subtree)
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
73
projects/dotemacs/docs/emacs-shell.org
Normal file
73
projects/dotemacs/docs/emacs-shell.org
Normal file
@@ -0,0 +1,73 @@
|
||||
#+TITLE: Shell Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Shell
|
||||
|
||||
** Bash completion
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package bash-completion
|
||||
:config
|
||||
(require 'bash-completion)
|
||||
(bash-completion-setup)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(defvar shell-dynamic-complete-functions t)
|
||||
#+end_src
|
||||
|
||||
** Eshell
|
||||
|
||||
Add programmable bash completion to Emacs shell-mode
|
||||
#+begin_src elisp :tangle no
|
||||
(require 'bash-completion)
|
||||
(add-hook 'eshell-mode-hook
|
||||
(lambda ()
|
||||
(add-hook 'completion-at-point-functions
|
||||
'bash-completion-capf-nonexclusive nil t
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Use colors in eshell
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package xterm-color
|
||||
:commands (xterm-color-filter)
|
||||
)
|
||||
|
||||
(use-package eshell
|
||||
:after xterm-color
|
||||
:config
|
||||
(define-key eshell-hist-mode-map (kbd "M-r") #'consult-history)
|
||||
(add-hook 'eshell-mode-hook
|
||||
(lambda ()
|
||||
(setenv "TERM" "xterm-256color")))
|
||||
(add-hook 'eshell-before-prompt-hook (setq xterm-color-preserve-properties t))
|
||||
(add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
|
||||
(setq eshell-output-filter-functions
|
||||
(remove 'eshell-handle-ansi-color eshell-output-filter-functions)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Eshell completion
|
||||
#+begin_src elisp :tangle no
|
||||
(add-hook 'eshell-mode-hook
|
||||
(lambda ()
|
||||
(add-hook 'completion-at-point-functions
|
||||
'bash-completion-capf-nonexclusive nil t)))
|
||||
#+end_src
|
||||
|
||||
Emulate A Terminal (EAT)
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package eat
|
||||
:config
|
||||
;; For `eat-eshell-mode'.
|
||||
(add-hook 'eshell-load-hook #'eat-eshell-mode)
|
||||
|
||||
;; For `eat-eshell-visual-command-mode'.
|
||||
(add-hook 'eshell-load-hook #'eat-eshell-visual-command-mode)
|
||||
)
|
||||
#+end_src
|
||||
255
projects/dotemacs/docs/emacs-writing.org
Normal file
255
projects/dotemacs/docs/emacs-writing.org
Normal file
@@ -0,0 +1,255 @@
|
||||
#+TITLE: Reading and Writing Configuration
|
||||
#+PROPERTY: header-args :tangle ~/.emacs.d/config.el
|
||||
|
||||
* Text and Case
|
||||
|
||||
** Convert DOuble capitals to single capitals
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(defun my/dcaps-to-scaps ()
|
||||
"Convert word in DOuble CApitals to Single Capitals."
|
||||
(interactive)
|
||||
(and (= ?w (char-syntax (char-before)))
|
||||
(save-excursion
|
||||
(and (if (called-interactively-p)
|
||||
(skip-syntax-backward "w")
|
||||
(= -3 (skip-syntax-backward "w"))
|
||||
)
|
||||
(let (case-fold-search)
|
||||
(looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]")
|
||||
)
|
||||
(capitalize-word 1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
Then, let’s define a minor mode for it to be activated.
|
||||
#+begin_src elisp :tangle no
|
||||
(define-minor-mode my-dubcaps-mode
|
||||
"Toggle 'my-dubcaps-mode' and convert words in DOuble CApitals to Single Capitals as you type."
|
||||
:init-value nil
|
||||
:lighter (" DC")
|
||||
(if my-dubcaps-mode
|
||||
(add-hook 'post-self-insert-hook #'my/dcaps-to-scaps nil 'local)
|
||||
(remove-hook 'post-self-insert-hook #'my/dcaps-to-scaps 'local)))
|
||||
#+end_src
|
||||
|
||||
Finally, let’s add a hook so that it is on for all the text files Emacs opens.
|
||||
#+begin_src elisp :tangle no
|
||||
(add-hook 'text-mode-hook #'my-dubcaps-mode)
|
||||
#+end_src
|
||||
|
||||
Also, since we add a minor mode string (it might be useful sometimes), currently I prefer to diminish it.
|
||||
#+begin_src elisp :tangle no
|
||||
(defun my/diminish-dubcaps ()
|
||||
(interactive)
|
||||
(diminish 'my-dubcaps-mode ""))
|
||||
(add-hook 'my-dubcaps-mode-hook 'my/diminish-dubcaps)
|
||||
#+end_src
|
||||
|
||||
* Reading and Writing
|
||||
|
||||
** Move correctly over camelCased words
|
||||
|
||||
#+begin_src elisp
|
||||
(subword-mode)
|
||||
#+end_src
|
||||
|
||||
** Understand the more common sentence with double space
|
||||
|
||||
#+begin_src elisp
|
||||
(setq sentence-end-double-space nil)
|
||||
#+end_src
|
||||
|
||||
** Join lines into paragraph
|
||||
|
||||
#+begin_src elisp
|
||||
(defun my/fill-or-unfill-paragraph (&optional unfill region)
|
||||
"Fill paragraph (or REGION). With the prefix argument UNFILL, fill it instead."
|
||||
(interactive (progn
|
||||
(barf-if-buffer-read-only)
|
||||
(list (if current-prefix-arg 'fill) t)))
|
||||
(let ((fill-column (if unfill fill-column (point-max))))
|
||||
(fill-paragraph nil region)))
|
||||
|
||||
(bind-key "M-q" 'my/fill-or-unfill-paragraph)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(defun my/fill-or-unfill-all-paragraphs (&optional unfill)
|
||||
"Fill or unfill all paragraphs in the current buffer.
|
||||
With the prefix argument UNFILL, fill them instead."
|
||||
(interactive (list (if current-prefix-arg 'fill)))
|
||||
(let ((fill-column (if unfill fill-column (point-max))))
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (not (eobp))
|
||||
(fill-paragraph nil t)
|
||||
(forward-paragraph)))))
|
||||
|
||||
(bind-key "M-Q" 'my/fill-or-unfill-all-paragraphs)
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(remove-hook 'text-mode-hook #'turn-on-auto-fill)
|
||||
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)
|
||||
#+end_src
|
||||
|
||||
** Expand some words with auto-correct
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(setq save-abbrevs 'silently)
|
||||
(setq-default abbrev-mode t)
|
||||
#+end_src
|
||||
|
||||
** ediff
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
|
||||
(setq ediff-split-window-function 'split-window-horizontally)
|
||||
#+end_src
|
||||
|
||||
** tramp
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(setq tramp-default-method "ssh"
|
||||
tramp-backup-directory-alist backup-directory-alist
|
||||
tramp-ssh-controlmaster-options "ssh")
|
||||
#+end_src
|
||||
|
||||
** Clean up space
|
||||
#+begin_src elisp :tangle no
|
||||
(bind-key "M-SPC" 'cycle-spacing)
|
||||
#+end_src
|
||||
|
||||
** Transform <a href> links into org links
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(defun my/transform-html-links-to-org ()
|
||||
"Transform all HTML <a> links in the current buffer into 'org-mode' links."
|
||||
(interactive)
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward "<a href=\"\\(.*?\\)\">\\(.*?\\)</a>" nil t)
|
||||
(replace-match (org-make-link-string (match-string 1) (match-string 2)))))
|
||||
#+end_src
|
||||
|
||||
** Count words per minute
|
||||
#+begin_src elisp :tangle no
|
||||
(require 'org-clock)
|
||||
(defun my/org-entry-wpm ()
|
||||
(interactive)
|
||||
(save-restriction
|
||||
(save-excursion
|
||||
(org-narrow-to-subtree)
|
||||
(goto-char (point-min))
|
||||
(let* ((words (count-words-region (point-min) (point-max)))
|
||||
|
||||
(minutes (org-clock-sum-current-item))
|
||||
(wpm (/ words minutes)))
|
||||
(message "WPM: %d (words: %d, minutes: %d)" wpm words minutes)
|
||||
(kill-new (number-to-string wpm))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Enable dict mode
|
||||
#+begin_src elisp :tangle no
|
||||
(setq dictionary-server "automatic")
|
||||
#+end_src
|
||||
|
||||
** Pick out passive voice and weasel words
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package writegood-mode
|
||||
:diminish writegood-mode
|
||||
:config
|
||||
(progn (add-hook 'text-mode-hook 'writegood-mode))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Org-babel docker
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package ob-docker-build
|
||||
:straight (ob-docker-build :type git :host github :repo "ifitzpat/ob-docker-build")
|
||||
:defer t
|
||||
:config
|
||||
(add-to-list 'org-babel-load-languages '(docker-build . t))
|
||||
(org-babel-do-load-languages 'org-babel-load-languages org-babel-load-languages)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
* Spelling and syntax
|
||||
|
||||
** Spell checking
|
||||
|
||||
This requires installation of hunspell
|
||||
#+begin_src bash :tangle no
|
||||
sudo apt install hunspell
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package flyspell
|
||||
:config (setq ispell-program-name "hunspell"
|
||||
ispell-default-dictionary "en_US"
|
||||
)
|
||||
:diminish (flyspell-mode . "φ")
|
||||
:hook (text-mode . flyspell-mode)
|
||||
:bind (
|
||||
("M-<f7>" . flyspell-buffer)
|
||||
("<f7>" . flyspell-word)
|
||||
("C-;" . flyspell-auto-correct-previous-word)
|
||||
)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Flyspell correct
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package flyspell-correct
|
||||
:after flyspell
|
||||
:bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Flycheck
|
||||
|
||||
Needs external checkers installed
|
||||
|
||||
#+begin_src elisp
|
||||
(use-package flycheck
|
||||
:init (global-flycheck-mode)
|
||||
:diminish (flycheck-mode . "")
|
||||
:config
|
||||
(add-hook 'after-init-hook #'global-flycheck-mode)
|
||||
(setq flycheck-emacs-lisp-load-path 'inherit)
|
||||
(setq flycheck-emacs-lisp-load-path (concat user-emacs-directory "straight/build"))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Flycheck bash
|
||||
#+begin_src bash :tangle no
|
||||
sudo apt install devscripts
|
||||
#+end_src
|
||||
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package flycheck-checkbashisms
|
||||
:config
|
||||
(flycheck-checkbashisms-setup)
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Yaml
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package yaml-mode
|
||||
:config
|
||||
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
|
||||
(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode))
|
||||
)
|
||||
#+end_src
|
||||
|
||||
** Docker
|
||||
#+begin_src elisp :tangle no
|
||||
(use-package docker-compose-mode)
|
||||
#+end_src
|
||||
2138
projects/dotemacs/docs/emacs.org
Normal file
2138
projects/dotemacs/docs/emacs.org
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user