;; ================================================== ;; AVR Emacs IDE - Minimal Example init.el ;; ================================================== ;; --- 1. Basic Setup & Package Manager --- (setq inhibit-startup-message t) (require 'package) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("elpa" . "https://elpa.gnu.org/packages/"))) (package-initialize) ;; Install use-package if not present (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (require 'use-package) (setq use-package-always-ensure t) ;; Mache die Menüleiste, Werkzeugleiste und alte Scroll-Leiste unsichtbar (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) ;; Erhöhe die Standard-Fensterbreite auf 120 Spalten, damit durch die Minimap (20 Spalten) ;; immer noch genug Platz (100 Spalten) für den Code bleibt und dieser nicht umbricht. (add-to-list 'default-frame-alist '(width . 100)) (add-to-list 'initial-frame-alist '(width . 100)) ;; Unterdrücke nervige Warnungen (z.B. beim Kompilieren von heruntergeladenen Paketen) (setq warning-minimum-level :error) (setq native-comp-async-report-warnings-errors 'silent) ;; Aktiviere Zeilennummern links (global-display-line-numbers-mode 1) ;; Sublime Text ähnliche Minimap (Vorschaubild) auf der rechten Seite (use-package minimap :init (setq minimap-window-location 'right) (setq minimap-update-delay 0.2) (setq minimap-width-fraction 0.01) ; 1% (wird durch Minimum überschrieben) (setq minimap-minimum-width 20) ; Erzwingt exakt feste 20 Spalten! :config ;; Verhindert, dass das Minimap-Fenster beim Maximieren (Vollbild) des Emacs-Fensters mitwächst (advice-add 'minimap-new-minimap :after (lambda (&rest _) (when-let ((win (minimap-get-window))) (window-preserve-size win t t)))) (minimap-mode 1)) ;; Deaktiviere die Erstellung von temporären #Dateien#, .#Lockfiles und Datei~ Backups (setq make-backup-files nil) (setq auto-save-default nil) ; Deaktiviert die lästigen #Dateien# (setq create-lockfiles nil) ;; AKTIVIERE stattdessen modernes "Auto-Save" (speichert direkt in die Originaldatei) (auto-save-visited-mode 1) (setq auto-save-visited-interval 2) ; Speichert automatisch nach 2 Sekunden Inaktivität ;; --- 2. Theme (Doom Dark Theme) --- (use-package doom-themes :config (load-theme 'doom-one t)) ;; --- 3. Projectile (Projektverwaltung) --- (use-package projectile :demand t :config (projectile-mode +1) :bind-keymap ("C-c p" . projectile-command-map)) ;; --- 4. Autocompletion (Corfu & Eglot für clangd) --- (use-package corfu :custom (corfu-cycle t) (corfu-auto t) :init (global-corfu-mode)) (use-package eglot :hook ((c-mode . eglot-ensure) (c++-mode . eglot-ensure) (c-ts-mode . eglot-ensure) (c++-ts-mode . eglot-ensure)) :config ;; Clangd-spezifische Parameter für C/C++ (add-to-list 'eglot-server-programs '(c-mode . ("clangd" "-j=8" "--background-index" "--clang-tidy"))) (add-to-list 'eglot-server-programs '(c-ts-mode . ("clangd" "-j=8" "--background-index" "--clang-tidy")))) ;; Modernes Hover-Popup (wie in Eclipse/VS Code) für Dokumentation und Signaturen (use-package eldoc-box :hook (eglot-managed-mode . eldoc-box-hover-at-point-mode)) ;; --- 5. CMake Syntax Highlighting --- (use-package cmake-mode :mode ("CMakeLists\\.txt\\'" "\\.cmake\\'")) ;; --- 5. Suche & Ripgrep (Vertico, Orderless & Consult) --- (use-package vertico :init (vertico-mode)) (use-package orderless :custom (completion-styles '(orderless basic))) (use-package consult :bind (("C-s" . consult-line) ("C-r" . consult-ripgrep))) ;; --- 6. Compilation Window Tweaks --- ;; Öffne das Compile-Fenster immer unten (nicht rechts) und mache es 30% hoch (add-to-list 'display-buffer-alist '("\\*compilation\\*" (display-buffer-reuse-window display-buffer-at-bottom) (window-height . 0.3))) ;; Aktiviere ANSI-Farben im Compile-Fenster (für CMake-Farben) (require 'ansi-color) (add-hook 'compilation-filter-hook 'ansi-color-compilation-filter) ;; Automatisch nach unten scrollen, um Fehler oder die finale Dateigröße sofort zu sehen (setq compilation-scroll-output t) ;; --- 7. Modernes Syntax-Highlighting (Tree-Sitter) --- (use-package treesit-auto :custom (treesit-auto-install t) ; Lade fehlende Grammatiken vollautomatisch herunter :config (treesit-auto-add-to-auto-mode-alist 'all) (global-treesit-auto-mode) ;; Workaround für c-ts-mode: Benötigt intern ZWINGEND auch die cpp-Grammatik! ;; Wir prüfen beim Start, ob C, C++ oder CMake fehlen und installieren sie stumm nach. (setq treesit-language-source-alist '((c "https://github.com/tree-sitter/tree-sitter-c") (cpp "https://github.com/tree-sitter/tree-sitter-cpp") (cmake "https://github.com/uyha/tree-sitter-cmake"))) (dolist (lang '(c cpp cmake)) (unless (treesit-language-available-p lang) (treesit-install-language-grammar lang)))) ;; --- 8. AVR Build & Flash Shortcuts --- (defun my-avr-clean-build () "Baut das aktuelle CMake-Projekt komplett neu ohne Rückfrage." (interactive) (let ((default-directory (projectile-project-root))) (compile "cmake --fresh -B build && cmake --build build"))) (defun my-avr-flash-code () "Flasht nur den Programmcode (Flash)." (interactive) (let ((default-directory (projectile-project-root))) (compile "cmake --build build --target flash"))) (defun my-avr-flash-eeprom () "Flasht Programmcode und EEPROM." (interactive) (let ((default-directory (projectile-project-root))) (compile "cmake --build build --target flash_eeprom"))) (defun my-avr-read-fuses () "Liest die Fuses via Avrdude aus." (interactive) (let ((default-directory (projectile-project-root))) (compile "cmake --build build --target read_fuses"))) (defun my-avr-flash-fuses () "Programmiert die Fuses aus der ELF-Datei." (interactive) (let ((default-directory (projectile-project-root))) (compile "cmake --build build --target flash_fuses"))) ;; Tastenbelegungen (F-Tasten) (global-set-key (kbd "") 'my-avr-clean-build) (global-set-key (kbd "") 'my-avr-flash-code) (global-set-key (kbd "") 'my-avr-flash-eeprom) (global-set-key (kbd "") 'my-avr-read-fuses) (global-set-key (kbd "") 'my-avr-flash-fuses)