Files
emacs-config/lisp/init-core.el
Jens Luedicke ba8b24b1d9 Fix keybinding conflict and remove dead Corfu code
- Change C-c r to C-c R for crux-rename-buffer-and-file to avoid
  conflict with consult-ripgrep-project-root
- Remove unused corfu and cape from package list, add company instead
- Remove dead Corfu/Cape integration code from init-eglot.el
- Include related indentation and formatting settings cleanup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 12:00:27 +01:00

221 lines
6.7 KiB
EmacsLisp

;;; init-core.el --- Core settings and package management -*- lexical-binding: t -*-
;;; Commentary:
;;; Core Emacs settings, package management, and fundamental configurations
;;; Code:
;;; Package Management
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
;; Core package list - consolidated and cleaned
(setq package-selected-packages
'(;; Core utilities
use-package which-key
;; Themes
modus-themes
;; Version control
diff-hl
;; File management
treemacs treemacs-all-the-icons
neotree all-the-icons all-the-icons-dired diredfl
;; Modern completion ecosystem (replaces Helm)
vertico ; Vertical completion UI
consult ; Practical commands based on completing-read
orderless ; Powerful completion style
marginalia ; Rich annotations in minibuffer
embark ; Contextual actions
embark-consult ; Embark integration with Consult
company ; In-buffer completion (configured in init-completion.el)
;; Markdown & Notes
markdown-mode markdown-toc grip-mode
obsidian olivetti
;; Search and navigation
deadgrep ripgrep wgrep anzu
ibuffer-sidebar
;; Required for some functionality
org dash s f ht spinner lv hydra avy
;; RSS/News reader
elfeed elfeed-org
;; Email (mu4e installed separately)
;; Finance tracking
beancount
;; God mode for modal editing
god-mode
;; Quality of life improvements
helpful ; Better help buffers
undo-tree ; Visual undo history
smartparens ; Better than electric-pair-mode
crux ; Collection of useful functions
ace-window ; Quick window switching
;; Terminal emulator
eat ; Emacs terminal emulator
))
;; Auto-install missing packages
(when (cl-find-if-not #'package-installed-p package-selected-packages)
(package-refresh-contents)
(mapc #'package-install package-selected-packages))
;; Ensure use-package is loaded
(eval-when-compile
(require 'use-package))
(setq use-package-always-ensure t)
;;; Performance Optimizations
;; Reset GC threshold after init for better runtime performance
(add-hook 'emacs-startup-hook
(lambda ()
;; Use the defaults we stored in early-init.el
(setq gc-cons-threshold (if (boundp 'default-gc-cons-threshold)
default-gc-cons-threshold
16777216) ; 16MB
gc-cons-percentage (if (boundp 'default-gc-cons-percentage)
default-gc-cons-percentage
0.1))
(message "GC threshold reset to %s" gc-cons-threshold))
50) ; Run after most other startup hooks
(setq read-process-output-max (* 1024 1024))
;;; General Settings
(setq-default indent-tabs-mode nil)
(setq tab-width 4)
;; Set standard indentation offset for all modes
(setq-default standard-indent 4)
;; Mode-specific indentation settings (4 spaces)
(setq-default
;; JavaScript
js-indent-level 4
js2-basic-offset 4
js3-indent-level 4
;; TypeScript
typescript-indent-level 4
;; CSS/SCSS
css-indent-offset 4
scss-indent-offset 4
;; HTML/XML
sgml-basic-offset 4
nxml-child-indent 4
;; Shell scripts
sh-basic-offset 4
sh-indentation 4
;; Lisp
lisp-indent-offset 4
;; Other languages
perl-indent-level 4
cperl-indent-level 4
ruby-indent-level 4
rust-indent-offset 4
scala-indent:step 4
coffee-tab-width 4
lua-indent-level 4
go-ts-mode-indent-offset 4
;; C/C++ Allman style
c-basic-offset 4)
;; C/C++ style configuration - Allman/BSD style with braces on new lines
(setq c-default-style '((c-mode . "bsd")
(c++-mode . "bsd")
(java-mode . "java")
(awk-mode . "awk")
(other . "bsd")))
;; Ensure C/C++ modes use Allman style
(with-eval-after-load 'cc-mode
(defun apply-c-allman-style ()
"Ensure Allman style is applied to C/C++ buffers."
(c-set-style "bsd")
(setq c-basic-offset 4
indent-tabs-mode nil))
(add-hook 'c-mode-hook #'apply-c-allman-style)
(add-hook 'c++-mode-hook #'apply-c-allman-style))
;; Web-mode indentation (for HTML/JSX/TSX files)
(with-eval-after-load 'web-mode
(setq web-mode-markup-indent-offset 4
web-mode-css-indent-offset 4
web-mode-code-indent-offset 4
web-mode-attr-indent-offset 4
web-mode-script-padding 4
web-mode-style-padding 4))
(setq inhibit-startup-screen t)
(setq ring-bell-function 'ignore)
;; Auto-save and backup settings
(setq backup-directory-alist `(("." . ,(expand-file-name "backups" user-emacs-directory))))
(setq delete-old-versions t
kept-new-versions 6
kept-old-versions 2
version-control t)
(setq auto-save-file-name-transforms
`((".*" ,(expand-file-name "auto-save-list/" user-emacs-directory) t)))
;; Use ls-lisp (Emacs's built-in ls emulation) for better cross-platform compatibility
(setq ls-lisp-use-insert-directory-program nil)
(setq ls-lisp-dirs-first t)
;;; Session Management
(save-place-mode 1)
(setq save-place-file (expand-file-name "saveplace" user-emacs-directory))
(savehist-mode 1)
(setq savehist-file (expand-file-name "savehist" user-emacs-directory))
(setq history-length 1000)
(recentf-mode 1)
(setq recentf-max-menu-items 50)
(setq recentf-max-saved-items 200)
;; Desktop save mode - with lazy loading for better performance
;; Defer desktop restoration to speed up initial startup
(setq desktop-restore-eager 5) ; Restore only 5 buffers initially
(setq desktop-lazy-verbose nil)
(setq desktop-lazy-idle-delay 1) ; Restore rest after 1 second idle
;; Enable desktop-save-mode after startup (unless disabled via environment)
(add-hook 'after-init-hook
(lambda ()
;; Check if desktop mode should be disabled (for helper scripts)
(unless (getenv "EMACS_NO_DESKTOP")
(desktop-save-mode 1)
(setq desktop-save t)
(setq desktop-auto-save-timeout 300)
(setq desktop-path (list user-emacs-directory))
(setq desktop-dirname user-emacs-directory)
(setq desktop-base-file-name "emacs-desktop")
(setq desktop-restore-frames t)
;; Load desktop after a delay
(run-with-idle-timer 2 nil
(lambda ()
(desktop-read)
(message "Desktop restored"))))))
(provide 'init-core)
;;; init-core.el ends here