9.8 KiB
#!/usr/bin/env bash
set -euo pipefail
echo "Installing Emacs and dependencies via nix-shell…" nix-shell -p emacs git –run "
TEMP_CONFIG=\$(mktemp /tmp/droidnix-emacs-setup.XXXXXX.el) cat > \"\$TEMP_CONFIG\" << 'EOC' ;; Minimal config for installing packages (require 'package) (add-to-list 'package-archives '(\"melpa\" . \"https://melpa.org/packages/\") t) (package-initialize) EOC
echo 'Installing Emacs packages…'
emacs –batch
–load \"\$TEMP_CONFIG\"
–eval '(package-refresh-contents)'
–eval '(package-install 'use-package)'
–eval '(package-install 'org)'
–eval '(package-install 'nix-mode)'
–eval '(package-install 'htmlize)'
–eval '(package-install 'catppuccin-theme)'
–eval '(package-install 'org-bullets)'
–eval '(package-install 'magit)'
–eval '(package-install 'company)'
–eval '(package-install 'flycheck)'
–eval '(package-install 'doom-modeline)'
–eval '(package-install 'which-key)'
–eval '(package-install 'projectile)'
–eval '(package-install 'ivy)'
–eval '(package-install 'counsel)'
–eval '(package-install 'all-the-icons)'
–eval '(package-install 'doom-themes)'
–eval '(package-install 'treemacs)'
–eval '(package-install 'lsp-mode)'
–eval '(package-install 'dashboard)'
USER_EMACSCONFIG=\"\${HOME}/.emacs.d/init.el\" if [ ! -f \"\$USER_EMACSCONFIG\" ]; then mkdir -p \"\${HOME}/.emacs.d\" cat > \"\$USER_EMACSCONFIG\" << 'EOC' ;; Droidnix Emacs Configuration for NixOS (require 'package) (add-to-list 'package-archives '(\"melpa\" . \"https://melpa.org/packages/\") t) (package-initialize)
;; Basic UI improvements (tool-bar-mode -1) (menu-bar-mode -1) (scroll-bar-mode -1) (setq inhibit-startup-message t) (setq make-backup-files nil) (setq auto-save-default nil)
;; Enable Catppuccin Mocha theme (when (fboundp 'load-theme) (load-theme 'catppuccin-mocha t) (setq catppuccin-disable-term-colors nil) (setq catppuccin-enable-bold t) (setq catppuccin-enable-italic t))
;; Enable Doom Modeline (when (fboundp 'doom-modeline-mode) (doom-modeline-mode 1))
;; Enable All The Icons (when (fboundp 'all-the-icons-install-fonts) (all-the-icons-install-fonts) (global-all-the-icons-mode))
;; Enable Treemacs (when (fboundp 'treemacs) (treemacs-mode) (setq treemacs-width 30) (setq treemacs-position 'left) (setq treemacs-space-between-root-nodes nil) (setq treemacs-indent-level 2) (setq treemacs-file-follow-delay 0.1) (setq treemacs-git-icon-enabled t) (setq treemacs-project-follow t) (setq treemacs-display-project-root t) (setq treemacs-show-hidden-files t))
;; Enable Company for autocomplete (when (fboundp 'company-mode) (global-company-mode) (setq company-idle-delay 0.1) (setq company-minimum-prefix-length 1))
;; Enable Flycheck for syntax checking (when (fboundp 'flycheck-mode) (global-flycheck-mode) (setq flycheck-check-syntax-automatically '(save mode-enabled)) (setq flycheck-display-errors-delay 0.5))
;; Enable Ivy + Counsel for better completion (when (fboundp 'ivy-mode) (ivy-mode 1) (setq ivy-use-virtual-buffers t) (setq ivy-count-format \"(%d/%d) \") (setq ivy-height 10) (when (fboundp 'counsel-mode) (counsel-mode 1)))
;; Enable Projectile for project management (when (fboundp 'projectile-mode) (projectile-mode +1) (define-key projectile-mode-map (kbd \"C-c p\") 'projectile-command-map) (setq projectile-completion-system 'ivy) (setq projectile-switch-project-action 'projectile-dired))
;; Enable Which Key for keybindings help (when (fboundp 'which-key-mode) (which-key-mode 1) (setq which-key-idle-delay 0.5) (setq which-key-show-major-modes nil))
;; Configure Org Mode (require 'org) (require 'ob-shell) ; Required for shell code blocks (require 'ob-nix) ; Required for nix code blocks (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (nix . t) (shell . t) (python . t) (dockerfile . t))) (setq org-babel-tangle-lang-exts '((\"nix\" . \"nix\"))) (setq org-src-fontify-natively t) (setq org-src-tab-act-as-tab t) (setq org-edit-src-content-indentation 0) (setq org-startup-indented t) (setq org-startup-folded nil) (setq org-ellipsis \"⤵\") (setq org-hide-emphasis-markers t) (setq org-image-actual-width nil) (setq org-html-htmlize-output-type 'css) (setq org-export-with-toc nil) (setq org-todo-keywords '(\"TODO\" \"DOING\" \"|\" \"DONE\" \"CANCELED\")) (setq org-log-done 'time) (setq org-directory \"~/org\") (when (fboundp 'org-bullets-mode) (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))
;; Enable Magit for Git (when (fboundp 'magit-version) (setq magit-display-buffer-function 'magit-display-buffer-fullscreen) (setq magit-last-seen-setup-instruction \"1.4.0\"))
;; Enable LSP Mode for language server support (when (fboundp 'lsp-mode) (lsp-mode 1) (setq lsp-keymap-prefix \"C-c l\") (setq lsp-enable-snippets nil) (setq lsp-enable-indentation nil) (setq lsp-enable-on-type-formatting nil) (setq lsp-lens-enable nil) (setq lsp-signature-auto-activate nil))
;; Enable Dashboard (when (fboundp 'dashboard-refresh-buffer) (dashboard-mode 1) (setq dashboard-items '((recents . 5) (projects . 5) (agenda . 5) (bookmarks . 5))) (setq dashboard-center-content t) (setq dashboard-banner-logo-title \"Droidnix Configuration\"))
;; Enable Nix Mode (when (fboundp 'nix-mode) (setq auto-mode-alist (cons '(\\\".nix\\'\\\" . nix-mode) auto-mode-alist)) (add-to-list 'auto-mode-alist '(\\\".nix\\'\\\" . nix-mode)))
;; Custom keybindings (global-set-key (kbd \"C-c t\") 'treemacs) (global-set-key (kbd \"C-c p\") 'projectile-command-map) (global-set-key (kbd \"C-c g\") 'magit-status) (global-set-key (kbd \"C-c d\") 'dashboard-refresh-buffer) (global-set-key (kbd \"C-c b\") 'ivy-switch-buffer) (global-set-key (kbd \"C-c f\") 'find-file) (global-set-key (kbd \"C-c s\") 'save-buffer) (global-set-key (kbd \"C-c q\") 'kill-buffer) (global-set-key (kbd \"C-c w\") 'widen) (global-set-key (kbd \"C-c n\") 'narrow-to-region)
;; Nix-specific configurations (setq nix-indent-width 2) (setq nix-continuation-indent-width 4)
;; HTML export settings for Org (setq org-html-head-include-default-style nil) (setq org-html-head-extra " <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/tree.js@1.0.0/dist/tree.min.css\"> <script src=\"https://cdn.jsdelivr.net/npm/tree.js@1.0.0/dist/tree.min.js\"></script> <style> .tree { font-family: monospace; white-space: pre; } #table-of-contents { display: none; } .org-src-container { background-color: #313244; color: #cdd6f4; padding: 1em; border-radius: 5px; } pre.src { background-color: #313244; padding: 1em; border-radius: 5px; } </style>")
;; Function to wrap tree output in div for HTML export (defun my/org-wrap-tree-in-div () \"Wrap the Nix tree output in a div with class 'tree' for HTML export.\" (interactive) (save-excursion (goto-char (point-min)) (when (re-search-forward \"#+RESULTS:\\n#+BEGIN_EXAMPLE\\n\\(.*?\\n\\)#+END_EXAMPLE\" nil t) (goto-char (match-beginning 1)) (insert \"#+HTML: <div class=\\\"tree\\\">\\n\") (goto-char (match-end 1)) (insert \"#+HTML: </div>\\n\"))))
;; Add hook to automatically wrap tree output on export (add-hook 'org-export-before-processing-hook 'my/org-wrap-tree-in-div)
;; Set default mode for new buffers (setq-default major-mode 'text-mode) (setq-default indent-tabs-mode nil) (setq default-tab-width 2) (setq tab-width 2)
;; Enable line numbers globally (global-display-line-numbers-mode 1) (setq display-line-numbers-type 'relative)
;; Configure fill column indicator (setq display-fill-column-indicator t) (setq display-fill-column-indicator-character ?│) (setq fill-column 80)
;; Enable delete-selection-mode for more intuitive editing (delete-selection-mode 1)
;; Configure modeline (setq display-time-day-and-date t) (setq display-time-24hr-format t)
;; Configure frame appearance (setq default-frame-alist '((fullscreen . maximized) (alpha . (95 95)) (vertical-scroll-bars . nil) (tool-bar-lines . 0) (menu-bar-lines . 0) (line-spacing . 3) (font . \"Fira Code-12\"))) EOC fi
rm \"\$TEMP_CONFIG\"
echo '' echo 'Emacs and all packages are now installed and configured!' echo '' echo 'Installed packages:' echo ' ✅ Catppuccin Mocha (theme)' echo ' ✅ Org mode + Org Bullets' echo ' ✅ Magit (Git interface)' echo ' ✅ Company (autocomplete)' echo ' ✅ Flycheck (syntax checking)' echo ' ✅ Doom Modeline (status bar)' echo ' ✅ Which Key (keybindings help)' echo ' ✅ Projectile (project management)' echo ' ✅ Ivy + Counsel (completion framework)' echo ' ✅ All The Icons (pretty icons)' echo ' ✅ Treemacs (file tree)' echo ' ✅ LSP Mode (language server)' echo ' ✅ ob-shell (shell support for Org Babel)' echo ' ✅ ob-nix (Nix support for Org Babel)' echo ' ✅ Dashboard (start page)' echo ' ✅ tree (for directory visualization)' echo '' echo 'You can now:' echo '1. Tangle Org files: emacs README.org –batch -f org-babel-tangle' echo '2. Export to HTML: emacs -Q –batch README.org -f org-html-export-to-html' echo '3. Open Emacs: emacs' "