(setq org-dir "~/syncthing/notes/Org") ;; Disable native compilation (setq org-export-with-drawers t) (setq make-backup-files nil) (setq default-directory (file-name-as-directory org-dir)) (add-to-list 'default-frame-alist '(fullscreen . maximized)) (defun generate-new-file-name () "Ask for a title and generate a file name based on it" (let* ((file-name (read-string "Title: ")) (my-path (concat org-dir ; Or whatever path you want (format-time-string "%Y%m%d%H%M%S") "-" (replace-regexp-in-string "[^a-zA-Z0-9-]+" "-" file-name) ".org"))) ; Replace invalid path characters (setq mc/org-capture-filename file-name) ; Save variable to be used later in the template my-path)) (setq inhibit-startup-message t) (scroll-bar-mode -1) (tool-bar-mode -1) (tooltip-mode -1) (set-fringe-mode 10) (menu-bar-mode -1) (setq visible-bell t) (if (daemonp) (add-hook 'after-make-frame-functions (lambda (frame) (with-selected-frame frame (set-face-attribute 'default nil :font "Hack NF" :height 220)))) (set-face-attribute 'default nil :font "Hack NF" :height 220)) ;; Make ESC quit prompts (global-set-key (kbd "") 'keyboard-escape-quit) ;; Initialize package sources (require 'package) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("elpa" . "https://elpa.gnu.org/packages/"))) (package-initialize) (unless package-archive-contents (package-refresh-contents)) ;; Initialize use-package on non-Linux platforms (unless (package-installed-p 'use-package) (package-install 'use-package)) (require 'use-package) (setq use-package-always-ensure t) ;;; Enable all 3 for relative number mode ;; (column-number-mode) ;; (global-display-line-numbers-mode t) ;; (setq display-line-numbers-type 'relative) ;; Disable line numbers for some modes (dolist (mode '(term-mode-hook eshell-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) ;; (use-package command-log-mode) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(org-agenda-files nil) '(package-selected-packages '(counsel doom-modeline doom-themes evil evil-collection evil-escape evil-org general helpful htmlize ivy ivy-rich org-contacts org-download org-roam projectile rainbow-delimiters which-key))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) (use-package ivy :diminish :bind (("C-s" . swiper) :map ivy-minibuffer-map ("TAB" . ivy-alt-done) ("C-l" . ivy-alt-done) ("C-j" . ivy-next-line) ("C-k" . ivy-previous-line) :map ivy-switch-buffer-map ("C-k" . ivy-previous-line) ("C-l" . ivy-done) ("C-d" . ivy-switch-buffer-kill) :map ivy-reverse-i-search-map ("C-k" . ivy-previous-line) ("C-d" . ivy-reverse-i-search-kill)) :demand :config (ivy-mode 1)) (use-package doom-modeline :ensure t :init (doom-modeline-mode 1) :custom ((doom-modeline-height 15))) (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) (use-package doom-themes) :init (load-theme 'doom-dracula t) (use-package which-key :init (which-key-mode) :diminish which-key-mode :config (setq which-key-idle-delay 1)) (use-package ivy-rich :init (ivy-rich-mode 1)) (use-package counsel :bind (("M-x" . counsel-M-x) ("C-x b" . counsel-ibuffer) ("C-x C-f" . counsel-find-file) :map minibuffer-local-map ("C-r" . 'counsel-minibuffer-history)) :config (setq ivy-initial-inputs-alist nil)) ;;Don't start searches with ^ (use-package helpful :ensure t :custom (counsel-describe-function-function #'helpful-callable) (counsel-describe-variable-function #'helpful-variable) :bind ([remap describe-function] . counsel-describe-function) ([remap describe-command] . helpful-command) ([remap describe-variable] . counsel-describe-variable) ([remap describe-key] . helpful-key)) (global-set-key (kbd "C-q") 'save-buffers-kill-terminal) (use-package general) (general-create-definer my-leader-def ;; :prefix my-leader :prefix "SPC") (my-leader-def :states 'normal :keymaps 'override ;; bind "SPC a" "oa" 'org-agenda "oc" 'org-capture ;; "ot" 'org-todo ;; "ox" 'org-toggle-checkbox "og" 'counsel-org-tag "osg" 'org-tags-view ;; "op" 'org-set-property "oid" 'org-id-get-create "os" 'org-display-inline-images "oh" 'org-remove-inline-images "e" 'ido-find-file "w" 'save-buffer "b" 'ido-switch-buffer "gg" 'counsel-rg "q" 'quit-window "Q" 'kill-buffer-and-window "z" 'org-toggle-link-display "ff" 'projectile-find-file-in-known-projects) ;; "q" 'kill-this-buffer) ;; Enable Evil (use-package evil :init (setq evil-want-integration t) (setq evil-want-keybinding nil) (setq evil-want-C-u-scroll t) (setq evil-want-C-i-jump nil) :config (define-key evil-insert-state-map (kbd "C-g") 'evil-normal-state) (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join) (define-key evil-motion-state-map (kbd "C-h h") 'evil-window-left) (define-key evil-motion-state-map (kbd "C-a l") 'evil-window-right) (define-key evil-motion-state-map (kbd "C-a j") 'evil-window-down) (define-key evil-motion-state-map (kbd "C-a k") 'evil-window-up) (evil-mode 1)) ;; Add this to your Evil configuration section, after (evil-mode 1) ;; Configure cursor shapes for different Evil states (setq evil-normal-state-cursor '(box "orange")) (setq evil-insert-state-cursor '(bar "red")) (setq evil-visual-state-cursor '(hollow "purple")) (setq evil-replace-state-cursor '(hbar "green")) (setq evil-operator-state-cursor '(hbar "yellow")) ;; For terminal emacs, ensure cursor type changes are sent to terminal (unless (display-graphic-p) ;; Define cursor change function (defun my/change-cursor-shape (shape) (send-string-to-terminal (format "\033[%d q" shape))) ;; Enable cursor shape changes in terminal (add-hook 'evil-insert-state-entry-hook (lambda () (my/change-cursor-shape 6))) ; Bar (add-hook 'evil-normal-state-entry-hook (lambda () (my/change-cursor-shape 2))) ; Block (add-hook 'evil-visual-state-entry-hook (lambda () (my/change-cursor-shape 2))) ; Block (add-hook 'evil-replace-state-entry-hook (lambda () (my/change-cursor-shape 4))) ; Underline (add-hook 'evil-operator-state-entry-hook (lambda () (my/change-cursor-shape 4))) ; Underline ;; Reset cursor on exit (add-hook 'kill-emacs-hook (lambda () (my/change-cursor-shape 2)))) (use-package evil-collection :after evil :config (evil-collection-init)) (use-package evil-escape :config (evil-escape-mode 1)) (setq-default evil-escape-key-sequence "jk") (defun mm/org-mode-setup() (org-indent-mode) (variable-pitch-mode 1) (auto-fill-mode 0) (visual-line-mode 1) (global-visual-line-mode 1) (setq evil-auto-indent nil) ) (evil-define-key 'normal 'global (kbd "g j") 'evil-next-visual-line) (evil-define-key 'normal 'global (kbd "g k") 'evil-previous-visual-line) (evil-define-key 'normal org-mode-map (kbd "g j") 'evil-next-visual-line) (evil-define-key 'normal org-mode-map (kbd "g k") 'evil-previous-visual-line) (use-package org :hook (org-mode . mm/org-mode-setup) :config ;; Load org configuration from separate file (add-to-list 'load-path org-dir) ;; Adjust path as needed (require 'org-config)) (use-package org-download) (setq org-file-apps '((t . "gio open %s"))) ;;For Windows, to open files with an external program (add-hook 'dired-mode-hook 'org-download-enable) ;; (setq org-startup-with-inline-images t) (use-package htmlize) (use-package org-roam :ensure t :custom (org-roam-directory (org-dir)) :bind (("C-c n l" . org-roam-buffer-toggle) ("C-c n f" . org-roam-node-find) ("C-c n g" . org-roam-graph) ("C-c n i" . org-roam-node-insert) ("C-c n c" . org-roam-capture) ;; Dailies ("C-c n j" . org-roam-dailies-capture-today)) :config ;; If you're using a vertical completion framework, you might want a more informative completion interface (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) (org-roam-db-autosync-mode) ;; If using org-roam-protocol (require 'org-roam-protocol)) (require 'org-id) (setq org-id-link-to-org-use-id t) ;; (setq org-roam-dailies-capture-templates ;; '(("d" "default" entry ;; "* Section 1\n** Section 1.1\n* Section 2\n" ;; :target (file+head "%<%Y-%m-%d>.org" ;; "#+title: %<%Y-%m-%d>\n")) ;; ("n" "default" entry ;; "* Section 1\n** Section 1.1\n* Section 2\n" ;; :target (file+head "%<%Y-%m-%d>.org" ;; "#+title: %<%Y-%m-%d>\n")) ;; )) (setq org-agenda-start-on-weekday 1) (setq calendar-date-style 'iso) (setq calendar-week-start-day 1) (setq org-read-date-force-compatible-dates nil) (use-package projectile) (projectile-mode +1) (setq projectile-known-projects (list org-dir)) ;; Recommended keymap prefix on Windows/Linux (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) (global-set-key (kbd "C-c l") 'org-store-link) (global-set-key (kbd "C-c C-l") 'org-insert-link) ;; Disable the annoying mini buffer when inserting a link (add-to-list 'display-buffer-alist `("*Org Links*" display-buffer-no-window (allow-no-window . t))) ;; (setq org-time-stamp-formats '("%Y-%m-%d %a %H:%M")) (setq org-clock-persist 'history) (org-clock-persistence-insinuate) (defun my/timenow () (interactive) (let ((current-prefix-arg '(16))) (call-interactively 'org-time-stamp-inactive))) (define-key org-mode-map (kbd "C-c m") 'my/timenow) ;; Add a direct shortcut for file links with autocomplete (defun my/org-insert-file-link () "Insert a file link directly, with path autocomplete and description prompt." (interactive) (let* ((org-link-file-path-type 'relative) (file-path (org-link-complete-file)) ;; Remove file: prefix if it's already there (path (substring file-path 5)) (desc (read-string "Description: " nil nil nil t))) (org-insert-link nil (concat "file:" path) (if (string= desc "") nil desc)))) ;; Bind it to C-c C-f (define-key org-mode-map (kbd "C-c C-f") 'my/org-insert-file-link)