refactor: Move Emacs config from system/ to projects/dotemacs/

- Delete deprecated system/ configuration files
- Update projects/dotemacs/modules/ with reorganized config
- Add .opencode/ directory for agent state
- Clean up attachments and unused documentation files
This commit is contained in:
2026-04-25 18:41:20 -04:00
parent 43c225a4b5
commit cc6c552d5a
75 changed files with 3263 additions and 5545 deletions

102
.opencode/AGENTS.md Normal file
View File

@@ -0,0 +1,102 @@
# OpenCortex Agent Mandate
This file defines the operating policies and engineering guidelines that all autonomous agents MUST follow.
## Vision
- **Pure Lisp + Org-mode**: All intelligence implemented in Lisp, all documentation in Org-mode
- **No JSON, No YAML**: Thin harness, fat skills
- **Constraint**: No temporary scripts in opencortex repo - use `/home/user/memex/system/` instead
## Current Goal
- **v0.2.0**: Self-Improvement + Local LLMs
- org-skill-self-edit (self-modification)
- org-skill-emacs-edit (full org-mode manipulation)
- Local vector search (Ollama embeddings)
- Tool permission tiers (ask/allow/deny)
- Skill hot-reload ✅ DONE
- Engineering Standards skill ✅ DONE
- Literate Programming skill ✅ DONE
## Wake-Up Protocol
When this agent starts, it MUST:
1. **Read this file** (`~/.opencode/AGENTS.md`)
2. **Query the skill catalog**: Before any analysis, check if a skill covers the problem domain
- `(list-skills)` to see all loaded skills
- `(find-skill :keyword)` to check for a specific domain
- Read the skill's org file if found
3. **Verify git status**: Working tree MUST be clean before modification
4. **Read `gtd.org`**: Load current task context from the roadmap
5. **Enter lifecycle**: Follow the Engineering Standards lifecycle (Phase 0 → A → B → C → D → E)
Rationale: Raw LLM reasoning is a fallback, not a starting point. The skill layer encodes the system's accumulated wisdom. Ignoring skills creates drift.
## Engineering Standards
The Engineering Standards skill (`opencortex.skills.org-skill-engineering-standards`) defines the full lifecycle. The summaries below are reminders; the skill org file is authoritative.
### Phase 0: Before You Think
**Skill-First Query Rule**: Before analysis, debugging, or implementation, query the skill catalog. If a relevant skill exists, follow its mandates. Do not duplicate logic.
### Phase A: Design (Test-First)
1. **Define success criteria first** — Write the test or PROTOCOL that proves the feature works
2. **Break the design with chaos** — Three tiers of adversarial testing:
- *Deterministic chaos*: Scripted regression tests on every change
- *Probabilistic chaos*: Randomized fuzzing on every major release
- *Stress chaos*: Load and resource starvation during hardening sprints
### Phase B: Commit (Recovery Point)
3. **Commit Before Modify** — Commit and push (if network available) before any file changes
### Phase C: Build (Implementation)
4. **Literate Programming** — All logic in Org files; generated `.lisp` is derived, not authored
5. **Function-Block Granularity** — One function per `#+begin_src lisp` block
6. **Tangle Mandate** — Edit Org only; never touch generated `.lisp`
7. **Configuration Externalization** — No hardcoded values; use `.env.example`
8. **Org as Thinking Medium** — Document investigation before fixing
### Phase D: Validate (Proof)
9. **Test Verification** — Run the full suite. A change that breaks tests is damage, not a fix.
### Phase E: Document (Audit Trail)
10. **Decision Audit Trail** — Document root cause, options, tradeoffs, and rationale
11. **Stop-and-Wait** — For major changes, propose strategy, state "Waiting for user feedback," yield turn
12. **GTD Synchronization** — Update `gtd.org` with TODO headlines before marking complete
## Literate Programming Rules
The Literate Programming skill (`opencortex.skills.org-skill-literate-programming`) enforces Org discipline:
1. **One Function, One Block** — No bundling multiple definitions
2. **Org-Mode Evaluation Gate**`C-c C-c` after every block change
3. **Pre-Tangle Structural Check** — Verify paren balance before tangling
4. **No Direct `.lisp` Edits** — All changes flow through Org
5. **Code and Prose Together** — Every block preceded by explanatory text
Violating these rules corrupts the skill loader and causes boot failure (as seen in the 2026-04-25 incident).
## Agent Workflow
- **Boot Sequence**: Read AGENTS.md → query skills → verify git → read gtd.org
- **Before Any Modification**: Commit first (Commit Before Modify rule)
- **Plan Mode**: Draft PROTOCOL.md before complex implementations
- **Testing**: Run FiveAM test suite + chaos tests before marking task complete
- **Completion**: Update gtd.org, commit, sync with user
## References
- opencortex repo: `/home/user/memex/projects/opencortex`
- Engineering Standards: `/home/user/memex/projects/opencortex/skills/org-skill-engineering-standards.org`
- Literate Programming: `/home/user/memex/projects/opencortex/skills/org-skill-literate-programming.org`
- Policy Skill: `/home/user/memex/projects/opencortex/skills/org-skill-policy.org`
- Roadmap: `/home/user/memex/gtd.org`
- README: `/home/user/memex/projects/opencortex/README.org`

View File

@@ -5,7 +5,7 @@
#+FILETAGS: :memex:psf:opencortex:lisp:sovereignty:
* Overview
The *Master Memex* is a sovereign, neurosymbolic intelligence organization system. It is not merely a collection of notes, but a live, programmable environment—a **Personal Software Foundry (PSF)**—where a human (the Sovereign Executive) and agentic co-processes (the `opencortex` kernel and Gemini CLI) collaborate within a shared address space.
The *Master Memex* is a sovereign, neurosymbolic intelligence organization system. It is not merely a collection of notes, but a live, programmable environment—a **Personal Software Foundry (PSF)**—where a human (the Sovereign Executive) and agentic co-processes (the `opencortex` kernel and opencode) collaborate within a shared address space.
This system synthesizes three core organizational methodologies into a unified "Lisp Machine" experience:
- *Zettelkasten:* For atomic, evergreen, and interlinked knowledge.
@@ -36,7 +36,7 @@ The Memex is inhabited by autonomous agents that operate as "Probabilistic" (pro
** [[file:projects/opencortex/README.org][opencortex (The Kernel)]]
A Common Lisp microkernel that maintains a live, threaded Object-Store in RAM. It uses Org-mode as its native Abstract Syntax Tree (AST), allowing it to "perceive" and "act" on the Memex with structural precision.
** Gemini CLI
** opencode
A strategic orchestrator that handles large-scale batch tasks, research, and planning. It operates according to the *PSF Consensus Loop* (Demand -> Blueprint -> Success -> Build -> Chaos -> Memory).
* The Cognitive Architecture: A Session-less Mind

View File

@@ -1,36 +0,0 @@
# Implementation Plan: The Micro-Loader (Boot Sequence Refactor)
## Objective
Consolidate and harden the kernel's skill-loading logic into a stateful "Micro-Loader." This improves boot reliability, provides clear error reporting for malformed skills, and centralizes all capability management within the `skills` module.
## Key Files & Context
- **Target:** `projects/opencortex/literate/skills.org` (Consolidating logic here).
- **Target:** `projects/opencortex/literate/core.org` (Moving `load-all-skills` out of here).
- **Mandate:** Syntax Pre-flight and Dependency Assertion.
## Implementation Steps
### 1. Define the Skill Catalog
- Introduce `*skill-catalog*` in `skills.lisp` to track metadata and load status for every skill file found in `SKILLS_DIR`.
- Statuses: `:discovered`, `:loading`, `:ready`, `:failed`.
### 2. Refactor `load-skill-from-org` (Harden)
- **Syntax Check:** Invoke `validate-lisp-syntax` before evaluation.
- **Dependency Check:** If `#+DEPENDS_ON` refers to a skill that failed or is missing, mark this skill as `:failed` immediately with a clear error.
- **Detailed Logging:** Record the specific reason for failure (syntax, timeout, runtime error) in the catalog.
### 3. Implement `initialize-all-skills` (The Orchestrator)
- Move the directory scanning and loop logic from `core.lisp` into `skills.lisp`.
- This function will:
1. Scan `SKILLS_DIR`.
2. Populate the catalog.
3. Run the topological sort.
4. Execute the load loop with timeouts.
5. Print a final "Boot Summary" report.
### 4. Simplify Kernel Boot
- Update `start-daemon` in `core.lisp` to call `(initialize-all-skills)` instead of the old `load-all-skills`.
## Phase E: Chaos (Verification)
- **Integrity Test:** Add a test that verifies `initialize-all-skills` correctly identifies a missing dependency and prevents the dependent skill from attempting to load.
- **Report Test:** Verify that the skill catalog correctly reflects the status of loaded vs. failed skills.

15
fedora-43-repos.repo Normal file
View File

@@ -0,0 +1,15 @@
[fedora]
name=Fedora 43 - x86_64
enabled=1
metadata_expire=1h
baseurl=https://mirrors.fedoraproject.org/metalink?repo=fedora-43&arch=x86_64
type=rpm-md
gpgcheck=0
[updates]
name=Fedora 43 - x86_64 - Updates
enabled=1
metadata_expire=1h
baseurl=https://mirrors.fedoraproject.org/metalink?repo=fedora-43-updates&arch=x86_64
type=rpm-md
gpgcheck=0

View File

@@ -157,3 +157,45 @@ This is the inbox. Everything goes in here when you capture it.
:CREATED: [2026-04-17 Fri 14:52]
:END:
* [[https://www.jori.com/en/products/pacific-jr-9700][Pacific Pure | Sofas | Product | Design furniture | JORI]] :furniture:years:
:PROPERTIES:
:TITLE: Pacific Pure | Sofas | Product | Design furniture | JORI
:URI: https://www.jori.com/en/products/pacific-jr-9700
:CREATED: [2026-04-21 Tue 15:25]
:END:
* [[https://papers.ssrn.com/sol3/papers.cfm?abstract_id=6372438][AI Agent Traps by Matija Franklin, Nenad Tomašev, Julian Jacobs, Joel Z. Leibo, Simon Osindero :: SSRN]]
:PROPERTIES:
:TITLE: AI Agent Traps by Matija Franklin, Nenad Tomašev, Julian Jacobs, Joel Z. Leibo, Simon Osindero :: SSRN
:URI: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=6372438
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://www.storagereview.com/review/comino-grando-rtx-pro-6000-review-768gb-of-vram-in-a-liquid-cooled-4u-chassis][Comino Grando RTX PRO 6000 Review: 768GB of VRAM in a Liquid-Cooled 4U Chassis - StorageReview.com]]
:PROPERTIES:
:TITLE: Comino Grando RTX PRO 6000 Review: 768GB of VRAM in a Liquid-Cooled 4U Chassis - StorageReview.com
:URI: https://www.storagereview.com/review/comino-grando-rtx-pro-6000-review-768gb-of-vram-in-a-liquid-cooled-4u-chassis
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://x.com/elvissun/status/2044784140831301728/photo/1][Elvis on X: "some agentic engineering realization: stop reviewing code. start reviewing contracts. and here's what i mean. the highest leverage work right now is drawing the right boundaries in your system. i've been splitting the system into multiple sub-systems, each with clearly defined https://t.co/Hy0d9WHI1m" / X]]
:PROPERTIES:
:TITLE: Elvis on X: "some agentic engineering realization: stop reviewing code. start reviewing contracts. and here's what i mean. the highest leverage work right now is drawing the right boundaries in your system. i've been splitting the system into multiple sub-systems, each with clearly defined https://t.co/Hy0d9WHI1m" / X
:URI: https://x.com/elvissun/status/2044784140831301728/photo/1
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://x.com/i/status/2044307601463357791][EverMars on X: "Respect to the Man Chasing AI Immortality, Even Though He's Freeloading Off Our Platform" / X]]
:PROPERTIES:
:TITLE: EverMars on X: "Respect to the Man Chasing AI Immortality, Even Though He's Freeloading Off Our Platform" / X
:URI: https://x.com/i/status/2044307601463357791
:CREATED: [2026-04-21 Tue 15:26]
:END:
* [[https://x.com/i/status/2045289299269070978][Seth Howes on X: "Ive wanted to do this for a decade. But I never did - I refuse to give any company my DNA. It is me. So this week I sequenced my genome entirely at home. Literally on my kitchen table. I never exposed my DNA sequence to the internet. Not at any point. I used a MinION to do https://t.co/qCzXIGxWsy" / X]]
:PROPERTIES:
:TITLE: Seth Howes on X: "Ive wanted to do this for a decade. But I never did - I refuse to give any company my DNA. It is me. So this week I sequenced my genome entirely at home. Literally on my kitchen table. I never exposed my DNA sequence to the internet. Not at any point. I used a MinION to do https://t.co/qCzXIGxWsy" / X
:URI: https://x.com/i/status/2045289299269070978
:CREATED: [2026-04-21 Tue 15:27]
:END:

BIN
inbox/2512.24601v2.pdf Normal file

Binary file not shown.

View File

@@ -1,32 +0,0 @@
# Implementation Plan: Component IV - Peripheral Vision Extraction
## Objective
Implement a sophisticated "Foveal-Peripheral" context model. This ensures the agent has high-resolution focus on the current task (Foveal) while maintaining a low-resolution "skeletal" awareness of the broader Memex structure (Peripheral), optimized for token efficiency and reasoning accuracy.
## Key Files & Context
- **Target:** `projects/opencortex/literate/context.org` (Source of `src/context.lisp`)
- **Core Concept:** Deep pruning of the Org AST based on semantic distance and structural hierarchy.
## Implementation Steps
### 1. Identify Foveal Focus
- Extend the `SIGNAL` structure processing to identify a `target-id` (the current headline being operated on).
### 2. Implement Tree Pruning (`context-extract-peripheral-vision`)
- Create a recursive function that walks the Object Store starting from the root (or active projects).
- **Rule A (Foveal):** If the node matches `target-id`, include it and its immediate children in **Full Resolution** (Content + Attributes).
- **Rule B (Peripheral):** For ancestors and siblings of the target, include only **Title and ID**.
- **Rule C (Background):** For unrelated nodes, omit entirely or include only at Level 1.
### 3. AST to Org Renderer (`context-render-to-org`)
- Implement a serializer that transforms our `org-object` structures back into valid Org-mode strings.
- This allows the LLM to "see" the Memex in its native habitat.
### 4. Integrate with `context-assemble-global-awareness`
- Update this function to use the new extraction and rendering logic.
- Ensure it respects a maximum token/character budget to prevent context overflow.
## Phase E: Chaos (Verification)
- **Structural Test:** Verify that ancestors are rendered as "skeletons" (no body text).
- **Foveal Test:** Verify that the target node is rendered with its full body text.
- **Budget Test:** Verify that the output string stays within defined limits even for large Memex structures.

View File

@@ -1,37 +0,0 @@
# Implementation Plan: Reactive Signal Pipeline Refactor
## Objective
Refactor the monolithic recursive `cognitive-cycle` into a functional, gate-based `reactive-signal-pipeline`. This flattens the execution stack, enables multi-backend consensus, and improves observability according to Component VII of the evolutionary roadmap.
## Key Files & Context
- **Target:** `projects/opencortex/literate/core.org` (Source of `src/core.lisp`)
- **Architectural Reference:** `projects/opencortex/literate/evolution.org`
## Implementation Steps
### 1. Define the Signal Structure
Transition from raw plists to a structured `:SIGNAL` format that tracks state as it moves through the pipeline.
- Attributes: `:status`, `:payload`, `:context`, `:depth`, `:proposals`, `:reply-stream`.
### 2. Implement the Pipeline Gates
Extract existing logic from `cognitive-cycle` into discrete functional gates:
- **`perceive-gate`**: Normalizes input, updates `*object-store*`.
- **`neuro-gate`**: Invokes Probabilistic Engine. Support for future parallel backend calls.
- **`consensus-gate`**: (New) Selects the best proposal from multiple backends (initially a pass-through for the single proposal).
- **`decide-gate`**: Invokes Deterministic Engine safety checks.
- **`dispatch-gate`**: Executes tools or physical actuators.
### 3. Implement the Pipeline Orchestrator (`process-signal`)
Create a function that moves a signal through the sequence of gates.
- **Flattening Recursion:** If `dispatch-gate` results in a tool output or error, it MUST NOT call the pipeline recursively. Instead, it returns a new `:SIGNAL` with `depth + 1`, which the orchestrator then re-injects into the top of the pipe via a loop or queue.
### 4. Refactor `inject-stimulus`
Update `inject-stimulus` to initialize a Signal and hand it to the `process-signal` pipeline instead of `cognitive-cycle`.
### 5. Cleanup
Remove the obsolete `cognitive-cycle` function and update `literate/core.org` documentation/diagrams to reflect the new architecture.
## Verification & Testing (Phase E: Chaos)
- **Unit Tests:** Verify each gate function in isolation.
- **Pipeline Test:** Simulate a complex multi-turn interaction (e.g., User Prompt -> Tool Call -> Tool Result -> LLM Final Answer) and ensure the stack depth remains flat.
- **Immune System Test:** Verify that the depth limit (Max depth 10) still correctly terminates runaway loops.

View File

@@ -1,26 +0,0 @@
#+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.

View File

@@ -1,27 +0,0 @@
#+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

View File

@@ -1,104 +0,0 @@
#+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

View File

@@ -1,169 +0,0 @@
#+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

View File

@@ -1,157 +0,0 @@
#+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

View File

@@ -1,175 +0,0 @@
#+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

View File

@@ -1,46 +0,0 @@
#+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

View File

@@ -1,233 +0,0 @@
#+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

View File

@@ -1,140 +0,0 @@
#+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

View File

@@ -1,73 +0,0 @@
#+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

View File

@@ -1,255 +0,0 @@
#+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, lets 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, lets 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

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,10 @@
(let ((config-dir "~/memex/system/"))
(let ((config-dir "~/memex/projects/dotemacs/modules/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load UI and theme settings
(org-babel-load-file (expand-file-name "emacs-ui.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
;; (org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))

View File

@@ -6,10 +6,13 @@
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
(let ((config-dir "~/memex/system/"))
(let ((config-dir "~/memex/projects/dotemacs/modules/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load UI and theme settings
(org-babel-load-file (expand-file-name "emacs-ui.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
;; (org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))

View File

@@ -1,21 +1,120 @@
#+TITLE: Emacs AI Configuration
#+property: header-args :tangle ~/.emacs.d/modules/ai.el
#+TITLE: AI Configuration
#+PROPERTY: header-args :tangle yes
* AI Settings
** Ellama
#+begin_src elisp :tangle yes
;; 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 :tangle yes
(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
* ellama
#+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)
(ellama-session-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 yes
(use-package gptel)
#+end_src
#+begin_src elisp :tangle yes
(setq gptel-api-key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net"))
#+end_src
#+begin_src elisp :tangle yes
(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 yes
(use-package elisa
:defer t
: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
* Providers
#+begin_src elisp
(setq llm-debug t)
;; Note: API keys should be handled via auth-source as seen in original config
** OpenCortex (Local Foundry)
#+begin_src elisp :tangle yes
(use-package opencortex
:straight nil
:load-path "~/.local/share/opencortex/src"
:commands (opencortex-connect opencortex-disconnect)
:init
(setq opencortex-host "127.0.0.1")
(setq opencortex-port 9105)
(setq opencortex-executable-path "~/.local/share/opencortex/bin/opencortex-server")
:config
(message "opencortex: Local brain configured at %s" opencortex-executable-path))
#+end_src

View File

@@ -16,6 +16,36 @@
(unless (file-directory-p (expand-file-name "~/.emacs.d/straight/versions")) (make-directory (expand-file-name "~/.emacs.d/straight/versions") t))
(use-package org)
(use-package ef-themes
:config
;; If you like two specific themes and want to switch between them, you
;; can specify them in `ef-themes-to-toggle' and then invoke the command
;; `ef-themes-toggle'. All the themes are included in the variable
;; `ef-themes-collection'.
(setq ef-themes-to-toggle '(ef-summer ef-winter))
(setq ef-themes-headings ; read the manual's entry or the doc string
'((0 variable-pitch light 1.9)
(1 variable-pitch light 1.8)
(2 variable-pitch regular 1.7)
(3 variable-pitch regular 1.6)
(4 variable-pitch regular 1.5)
(5 variable-pitch 1.4) ; absence of weight means `bold'
(6 variable-pitch 1.3)
(7 variable-pitch 1.2)
(t variable-pitch 1.1)))
;; They are nil by default...
(setq ef-themes-mixed-fonts t)
(setq ef-themes-variable-pitch-ui t)
;; Disable all other themes to avoid awkward blending:
(mapc #'disable-theme custom-enabled-themes)
;; Load the theme of choice:
(load-theme 'ef-winter :no-confirm)
)
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file) (load custom-file))
@@ -49,7 +79,7 @@
(add-hook 'server-done-hook (lambda () (delete-frame)))
(desktop-save-mode t)
;; (desktop-save-mode t)
(use-package password-store)

View File

@@ -1,16 +1,18 @@
#+TITLE: Emacs Core Configuration
#+property: header-args :tangle ~/.emacs.d/modules/core.el
#+TITLE: Core Emacs Configuration
#+PROPERTY: header-args :tangle yes
* early-init.el
For straight.el to pick up before package.el
* Initialization Bootstrap
#+begin_src elisp :tangle ~/.emacs.d/early-init.el
(setq package-enable-at-startup nil)
#+end_src
This section tangles directly to ~/.emacs to bootstrap the entire system.
* Straight.el Bootstrap
#+begin_src elisp :tangle ~/.emacs
;;; .emacs --- Global settings -*- lexical-binding: t; -*-
(setq gc-cons-threshold (* 500 1024 1024))
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
(setq straight-repository-branch "develop")
(eval-and-compile
(defvar bootstrap-version)
(let ((bootstrap-file
@@ -26,30 +28,172 @@ For straight.el to pick up before package.el
(load bootstrap-file nil 'nomessage))
(straight-use-package 'use-package)
)
(straight-use-package 'org))
(setq straight-use-package-by-default t)
(require 'ob-tangle)
;; Load the modular configuration starting from dotemacs.org
(org-babel-load-file (expand-file-name "~/memex/projects/dotemacs/dotemacs.org"))
(provide '.emacs)
#+end_src
* Server and Performance
#+begin_src elisp :tangle ~/.emacs.d/early-init.el
(require 'server)
(unless (server-running-p) (server-start))
(defvar server-max-buffers 100)
#+end_src
* Front matter
#+begin_src elisp
;;; emacs-core.el --- Summary
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
* Garbage collector
Increase threshold to 500 MB to ease startup
#+begin_src elisp
(setq gc-cons-threshold (* 500 1024 1024))
#+end_src
Decrease threshold to 5 MB after init
#+begin_src elisp
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
#+end_src
* System Information
#+begin_src elisp :tangle ~/.emacs.d/custom.el
* Straight.el and use-package
Integrate use-package and straight
#+begin_src elisp
(setq straight-use-package-by-default t)
(require 'use-package)
(straight-use-package 'diminish)
(require 'diminish)
#+end_src
Make sure Org is installed (straight.el)
#+begin_src elisp
(unless (file-directory-p (expand-file-name "~/.emacs.d/straight/versions")) (make-directory (expand-file-name "~/.emacs.d/straight/versions") t))
(use-package org)
#+end_src
* UI and Themes
#+begin_src elisp
(use-package ef-themes
:config
;; If you like two specific themes and want to switch between them, you
;; can specify them in `ef-themes-to-toggle' and then invoke the command
;; `ef-themes-toggle'. All the themes are included in the variable
;; `ef-themes-collection'.
(setq ef-themes-to-toggle '(ef-summer ef-winter))
(setq ef-themes-headings ; read the manual's entry or the doc string
'((0 variable-pitch light 1.9)
(1 variable-pitch light 1.8)
(2 variable-pitch regular 1.7)
(3 variable-pitch regular 1.6)
(4 variable-pitch regular 1.5)
(5 variable-pitch 1.4) ; absence of weight means `bold'
(6 variable-pitch 1.3)
(7 variable-pitch 1.2)
(t variable-pitch 1.1)))
;; They are nil by default...
(setq ef-themes-mixed-fonts t)
(setq ef-themes-variable-pitch-ui t)
;; Disable all other themes to avoid awkward blending:
(mapc #'disable-theme custom-enabled-themes)
;; Load the theme of choice:
(load-theme 'ef-winter :no-confirm)
)
#+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
(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)
(savehist-mode)
(desktop-save-mode t)
(global-auto-revert-mode) ; simplifies syncing
#+end_src
* Persistent history
#+begin_src elisp
(savehist-mode)
#+end_src
* Disable Syntax Checkers (Diagnostic)
#+begin_src elisp
(when (fboundp 'flycheck-mode)
(setq flycheck-global-modes nil)
(global-flycheck-mode -1))
(when (fboundp 'flymake-mode)
(setq help-at-pt-display-when-idle t)
;; Disable flymake in all buffers
(add-hook 'find-file-hook (lambda () (flymake-mode -1))))
#+end_src
* Backup and versioning
#+begin_src emacs-lisp
(use-package magit)
#+end_src
* Personal information
#+begin_src elisp
(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
(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
(provide 'emacs-core)
;;; emacs-core.el ends here
#+end_src

View File

@@ -1,30 +1,112 @@
#+TITLE: Emacs GTD Configuration
#+property: header-args :tangle ~/.emacs.d/modules/gtd.el
#+TITLE: GTD & Agenda Configuration
#+PROPERTY: header-args :tangle yes
* org-gtd
* Agenda
Basic agenda settings
#+begin_src elisp
(use-package org-gtd
:defer t
:init (setq org-gtd-update-ack "3.0.0")
:after org
:config
(setq org-edna-use-inheritance t)
(org-edna-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)
)
)
(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
* GTD Directory and Areas
Agenda files
#+begin_src elisp
(defvar org-gtd-directory org-directory)
(defvar org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(defvar org-gtd-areas-of-focus '(
(setq org-agenda-files (list
(concat org-directory "/inbox.org")
(concat org-directory "/gtd.org")
(concat org-directory "/org-gtd-tasks.org")
)
)
#+end_src
Better agenda views
#+begin_src elisp :tangle yes
(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 f)
(use-package dash)
(use-package s)
(use-package org-edna
:config
(setq org-edna-use-inheritance t)
(org-edna-mode))
(use-package org-gtd
:straight (org-gtd :type git :host github :repo "Trevoke/org-gtd.el")
:demand t
:init (setq org-gtd-update-ack "4.0.0")
:config
(setq org-gtd-keyword-mapping
'((todo . "TODO")
(next . "NEXT")
(wait . "WAIT")
(done . "DONE")
(canceled . "CNCL")))
(setq org-gtd-custom-node-paths
(list (list "Actionable" (expand-file-name "~/memex/gtd.org") "Actions")
(list "Legacy" (expand-file-name "~/memex/org-gtd-tasks.org") "Actions")
(list "Projects" (expand-file-name "~/memex/gtd.org") "Projects")
(list "Incubate" (expand-file-name "~/memex/gtd.org") "Incubate")))
(org-gtd-mode)
)
(global-set-key (kbd "C-c d c") #'org-gtd-capture)
(global-set-key (kbd "C-c d e") #'org-gtd-engage)
(global-set-key (kbd "C-c d p") #'org-gtd-process-inbox)
(with-eval-after-load 'org-gtd
(define-key org-gtd-clarify-map (kbd "C-c c") #'org-gtd-organize))
#+end_src
#+begin_src elisp
(setq org-gtd-directory org-directory)
(setq org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(setq org-gtd-areas-of-focus '(
"Atoms"
"Bits"
"Cells"
@@ -44,5 +126,41 @@
"Egypt"
)
)
(defvar org-gtd-clarify-show-horizons 'right)
(setq 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 yes
(setq org-clock-into-drawer t)
#+end_src
Habits
#+begin_src elisp :tangle yes
(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

View File

@@ -21,6 +21,9 @@
(setq org-noter-notes-search-path (list (expand-file-name "~/memex/library/books")))
(setq org-noter-default-notes-file-names '("books.org")))
(setq org-noter-notes-search-path (list (concat org-directory "/library/books")))
(setq org-noter-default-notes-file-names '("books.org"))
(use-package org-noter-pdftools
:after org-noter
:config
@@ -62,3 +65,5 @@ With a prefix ARG, remove start location."
)
(use-package helm-bibtex)
(setq bibtex-completion-bibliography '("~/bibliography/zotero.bib"))

View File

@@ -1,39 +1,101 @@
#+TITLE: Emacs Media and E-books Configuration
#+property: header-args :tangle ~/.emacs.d/modules/media.el
#+TITLE: Media and Books Configuration
#+PROPERTY: header-args :tangle yes
* Read ebooks (calibredb)
* calibredb
#+begin_src elisp
(use-package calibredb
:defer t
:config
(setq calibredb-format-all-the-icons t)
(setq calibredb-format-icons-in-terminal t)
)
(setq calibredb-format-icons-in-terminal t))
#+end_src
(defvar calibredb-root-dir (concat (getenv "HOME") "/library/books"))
#+begin_src elisp
(defvar calibredb-root-dir (expand-file-name "~/memex/library/books"))
(defvar calibredb-db-dir (expand-file-name "metadata.db" calibredb-root-dir))
(defvar calibredb-id-width 6)
(defvar calibredb-title-width 100)
(defvar calibredb-author-width 20)
#+end_src
* nov.el (EPUB Viewer)
* PDF Tools
#+begin_src elisp
(use-package pdf-tools
:mode ("\\.pdf\\'" . pdf-view-mode)
:config
(pdf-tools-install :no-query)
(setq-default pdf-view-display-size 'fit-page)
(setq pdf-annot-activate-created-annotations t))
#+end_src
* Annotate PDFs and EPUBs (org-noter)
#+begin_src elisp
(use-package org-noter
:config
(setq org-noter-notes-search-path (list (expand-file-name "~/memex/library/books")))
(setq org-noter-default-notes-file-names '("books.org")))
#+end_src
#+begin_src elisp :tangle yes
(setq org-noter-notes-search-path (list (concat org-directory "/library/books")))
(setq 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 yes
(use-package nov
:config
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
)
#+end_src
* org-noter and PDF Tools
#+begin_src elisp
(use-package org-noter)
(use-package org-noter-pdftools
:after org-noter
:config
(with-eval-after-load 'pdf-annot
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)
)
)
* Zotero (helm-bibtex)
#+begin_src elisp :tangle yes
(use-package helm-bibtex)
#+end_src
#+begin_src elisp :tangle yes
(setq bibtex-completion-bibliography '("~/bibliography/zotero.bib"))
#+end_src

View File

@@ -68,6 +68,24 @@
(require 'org-protocol)
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
(setq 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
)
)
)
(setq org-protocol-default-template-key "L")
(defun my/org-convert-orgzly-to-org-protocol ()

View File

@@ -1,7 +1,10 @@
#+TITLE: Emacs Org-mode Configuration
#+property: header-args :tangle ~/.emacs.d/modules/org.el
#+TITLE: Org Mode Configuration
#+PROPERTY: header-args :tangle yes
* Org Mode
** Basic setup
* Core Org Setup
#+begin_src elisp
(use-package org
:config
@@ -11,41 +14,130 @@
("C-c c" . org-capture)
:map org-mode-map)
)
(defvar org-directory (concat (getenv "HOME") "/org/"))
#+end_src
* Agenda
#+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)
(setq org-agenda-files (list
(concat org-directory "/0_inbox/inbox.org")
(concat org-directory "/0_inbox/org-gtd-tasks.org")
)
(setq org-directory (expand-file-name "~/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
* Capture and Protocol
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 yes
[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 yes
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*")
(defvar org-default-notes-file (concat org-directory "/0_inbox/inbox.org"))
(setq org-protocol-default-template-key "L")
(setq org-protocol-default-buffer-for-file-links "*scratch*") ; fixes 'no buffers remain to edit error for org-protocol capturer
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar org-capture-templates '(
Org-protocol templates
#+begin_src elisp :tangle yes
(setq org-capture-templates '(
("p" "Protocol"
entry
(file "0_inbox/inbox.org")
(file "inbox.org")
"* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?"
)
("L" "Protocol Link"
entry
(file "0_inbox/inbox.org")
(file "inbox.org")
"* %? [[%:link][%:description]]\n:PROPERTIES:\n:TITLE: %:description\n:URI: %:link\n:CREATED: %U\n:END:"
:prepend nil
:empty-lines 1
@@ -56,14 +148,86 @@
)
#+end_src
* TODO Settings
#+begin_src elisp
(setq org-todo-keywords
'(
(sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)")
(sequence "WAIT(w@/!)" "|" "CNCL(c@)")
)
)
(setq org-enforce-todo-dependencies t)
(setq org-log-into-drawer "LOGBOOK")
(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 yes
(setq org-export-with-smart-quotes t)
(setq org-export-backends '(beamer html latex md))
#+end_src
Export to EPUB
#+begin_src elisp :tangle yes
(use-package ox-epub)
#+end_src
** org-attach
#+begin_src elisp
(setq 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 yes
(use-package org-cliplink
:bind
(("C-x p i" . org-cliplink))
)
#+end_src
** Deft
#+begin_src elisp :tangle yes
(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

View File

@@ -1,20 +1,17 @@
#+TITLE: Emacs Org-roam Configuration
#+property: header-args :tangle ~/.emacs.d/modules/roam.el
#+TITLE: Org-Roam Configuration
#+PROPERTY: header-args :tangle yes
* Org-roam
** Basic org-roam setup
* org-roam Setup
#+begin_src elisp
(use-package org-roam
:init (setq org-roam-v2-ack t)
(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)
(setq org-roam-mode-sections
(list #'org-roam-backlinks-section
#'org-roam-reflinks-section
#'org-roam-unlinked-references-section
)
)
:bind (
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
@@ -29,14 +26,48 @@
)
#+end_src
* Directories
#+begin_src elisp
(setq org-roam-directory (concat org-directory "/1_thinking"))
(setq org-roam-dailies-directory (concat org-directory "/0_inbox/daily"))
(setq org-roam-directory (expand-file-name (concat org-directory "notes")))
(setq org-roam-dailies-directory (expand-file-name (concat org-directory "daily")))
#+end_src
#+begin_src elisp :tangle yes
(use-package sqlite3)
(require 'sqlite3)
#+end_src
Include subdirectories in org-roam
#+begin_src elisp
(setq org-roam-file-exclude-regexp "^[.][.]?/")
#+end_src
* Capture Templates
** Display in org-roam-buffer
#+begin_src elisp :tangle yes
(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 yes
(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
'(
@@ -48,6 +79,7 @@
:immediate-finish t
:unnarrowed t
)
("h" "hugo post" plain
"%?"
:target (file+head "posts/${slug}.org"
@@ -55,6 +87,7 @@
:immediate-finish t
:unnarrowed t
)
("p" "person" plain
"%?"
:if-new (file+head "people/${slug}.org"
@@ -64,7 +97,9 @@
)
)
)
#+end_src
#+begin_src elisp
(setq org-roam-dailies-capture-templates
'(
("d" "daily" plain
@@ -75,3 +110,31 @@
)
)
#+end_src
** Move org header to org-roam-daily
#+begin_src elisp :tangle yes
(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

View File

@@ -1,18 +1,86 @@
#+TITLE: Emacs Shell Configuration
#+property: header-args :tangle ~/.emacs.d/modules/shell.el
#+TITLE: Shell Configuration
#+PROPERTY: header-args :tangle yes
* Shell
** Bash completion
* Bash Completion
#+begin_src elisp
(use-package bash-completion
:config
(require 'bash-completion)
(bash-completion-setup)
)
(defvar shell-dynamic-complete-functions t)
#+end_src
* Frame Management
#+begin_src elisp
(add-hook 'server-done-hook (lambda () (delete-frame)))
(defvar shell-dynamic-complete-functions t)
#+end_src
** Eshell
Add programmable bash completion to Emacs shell-mode
#+begin_src elisp :tangle yes
(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 yes
(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 yes
(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 yes
(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
* Server Actuation (Bash Integration)
Ensure that emacsclient always opens in a GUI frame by default when called from the shell.
#+begin_src bash :tangle ~/.bash_aliases
# Use emacsclient to open files in the GUI, starting daemon if needed
alias em="emacsclient -c -a ''"
# Set emacsclient as the default editor
export EDITOR="emacsclient -c -a ''"
export VISUAL="emacsclient -c -a ''"
#+end_src

View File

@@ -0,0 +1,16 @@
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
(setq inhibit-startup-screen t)
(setq initial-scratch-message nil)
(set-face-attribute 'default nil :family "sans-serif" :height 120)
(set-face-attribute 'variable-pitch nil :family "sans-serif")
(use-package org-modern
:ensure t
:config
(set-face-attribute 'org-modern-symbol nil :family "Iosevka")
(global-org-modern-mode)
)

View File

@@ -1,59 +1,32 @@
#+TITLE: Emacs UI Configuration
#+property: header-args :tangle ~/.emacs.d/modules/ui.el
#+PROPERTY: header-args :tangle yes
* Appearance
Basic UI settings for a cleaner look.
#+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)
(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)
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
(setq inhibit-startup-screen t)
(setq initial-scratch-message nil)
#+end_src
* Org-modern
* Fonts
#+begin_src elisp
(set-face-attribute 'default nil :family "sans-serif" :height 120)
(set-face-attribute 'variable-pitch nil :family "sans-serif")
#+end_src
* Org-modern (UI elements)
#+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
* Syntax Highlighting
#+begin_src elisp
(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
#+end_src

View File

@@ -1,7 +1,195 @@
#+TITLE: Emacs Writing Configuration
#+property: header-args :tangle ~/.emacs.d/modules/writing.el
#+TITLE: Reading and Writing Configuration
#+PROPERTY: header-args :tangle yes
* Text and Case
** Convert DOuble capitals to single capitals
#+begin_src elisp :tangle yes
(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, lets define a minor mode for it to be activated.
#+begin_src elisp :tangle yes
(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, lets add a hook so that it is on for all the text files Emacs opens.
#+begin_src elisp :tangle yes
(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 yes
(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 yes
(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)
#+end_src
** ediff
#+begin_src elisp :tangle yes
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq ediff-split-window-function 'split-window-horizontally)
#+end_src
** tramp
#+begin_src elisp :tangle yes
(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 yes
(bind-key "M-SPC" 'cycle-spacing)
#+end_src
** Transform <a href> links into org links
#+begin_src elisp :tangle yes
(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 yes
(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 yes
(setq dictionary-server "automatic")
#+end_src
** Pick out passive voice and weasel words
#+begin_src elisp :tangle yes
(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 yes
(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 yes
sudo apt install hunspell
#+end_src
* Spell Checking
#+begin_src elisp
(use-package flyspell
:config (setq ispell-program-name "hunspell"
@@ -17,32 +205,50 @@
)
#+end_src
* Syntax Checking
#+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"))
** Flyspell correct
#+begin_src elisp :tangle yes
(use-package flyspell-correct
:after flyspell
:bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))
)
#+end_src
* Text Manipulation
** Flycheck
Needs external checkers installed
#+begin_src elisp
(subword-mode)
(setq sentence-end-double-space nil)
(use-package flycheck
:defer t
:diminish (flycheck-mode . "")
:config
(setq flycheck-emacs-lisp-load-path 'inherit)
(setq flycheck-emacs-lisp-load-path (concat user-emacs-directory "straight/build")))
(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)
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)
#+end_src
** Flycheck bash
#+begin_src bash :tangle yes
sudo apt install devscripts
#+end_src
#+begin_src elisp :tangle yes
(use-package flycheck-checkbashisms
:config
(flycheck-checkbashisms-setup)
)
#+end_src
** Yaml
#+begin_src elisp :tangle yes
(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 yes
(use-package docker-compose-mode)
#+end_src

View File

@@ -0,0 +1,90 @@
#+TITLE: Qubes NPU Setup - sys-ai
#+AUTHOR: Amr
#+CREATED: [2026-04-24 Fri]
#+BEGIN_COMMENT
Documentation for setting up sys-ai Qube with AMD Ryzen AI NPU for llama.cpp.
#+END_COMMENT
* Hardware
- *Laptop:* Framework Laptop 13 (AMD)
- *CPU:* AMD Ryzen AI 5 340 (6 cores, no SMT)
- *NPU:* AMD XDNA2 (Strix Point) - c2:00.1 / dom0:00_08.2-00_00.1
- *RAM:* 96GB total
* Current Progress
** DONE [X] Create sys-ai AppVM (HVM, 64GB, 2 vCPUs)
#+begin_src bash
# Run in dom0
qvm-create --label purple --property netvm=sys-firewall --property memory=65536 --property vcpus=2 --property virt_mode=HVM sys-ai
#+end_src
** DONE [X] Attach NPU PCI device to sys-ai
#+begin_src bash
# Run in dom0
qvm-pci attach -o no-strict-reset=true sys-ai dom0:00_08.2-00_00.1 --persistent
#+end_src
** TODO [ ] Fix repository configuration in sys-ai
*Status:* Package repositories missing in fedora-43-ai template. Fedora 43 uses DNF5 with different repo paths.
*Next Step:* Qubes OS templates typically get packages installed via `qubes-vm-update` or dom0 commands. Try the Qubes way to install packages.
** TODO [ ] Verify NPU is accessible inside sys-ai
#+begin_src bash
# Install pciutils
sudo dnf install pciutils
# Check NPU is visible
lspci | grep -i neural
#+end_src
** TODO [ ] Install AMD NPU drivers in sys-ai
#+begin_src bash
# Enable Copr repository
sudo dnf copr enable xanderlent/amd-npu-driver
# Install drivers
sudo dnf install xrt xdna-driver tcsh
# Setup environment
source /usr/xrt/setup.sh
# Verify NPU detection
xrt-smi examine
#+end_src
** TODO [ ] Build llama.cpp with AMD XDNA2 NPU backend
#+begin_src bash
# Install build dependencies
sudo dnf install cmake gcc-c++ python3.11 git
# Clone NPU fork
git clone https://github.com/BrandedTamarasu-glitch/OllamaAMDNPU.git
cd OllamaAMDNPU
# Build with NPU backend
cmake -B build -DGGML_XDNA=ON -DGGML_BACKEND_DL=ON -DBUILD_SHARED_LIBS=ON
cmake --build build --parallel
#+end_src
** TODO [ ] Download model and test inference
#+begin_src bash
# Download GGUF model (Qwen3 1B or 3B quantized)
# ... model download command ...
# Run with NPU offload
./build/bin/llama-cli -m model.gguf -p "Hello" -n 256 --npu-split 1
#+end_src
* Next Step
Run the repository fix commands from the "Fix repository" step above.

1757
quicklisp.lisp Normal file

File diff suppressed because it is too large Load Diff

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

View File

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,355 +0,0 @@
#+TITLE: LLM Fleet Dashboard
#+author: Sol (Agent)
* Model Fleet
| Provider | Model ID | Context |
|------------+---------------------------------------------------------------+---------|
| OpenRouter | google/gemma-4-26b-a4b-it | 262144 |
| OpenRouter | google/gemma-4-31b-it | 262144 |
| OpenRouter | qwen/qwen3.6-plus:free | 1000000 |
| OpenRouter | z-ai/glm-5v-turbo | 202752 |
| OpenRouter | arcee-ai/trinity-large-thinking | 262144 |
| OpenRouter | x-ai/grok-4.20-multi-agent | 2000000 |
| OpenRouter | x-ai/grok-4.20 | 2000000 |
| OpenRouter | google/lyria-3-pro-preview | 1048576 |
| OpenRouter | google/lyria-3-clip-preview | 1048576 |
| OpenRouter | kwaipilot/kat-coder-pro-v2 | 256000 |
| OpenRouter | rekaai/reka-edge | 16384 |
| OpenRouter | xiaomi/mimo-v2-omni | 262144 |
| OpenRouter | xiaomi/mimo-v2-pro | 1048576 |
| OpenRouter | minimax/minimax-m2.7 | 204800 |
| OpenRouter | openai/gpt-5.4-nano | 400000 |
| OpenRouter | openai/gpt-5.4-mini | 400000 |
| OpenRouter | mistralai/mistral-small-2603 | 262144 |
| OpenRouter | z-ai/glm-5-turbo | 202752 |
| OpenRouter | nvidia/nemotron-3-super-120b-a12b:free | 262144 |
| OpenRouter | nvidia/nemotron-3-super-120b-a12b | 262144 |
| OpenRouter | bytedance-seed/seed-2.0-lite | 262144 |
| OpenRouter | qwen/qwen3.5-9b | 256000 |
| OpenRouter | openai/gpt-5.4-pro | 1050000 |
| OpenRouter | openai/gpt-5.4 | 1050000 |
| OpenRouter | inception/mercury-2 | 128000 |
| OpenRouter | openai/gpt-5.3-chat | 128000 |
| OpenRouter | google/gemini-3.1-flash-lite-preview | 1048576 |
| OpenRouter | bytedance-seed/seed-2.0-mini | 262144 |
| OpenRouter | google/gemini-3.1-flash-image-preview | 65536 |
| OpenRouter | qwen/qwen3.5-35b-a3b | 262144 |
| OpenRouter | qwen/qwen3.5-27b | 262144 |
| OpenRouter | qwen/qwen3.5-122b-a10b | 262144 |
| OpenRouter | qwen/qwen3.5-flash-02-23 | 1000000 |
| OpenRouter | liquid/lfm-2-24b-a2b | 32768 |
| OpenRouter | google/gemini-3.1-pro-preview-customtools | 1048576 |
| OpenRouter | openai/gpt-5.3-codex | 400000 |
| OpenRouter | aion-labs/aion-2.0 | 131072 |
| OpenRouter | google/gemini-3.1-pro-preview | 1048576 |
| OpenRouter | anthropic/claude-sonnet-4.6 | 1000000 |
| OpenRouter | qwen/qwen3.5-plus-02-15 | 1000000 |
| OpenRouter | qwen/qwen3.5-397b-a17b | 262144 |
| OpenRouter | minimax/minimax-m2.5:free | 196608 |
| OpenRouter | minimax/minimax-m2.5 | 196608 |
| OpenRouter | z-ai/glm-5 | 80000 |
| OpenRouter | qwen/qwen3-max-thinking | 262144 |
| OpenRouter | anthropic/claude-opus-4.6 | 1000000 |
| OpenRouter | qwen/qwen3-coder-next | 262144 |
| OpenRouter | openrouter/free | 200000 |
| OpenRouter | stepfun/step-3.5-flash:free | 256000 |
| OpenRouter | stepfun/step-3.5-flash | 262144 |
| OpenRouter | arcee-ai/trinity-large-preview:free | 131000 |
| OpenRouter | moonshotai/kimi-k2.5 | 262144 |
| OpenRouter | upstage/solar-pro-3 | 128000 |
| OpenRouter | minimax/minimax-m2-her | 65536 |
| OpenRouter | writer/palmyra-x5 | 1040000 |
| OpenRouter | liquid/lfm-2.5-1.2b-thinking:free | 32768 |
| OpenRouter | liquid/lfm-2.5-1.2b-instruct:free | 32768 |
| OpenRouter | openai/gpt-audio | 128000 |
| OpenRouter | openai/gpt-audio-mini | 128000 |
| OpenRouter | z-ai/glm-4.7-flash | 202752 |
| OpenRouter | openai/gpt-5.2-codex | 400000 |
| OpenRouter | allenai/olmo-3.1-32b-instruct | 65536 |
| OpenRouter | bytedance-seed/seed-1.6-flash | 262144 |
| OpenRouter | bytedance-seed/seed-1.6 | 262144 |
| OpenRouter | minimax/minimax-m2.1 | 196608 |
| OpenRouter | z-ai/glm-4.7 | 202752 |
| OpenRouter | google/gemini-3-flash-preview | 1048576 |
| OpenRouter | mistralai/mistral-small-creative | 32768 |
| OpenRouter | xiaomi/mimo-v2-flash | 262144 |
| OpenRouter | nvidia/nemotron-3-nano-30b-a3b:free | 256000 |
| OpenRouter | nvidia/nemotron-3-nano-30b-a3b | 262144 |
| OpenRouter | openai/gpt-5.2-chat | 128000 |
| OpenRouter | openai/gpt-5.2-pro | 400000 |
| OpenRouter | openai/gpt-5.2 | 400000 |
| OpenRouter | mistralai/devstral-2512 | 262144 |
| OpenRouter | relace/relace-search | 256000 |
| OpenRouter | z-ai/glm-4.6v | 131072 |
| OpenRouter | nex-agi/deepseek-v3.1-nex-n1 | 131072 |
| OpenRouter | essentialai/rnj-1-instruct | 32768 |
| OpenRouter | openrouter/bodybuilder | 128000 |
| OpenRouter | openai/gpt-5.1-codex-max | 400000 |
| OpenRouter | amazon/nova-2-lite-v1 | 1000000 |
| OpenRouter | mistralai/ministral-14b-2512 | 262144 |
| OpenRouter | mistralai/ministral-8b-2512 | 262144 |
| OpenRouter | mistralai/ministral-3b-2512 | 131072 |
| OpenRouter | mistralai/mistral-large-2512 | 262144 |
| OpenRouter | arcee-ai/trinity-mini:free | 131072 |
| OpenRouter | arcee-ai/trinity-mini | 131072 |
| OpenRouter | deepseek/deepseek-v3.2-speciale | 163840 |
| OpenRouter | deepseek/deepseek-v3.2 | 163840 |
| OpenRouter | prime-intellect/intellect-3 | 131072 |
| OpenRouter | anthropic/claude-opus-4.5 | 200000 |
| OpenRouter | allenai/olmo-3-32b-think | 65536 |
| OpenRouter | google/gemini-3-pro-image-preview | 65536 |
| OpenRouter | x-ai/grok-4.1-fast | 2000000 |
| OpenRouter | deepcogito/cogito-v2.1-671b | 128000 |
| OpenRouter | openai/gpt-5.1 | 400000 |
| OpenRouter | openai/gpt-5.1-chat | 128000 |
| OpenRouter | openai/gpt-5.1-codex | 400000 |
| OpenRouter | openai/gpt-5.1-codex-mini | 400000 |
| OpenRouter | moonshotai/kimi-k2-thinking | 131072 |
| OpenRouter | amazon/nova-premier-v1 | 1000000 |
| OpenRouter | perplexity/sonar-pro-search | 200000 |
| OpenRouter | mistralai/voxtral-small-24b-2507 | 32000 |
| OpenRouter | openai/gpt-oss-safeguard-20b | 131072 |
| OpenRouter | nvidia/nemotron-nano-12b-v2-vl:free | 128000 |
| OpenRouter | nvidia/nemotron-nano-12b-v2-vl | 131072 |
| OpenRouter | minimax/minimax-m2 | 196608 |
| OpenRouter | qwen/qwen3-vl-32b-instruct | 131072 |
| OpenRouter | ibm-granite/granite-4.0-h-micro | 131000 |
| OpenRouter | openai/gpt-5-image-mini | 400000 |
| OpenRouter | anthropic/claude-haiku-4.5 | 200000 |
| OpenRouter | qwen/qwen3-vl-8b-thinking | 131072 |
| OpenRouter | qwen/qwen3-vl-8b-instruct | 131072 |
| OpenRouter | openai/gpt-5-image | 400000 |
| OpenRouter | openai/o3-deep-research | 200000 |
| OpenRouter | openai/o4-mini-deep-research | 200000 |
| OpenRouter | nvidia/llama-3.3-nemotron-super-49b-v1.5 | 131072 |
| OpenRouter | baidu/ernie-4.5-21b-a3b-thinking | 131072 |
| OpenRouter | google/gemini-2.5-flash-image | 32768 |
| OpenRouter | qwen/qwen3-vl-30b-a3b-thinking | 131072 |
| OpenRouter | qwen/qwen3-vl-30b-a3b-instruct | 131072 |
| OpenRouter | openai/gpt-5-pro | 400000 |
| OpenRouter | z-ai/glm-4.6 | 204800 |
| OpenRouter | anthropic/claude-sonnet-4.5 | 1000000 |
| OpenRouter | deepseek/deepseek-v3.2-exp | 163840 |
| OpenRouter | thedrummer/cydonia-24b-v4.1 | 131072 |
| OpenRouter | relace/relace-apply-3 | 256000 |
| OpenRouter | google/gemini-2.5-flash-lite-preview-09-2025 | 1048576 |
| OpenRouter | qwen/qwen3-vl-235b-a22b-thinking | 131072 |
| OpenRouter | qwen/qwen3-vl-235b-a22b-instruct | 262144 |
| OpenRouter | qwen/qwen3-max | 262144 |
| OpenRouter | qwen/qwen3-coder-plus | 1000000 |
| OpenRouter | openai/gpt-5-codex | 400000 |
| OpenRouter | deepseek/deepseek-v3.1-terminus | 163840 |
| OpenRouter | x-ai/grok-4-fast | 2000000 |
| OpenRouter | alibaba/tongyi-deepresearch-30b-a3b | 131072 |
| OpenRouter | qwen/qwen3-coder-flash | 1000000 |
| OpenRouter | qwen/qwen3-next-80b-a3b-thinking | 131072 |
| OpenRouter | qwen/qwen3-next-80b-a3b-instruct:free | 262144 |
| OpenRouter | qwen/qwen3-next-80b-a3b-instruct | 262144 |
| OpenRouter | meituan/longcat-flash-chat | 131072 |
| OpenRouter | qwen/qwen-plus-2025-07-28:thinking | 1000000 |
| OpenRouter | qwen/qwen-plus-2025-07-28 | 1000000 |
| OpenRouter | nvidia/nemotron-nano-9b-v2:free | 128000 |
| OpenRouter | nvidia/nemotron-nano-9b-v2 | 131072 |
| OpenRouter | moonshotai/kimi-k2-0905 | 131072 |
| OpenRouter | qwen/qwen3-30b-a3b-thinking-2507 | 131072 |
| OpenRouter | x-ai/grok-code-fast-1 | 256000 |
| OpenRouter | nousresearch/hermes-4-70b | 131072 |
| OpenRouter | nousresearch/hermes-4-405b | 131072 |
| OpenRouter | deepseek/deepseek-chat-v3.1 | 32768 |
| OpenRouter | openai/gpt-4o-audio-preview | 128000 |
| OpenRouter | mistralai/mistral-medium-3.1 | 131072 |
| OpenRouter | baidu/ernie-4.5-21b-a3b | 120000 |
| OpenRouter | baidu/ernie-4.5-vl-28b-a3b | 30000 |
| OpenRouter | z-ai/glm-4.5v | 65536 |
| OpenRouter | ai21/jamba-large-1.7 | 256000 |
| OpenRouter | openai/gpt-5-chat | 128000 |
| OpenRouter | openai/gpt-5 | 400000 |
| OpenRouter | openai/gpt-5-mini | 400000 |
| OpenRouter | openai/gpt-5-nano | 400000 |
| OpenRouter | openai/gpt-oss-120b:free | 131072 |
| OpenRouter | openai/gpt-oss-120b | 131072 |
| OpenRouter | openai/gpt-oss-20b:free | 131072 |
| OpenRouter | openai/gpt-oss-20b | 131072 |
| OpenRouter | anthropic/claude-opus-4.1 | 200000 |
| OpenRouter | mistralai/codestral-2508 | 256000 |
| OpenRouter | qwen/qwen3-coder-30b-a3b-instruct | 160000 |
| OpenRouter | qwen/qwen3-30b-a3b-instruct-2507 | 262144 |
| OpenRouter | z-ai/glm-4.5 | 131072 |
| OpenRouter | z-ai/glm-4.5-air:free | 131072 |
| OpenRouter | z-ai/glm-4.5-air | 131072 |
| OpenRouter | qwen/qwen3-235b-a22b-thinking-2507 | 131072 |
| OpenRouter | z-ai/glm-4-32b | 128000 |
| OpenRouter | qwen/qwen3-coder:free | 262000 |
| OpenRouter | qwen/qwen3-coder | 262144 |
| OpenRouter | bytedance/ui-tars-1.5-7b | 128000 |
| OpenRouter | google/gemini-2.5-flash-lite | 1048576 |
| OpenRouter | qwen/qwen3-235b-a22b-2507 | 262144 |
| OpenRouter | switchpoint/router | 131072 |
| OpenRouter | moonshotai/kimi-k2 | 131072 |
| OpenRouter | mistralai/devstral-medium | 131072 |
| OpenRouter | mistralai/devstral-small | 131072 |
| OpenRouter | cognitivecomputations/dolphin-mistral-24b-venice-edition:free | 32768 |
| OpenRouter | x-ai/grok-4 | 256000 |
| OpenRouter | google/gemma-3n-e2b-it:free | 8192 |
| OpenRouter | tencent/hunyuan-a13b-instruct | 131072 |
| OpenRouter | tngtech/deepseek-r1t2-chimera | 163840 |
| OpenRouter | morph/morph-v3-large | 262144 |
| OpenRouter | morph/morph-v3-fast | 81920 |
| OpenRouter | baidu/ernie-4.5-vl-424b-a47b | 123000 |
| OpenRouter | baidu/ernie-4.5-300b-a47b | 123000 |
| OpenRouter | inception/mercury | 128000 |
| OpenRouter | mistralai/mistral-small-3.2-24b-instruct | 128000 |
| OpenRouter | minimax/minimax-m1 | 1000000 |
| OpenRouter | google/gemini-2.5-flash | 1048576 |
| OpenRouter | google/gemini-2.5-pro | 1048576 |
| OpenRouter | openai/o3-pro | 200000 |
| OpenRouter | x-ai/grok-3-mini | 131072 |
| OpenRouter | x-ai/grok-3 | 131072 |
| OpenRouter | google/gemini-2.5-pro-preview | 1048576 |
| OpenRouter | deepseek/deepseek-r1-0528 | 163840 |
| OpenRouter | anthropic/claude-opus-4 | 200000 |
| OpenRouter | anthropic/claude-sonnet-4 | 200000 |
| OpenRouter | google/gemma-3n-e4b-it:free | 8192 |
| OpenRouter | google/gemma-3n-e4b-it | 32768 |
| OpenRouter | mistralai/mistral-medium-3 | 131072 |
| OpenRouter | google/gemini-2.5-pro-preview-05-06 | 1048576 |
| OpenRouter | arcee-ai/spotlight | 131072 |
| OpenRouter | arcee-ai/maestro-reasoning | 131072 |
| OpenRouter | arcee-ai/virtuoso-large | 131072 |
| OpenRouter | arcee-ai/coder-large | 32768 |
| OpenRouter | inception/mercury-coder | 128000 |
| OpenRouter | meta-llama/llama-guard-4-12b | 163840 |
| OpenRouter | qwen/qwen3-30b-a3b | 40960 |
| OpenRouter | qwen/qwen3-8b | 40960 |
| OpenRouter | qwen/qwen3-14b | 40960 |
| OpenRouter | qwen/qwen3-32b | 40960 |
| OpenRouter | qwen/qwen3-235b-a22b | 131072 |
| OpenRouter | openai/o4-mini-high | 200000 |
| OpenRouter | openai/o3 | 200000 |
| OpenRouter | openai/o4-mini | 200000 |
| OpenRouter | qwen/qwen2.5-coder-7b-instruct | 32768 |
| OpenRouter | openai/gpt-4.1 | 1047576 |
| OpenRouter | openai/gpt-4.1-mini | 1047576 |
| OpenRouter | openai/gpt-4.1-nano | 1047576 |
| OpenRouter | eleutherai/llemma_7b | 4096 |
| OpenRouter | alfredpros/codellama-7b-instruct-solidity | 4096 |
| OpenRouter | x-ai/grok-3-mini-beta | 131072 |
| OpenRouter | x-ai/grok-3-beta | 131072 |
| OpenRouter | nvidia/llama-3.1-nemotron-ultra-253b-v1 | 131072 |
| OpenRouter | meta-llama/llama-4-maverick | 1048576 |
| OpenRouter | meta-llama/llama-4-scout | 327680 |
| OpenRouter | qwen/qwen2.5-vl-32b-instruct | 128000 |
| OpenRouter | deepseek/deepseek-chat-v3-0324 | 163840 |
| OpenRouter | openai/o1-pro | 200000 |
| OpenRouter | mistralai/mistral-small-3.1-24b-instruct | 131072 |
| OpenRouter | allenai/olmo-2-0325-32b-instruct | 128000 |
| OpenRouter | google/gemma-3-4b-it:free | 32768 |
| OpenRouter | google/gemma-3-4b-it | 131072 |
| OpenRouter | google/gemma-3-12b-it:free | 32768 |
| OpenRouter | google/gemma-3-12b-it | 131072 |
| OpenRouter | cohere/command-a | 256000 |
| OpenRouter | openai/gpt-4o-mini-search-preview | 128000 |
| OpenRouter | openai/gpt-4o-search-preview | 128000 |
| OpenRouter | rekaai/reka-flash-3 | 65536 |
| OpenRouter | google/gemma-3-27b-it:free | 131072 |
| OpenRouter | google/gemma-3-27b-it | 131072 |
| OpenRouter | thedrummer/skyfall-36b-v2 | 32768 |
| OpenRouter | perplexity/sonar-reasoning-pro | 128000 |
| OpenRouter | perplexity/sonar-pro | 200000 |
| OpenRouter | perplexity/sonar-deep-research | 128000 |
| OpenRouter | qwen/qwq-32b | 131072 |
| OpenRouter | google/gemini-2.0-flash-lite-001 | 1048576 |
| OpenRouter | anthropic/claude-3.7-sonnet | 200000 |
| OpenRouter | anthropic/claude-3.7-sonnet:thinking | 200000 |
| OpenRouter | mistralai/mistral-saba | 32768 |
| OpenRouter | meta-llama/llama-guard-3-8b | 131072 |
| OpenRouter | openai/o3-mini-high | 200000 |
| OpenRouter | google/gemini-2.0-flash-001 | 1048576 |
| OpenRouter | qwen/qwen-vl-plus | 131072 |
| OpenRouter | aion-labs/aion-1.0 | 131072 |
| OpenRouter | aion-labs/aion-1.0-mini | 131072 |
| OpenRouter | aion-labs/aion-rp-llama-3.1-8b | 32768 |
| OpenRouter | qwen/qwen-vl-max | 131072 |
| OpenRouter | qwen/qwen-turbo | 131072 |
| OpenRouter | qwen/qwen2.5-vl-72b-instruct | 32768 |
| OpenRouter | qwen/qwen-plus | 1000000 |
| OpenRouter | qwen/qwen-max | 32768 |
| OpenRouter | openai/o3-mini | 200000 |
| OpenRouter | mistralai/mistral-small-24b-instruct-2501 | 32768 |
| OpenRouter | deepseek/deepseek-r1-distill-qwen-32b | 32768 |
| OpenRouter | perplexity/sonar | 127072 |
| OpenRouter | deepseek/deepseek-r1-distill-llama-70b | 131072 |
| OpenRouter | deepseek/deepseek-r1 | 64000 |
| OpenRouter | minimax/minimax-01 | 1000192 |
| OpenRouter | microsoft/phi-4 | 16384 |
| OpenRouter | sao10k/l3.1-70b-hanami-x1 | 16000 |
| OpenRouter | deepseek/deepseek-chat | 163840 |
| OpenRouter | sao10k/l3.3-euryale-70b | 131072 |
| OpenRouter | openai/o1 | 200000 |
| OpenRouter | cohere/command-r7b-12-2024 | 128000 |
| OpenRouter | meta-llama/llama-3.3-70b-instruct:free | 65536 |
| OpenRouter | meta-llama/llama-3.3-70b-instruct | 131072 |
| OpenRouter | amazon/nova-lite-v1 | 300000 |
| OpenRouter | amazon/nova-micro-v1 | 128000 |
| OpenRouter | amazon/nova-pro-v1 | 300000 |
| OpenRouter | openai/gpt-4o-2024-11-20 | 128000 |
| OpenRouter | mistralai/mistral-large-2411 | 131072 |
| OpenRouter | mistralai/mistral-large-2407 | 131072 |
| OpenRouter | mistralai/pixtral-large-2411 | 131072 |
| OpenRouter | qwen/qwen-2.5-coder-32b-instruct | 32768 |
| OpenRouter | thedrummer/unslopnemo-12b | 32768 |
| OpenRouter | anthropic/claude-3.5-haiku | 200000 |
| OpenRouter | anthracite-org/magnum-v4-72b | 16384 |
| OpenRouter | qwen/qwen-2.5-7b-instruct | 32768 |
| OpenRouter | nvidia/llama-3.1-nemotron-70b-instruct | 131072 |
| OpenRouter | inflection/inflection-3-pi | 8000 |
| OpenRouter | inflection/inflection-3-productivity | 8000 |
| OpenRouter | thedrummer/rocinante-12b | 32768 |
| OpenRouter | meta-llama/llama-3.2-3b-instruct:free | 131072 |
| OpenRouter | meta-llama/llama-3.2-3b-instruct | 80000 |
| OpenRouter | meta-llama/llama-3.2-1b-instruct | 60000 |
| OpenRouter | meta-llama/llama-3.2-11b-vision-instruct | 131072 |
| OpenRouter | qwen/qwen-2.5-72b-instruct | 32768 |
| OpenRouter | cohere/command-r-08-2024 | 128000 |
| OpenRouter | cohere/command-r-plus-08-2024 | 128000 |
| OpenRouter | sao10k/l3.1-euryale-70b | 131072 |
| OpenRouter | nousresearch/hermes-3-llama-3.1-70b | 131072 |
| OpenRouter | nousresearch/hermes-3-llama-3.1-405b:free | 131072 |
| OpenRouter | nousresearch/hermes-3-llama-3.1-405b | 131072 |
| OpenRouter | sao10k/l3-lunaris-8b | 8192 |
| OpenRouter | openai/gpt-4o-2024-08-06 | 128000 |
| OpenRouter | meta-llama/llama-3.1-8b-instruct | 16384 |
| OpenRouter | meta-llama/llama-3.1-70b-instruct | 131072 |
| OpenRouter | mistralai/mistral-nemo | 131072 |
| OpenRouter | openai/gpt-4o-mini-2024-07-18 | 128000 |
| OpenRouter | openai/gpt-4o-mini | 128000 |
| OpenRouter | google/gemma-2-27b-it | 8192 |
| OpenRouter | google/gemma-2-9b-it | 8192 |
| OpenRouter | sao10k/l3-euryale-70b | 8192 |
| OpenRouter | nousresearch/hermes-2-pro-llama-3-8b | 8192 |
| OpenRouter | openai/gpt-4o | 128000 |
| OpenRouter | openai/gpt-4o:extended | 128000 |
| OpenRouter | openai/gpt-4o-2024-05-13 | 128000 |
| OpenRouter | meta-llama/llama-3-8b-instruct | 8192 |
| OpenRouter | meta-llama/llama-3-70b-instruct | 8192 |
| OpenRouter | mistralai/mixtral-8x22b-instruct | 65536 |
| OpenRouter | microsoft/wizardlm-2-8x22b | 65535 |
| OpenRouter | openai/gpt-4-turbo | 128000 |
| OpenRouter | anthropic/claude-3-haiku | 200000 |
| OpenRouter | mistralai/mistral-large | 128000 |
| OpenRouter | openai/gpt-3.5-turbo-0613 | 4095 |
| OpenRouter | openai/gpt-4-turbo-preview | 128000 |
| OpenRouter | mistralai/mixtral-8x7b-instruct | 32768 |
| OpenRouter | alpindale/goliath-120b | 6144 |
| OpenRouter | openrouter/auto | 2000000 |
| OpenRouter | openai/gpt-4-1106-preview | 128000 |
| OpenRouter | mistralai/mistral-7b-instruct-v0.1 | 2824 |
| OpenRouter | openai/gpt-3.5-turbo-instruct | 4095 |
| OpenRouter | openai/gpt-3.5-turbo-16k | 16385 |
| OpenRouter | mancer/weaver | 8000 |
| OpenRouter | undi95/remm-slerp-l2-13b | 6144 |
| OpenRouter | gryphe/mythomax-l2-13b | 4096 |
| OpenRouter | openai/gpt-4-0314 | 8191 |
| OpenRouter | openai/gpt-3.5-turbo | 16385 |
| OpenRouter | openai/gpt-4 | 8191 |

View File

@@ -1 +0,0 @@
user@amr.3392:1775060113

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -1,120 +0,0 @@
#+TITLE: AI Configuration
#+PROPERTY: header-args :tangle yes
* AI Settings
** Ellama
#+begin_src elisp :tangle yes
;; 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 yes
(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 yes
(use-package gptel)
#+end_src
#+begin_src elisp :tangle yes
(setq gptel-api-key (auth-source-pass-get "api-key" "www/console.groq.com/groq@amr.gharbeia.net"))
#+end_src
#+begin_src elisp :tangle yes
(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 yes
(use-package elisa
:defer t
: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
** OpenCortex (Local Foundry)
#+begin_src elisp :tangle yes
(use-package opencortex
:straight nil
:load-path "~/.local/share/opencortex/src"
:commands (opencortex-connect opencortex-disconnect)
:init
(setq opencortex-host "127.0.0.1")
(setq opencortex-port 9105)
(setq opencortex-executable-path "~/.local/share/opencortex/bin/opencortex-server")
:config
(message "opencortex: Local brain configured at %s" opencortex-executable-path))
#+end_src

View File

@@ -1,165 +0,0 @@
#+TITLE: Core Emacs Configuration
#+PROPERTY: header-args :tangle yes
* Initialization Bootstrap
This section tangles directly to ~/.emacs to bootstrap the entire system.
#+begin_src elisp :tangle ~/.emacs
;;; .emacs --- Global settings -*- lexical-binding: t; -*-
(setq gc-cons-threshold (* 500 1024 1024))
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
(setq straight-repository-branch "develop")
(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)
(straight-use-package 'org))
(setq straight-use-package-by-default t)
(require 'ob-tangle)
;; Load the modular configuration starting from dotemacs.org
(org-babel-load-file (expand-file-name "~/memex/system/dotemacs.org"))
(provide '.emacs)
#+end_src
* Front matter
#+begin_src elisp
;;; emacs-core.el --- Summary
;;; Commentary:
;;; Code:
;; -*- lexical-binding: t; -*-
#+end_src
* Garbage collector
Increase threshold to 500 MB to ease startup
#+begin_src elisp
(setq gc-cons-threshold (* 500 1024 1024))
#+end_src
Decrease threshold to 5 MB after init
#+begin_src elisp
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold (* 5 1024 1024))))
#+end_src
* Straight.el and use-package
Integrate use-package and straight
#+begin_src elisp
(setq straight-use-package-by-default t)
(require 'use-package)
(straight-use-package 'diminish)
(require 'diminish)
#+end_src
Make sure Org is installed (straight.el)
#+begin_src elisp
(unless (file-directory-p (expand-file-name "~/.emacs.d/straight/versions")) (make-directory (expand-file-name "~/.emacs.d/straight/versions") t))
(use-package org)
#+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
(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
* Disable Syntax Checkers (Diagnostic)
#+begin_src elisp
(when (fboundp 'flycheck-mode)
(setq flycheck-global-modes nil)
(global-flycheck-mode -1))
(when (fboundp 'flymake-mode)
(setq help-at-pt-display-when-idle t)
;; Disable flymake in all buffers
(add-hook 'find-file-hook (lambda () (flymake-mode -1))))
#+end_src
* Backup and versioning
#+begin_src emacs-lisp
(use-package magit)
#+end_src
* Personal information
#+begin_src elisp
(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
(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
(provide 'emacs-core)
;;; emacs-core.el ends here
#+end_src

View File

@@ -1,18 +0,0 @@
#+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

View File

@@ -1,166 +0,0 @@
#+TITLE: GTD & Agenda Configuration
#+PROPERTY: header-args :tangle yes
* 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")
(concat org-directory "/org-gtd-tasks.org")
)
)
#+end_src
Better agenda views
#+begin_src elisp :tangle yes
(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 f)
(use-package dash)
(use-package s)
(use-package org-edna
:config
(setq org-edna-use-inheritance t)
(org-edna-mode))
(use-package org-gtd
:straight (org-gtd :type git :host github :repo "Trevoke/org-gtd.el")
:demand t
:init (setq org-gtd-update-ack "4.0.0")
:config
(setq org-gtd-keyword-mapping
'((todo . "TODO")
(next . "NEXT")
(wait . "WAIT")
(done . "DONE")
(canceled . "CNCL")))
(setq org-gtd-custom-node-paths
(list (list "Actionable" (expand-file-name "~/memex/gtd.org") "Actions")
(list "Legacy" (expand-file-name "~/memex/org-gtd-tasks.org") "Actions")
(list "Projects" (expand-file-name "~/memex/gtd.org") "Projects")
(list "Incubate" (expand-file-name "~/memex/gtd.org") "Incubate")))
(org-gtd-mode)
)
(global-set-key (kbd "C-c d c") #'org-gtd-capture)
(global-set-key (kbd "C-c d e") #'org-gtd-engage)
(global-set-key (kbd "C-c d p") #'org-gtd-process-inbox)
(with-eval-after-load 'org-gtd
(define-key org-gtd-clarify-map (kbd "C-c c") #'org-gtd-organize))
#+end_src
#+begin_src elisp
(setq org-gtd-directory org-directory)
(setq org-gtd-organize-hooks '(org-gtd-set-area-of-focus))
(setq org-gtd-areas-of-focus '(
"Atoms"
"Bits"
"Cells"
"Flags"
"Business"
"Wealth"
"Learning"
"Skills"
"Privacy"
"Archive"
"Library"
"Writing"
"Health"
"Home"
"Family"
"Social"
"Egypt"
)
)
(setq 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 yes
(setq org-clock-into-drawer t)
#+end_src
Habits
#+begin_src elisp :tangle yes
(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

View File

@@ -1,101 +0,0 @@
#+TITLE: Media and Books Configuration
#+PROPERTY: header-args :tangle yes
* 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
(defvar calibredb-root-dir (expand-file-name "~/memex/library/books"))
(defvar calibredb-db-dir (expand-file-name "metadata.db" calibredb-root-dir))
(defvar calibredb-id-width 6)
(defvar calibredb-title-width 100)
#+end_src
* PDF Tools
#+begin_src elisp
(use-package pdf-tools
:mode ("\\.pdf\\'" . pdf-view-mode)
:config
(pdf-tools-install :no-query)
(setq-default pdf-view-display-size 'fit-page)
(setq pdf-annot-activate-created-annotations t))
#+end_src
* Annotate PDFs and EPUBs (org-noter)
#+begin_src elisp
(use-package org-noter
:config
(setq org-noter-notes-search-path (list (expand-file-name "~/memex/library/books")))
(setq org-noter-default-notes-file-names '("books.org")))
#+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 yes
(use-package nov
:config
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
)
#+end_src
* Zotero (helm-bibtex)
#+begin_src elisp :tangle yes
(use-package helm-bibtex)
#+end_src
#+begin_src elisp :tangle ~/.emacs.d/custom.el
(defvar bibtex-completion-bibliography '("~/bibliography/zotero.bib"))
#+end_src

View File

@@ -1,233 +0,0 @@
#+TITLE: Org Mode Configuration
#+PROPERTY: header-args :tangle yes
* 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
(setq org-directory (expand-file-name "~/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 yes
[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 yes
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 yes
(setq org-export-with-smart-quotes t)
(setq org-export-backends '(beamer html latex md))
#+end_src
Export to EPUB
#+begin_src elisp :tangle yes
(use-package ox-epub)
#+end_src
** org-attach
#+begin_src elisp
(setq 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 yes
(use-package org-cliplink
:bind
(("C-x p i" . org-cliplink))
)
#+end_src
** Deft
#+begin_src elisp :tangle yes
(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

View File

@@ -1,140 +0,0 @@
#+TITLE: Org-Roam Configuration
#+PROPERTY: header-args :tangle yes
* 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 (expand-file-name (concat org-directory "notes")))
(setq org-roam-dailies-directory (expand-file-name (concat org-directory "daily")))
#+end_src
#+begin_src elisp :tangle yes
(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 yes
(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 yes
(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 yes
(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

View File

@@ -1,73 +0,0 @@
#+TITLE: Shell Configuration
#+PROPERTY: header-args :tangle yes
* 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 yes
(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 yes
(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 yes
(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 yes
(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

View File

@@ -1,254 +0,0 @@
#+TITLE: Reading and Writing Configuration
#+PROPERTY: header-args :tangle yes
* Text and Case
** Convert DOuble capitals to single capitals
#+begin_src elisp :tangle yes
(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, lets define a minor mode for it to be activated.
#+begin_src elisp :tangle yes
(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, lets add a hook so that it is on for all the text files Emacs opens.
#+begin_src elisp :tangle yes
(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 yes
(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 yes
(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)
#+end_src
** ediff
#+begin_src elisp :tangle yes
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq ediff-split-window-function 'split-window-horizontally)
#+end_src
** tramp
#+begin_src elisp :tangle yes
(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 yes
(bind-key "M-SPC" 'cycle-spacing)
#+end_src
** Transform <a href> links into org links
#+begin_src elisp :tangle yes
(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 yes
(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 yes
(setq dictionary-server "automatic")
#+end_src
** Pick out passive voice and weasel words
#+begin_src elisp :tangle yes
(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 yes
(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 yes
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 yes
(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
:defer t
:diminish (flycheck-mode . "")
:config
(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 yes
sudo apt install devscripts
#+end_src
#+begin_src elisp :tangle yes
(use-package flycheck-checkbashisms
:config
(flycheck-checkbashisms-setup)
)
#+end_src
** Yaml
#+begin_src elisp :tangle yes
(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 yes
(use-package docker-compose-mode)
#+end_src

View File

@@ -1,16 +0,0 @@
(let ((config-dir "~/memex/system/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
(org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))
;; Load other modules in a logical order
(org-babel-load-file (expand-file-name "emacs-org.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-gtd.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-roam.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-writing.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-media.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-shell.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-ai.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-misc.org" config-dir)))

46
system/test_cli.py Normal file
View File

@@ -0,0 +1,46 @@
import socket
import struct
def frame_message(msg_string):
payload = msg_string.encode('utf-8')
return f"{len(payload):06x}".encode('ascii') + payload
def read_framed(sock):
header = b''
while len(header) < 6:
chunk = sock.recv(6 - len(header))
if not chunk:
return None
header += chunk
length = int(header, 16)
data = b''
while len(data) < length:
chunk = sock.recv(length - len(data))
if not chunk:
return None
data += chunk
return data.decode('utf-8')
msg = '(:TYPE :REQUEST :PAYLOAD (:ACTION :MESSAGE :TEXT "hello") :META (:SOURCE :CLI :SESSION-ID "test1"))'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 9105))
sock.settimeout(10.0)
# Read handshake
handshake = read_framed(sock)
print("HANDSHAKE:", handshake)
# Read status
status = read_framed(sock)
print("STATUS:", status)
# Send message
sock.sendall(frame_message(msg))
print("SENT:", msg)
# Read response
response = read_framed(sock)
print("RESPONSE:", response)
sock.close()

View File

@@ -1,16 +0,0 @@
(let ((config-dir "~/memex/system/"))
;; Load the core settings, including package management and essential setup.
(org-babel-load-file (expand-file-name "emacs-core.org" config-dir))
;; Load early init settings (if separate and not fully covered by core)
(org-babel-load-file (expand-file-name "emacs-early-init.org" config-dir))
;; Load other modules in a logical order
(org-babel-load-file (expand-file-name "emacs-org.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-gtd.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-roam.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-writing.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-media.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-shell.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-ai.org" config-dir))
(org-babel-load-file (expand-file-name "emacs-misc.org" config-dir)))