Files
emacs-config/config.org
T
2024-11-08 15:30:25 +01:00

12 KiB

My Emacs Configuration

Init

Package management

  (require 'use-package)
  (setq use-package-always-ensure t)

  (setq package-archives
	'(("GNU ELPA"     . "https://elpa.gnu.org/packages/")
	  ("MELPA Stable" . "https://stable.melpa.org/packages/")
	  ("MELPA"        . "https://melpa.org/packages/"))
	package-archive-priorities
	'(("GNU ELPA"     . 10)
	  ("MELPA"        . 5)
	  ("MELPA Stable" . 0)))
  (add-to-list 'load-path "~/.emacs.default/git-packages")

Theme

(load-theme 'zenburn t)

Encoding

  (set-language-environment "UTF-8")
  (prefer-coding-system 'utf-8)

Completion

Yas-snippet

  (use-package yasnippet
    :ensure t
    :config
    (yas-global-mode 1))
  (use-package yasnippet-snippets
    :ensure t)

Helm

	(use-package helm
	  :config (require 'helm-autoloads))
    (global-set-key (kbd "M-x") #'helm-M-x)
    (helm-mode 1)

    (setq helm-recentf-fuzzy-match t
	  helm-locate-fuzzy-match nil ;; locate fuzzy is worthless
	  helm-M-x-fuzzy-match t
	  helm-buffers-fuzzy-matching t
	  helm-semantic-fuzzy-match t
	  helm-apropos-fuzzy-match t
	  helm-imenu-fuzzy-match t
	  helm-lisp-fuzzy-completion t
	  helm-completion-in-region-fuzzy-match t)

Company

       (use-package company
	 :hook
	 (after-init . global-company-mode))
       (use-package company-box
	 :hook
	 (company-mode . company-box-mode))

Smart parenthesis

  (use-package smartparens
    :ensure smartparens  ;; install the package
    :hook (prog-mode text-mode markdown-mode) ;; add `smartparens-mode` to these hooks
    :config
    ;; load default config
    (require 'smartparens-config))

LSP

  (use-package lsp-mode
    :init
    ;;set prefix
    (setq lsp-keymap-prefix "C-c l")
    (setq lsp-diagnostics-provider :flycheck) ; Use flycheck for diagnostics
    (setq lsp-enable-snippet t)		  ; Enable snippet support
    (setq company-idle-delay 0.2) ; Set delay for completion pop-up
    (setq company-minimum-prefix-length 1)
    (setq lsp-clients-clangd-executable "clangd")

    :hook
    ((c-mode . lsp)
     (latex-mode . lsp)
     (python-mode . lsp)
     (lsp-mode . lsp-enable-which-key-integration)
     (before-save . lsp-format-buffer))
    :commands lsp
    :bind
    ("C-<return>" . ff-find-other-file))
  (use-package lsp-ui
    :init
    (setq lsp-ui-doc-enable t
	  lsp-ui-position 'at-point)
    :hook
    (lsp-mode . lsp-ui-mode))

  (use-package helm-lsp
    :commands helm-lsp-workspace-symbol)

  (use-package which-key
    :config
    (which-key-mode))

Eglot

  (use-package eglot)
  (add-to-list 'eglot-server-programs '((c-mode) "clangd"))
  (add-hook 'c-mode-hook 'eglot-ensure)

Key-binds

C

Dereference arrow

  (defun print-arrow ()
	(interactive)
  (if (eq major-mode 'c-mode)
    (with-current-buffer (buffer-name);
      (insert "->"))
    (with-current-buffer (buffer-name);
	  (insert "ù"))
    ))
  (keymap-global-set "ù" 'print-arrow)

Reload config

(defun reload-conf ()
  (interactive)
  (load-file "~/.emacs.default/init.el"))
(keymap-global-set "C-c r" 'reload-conf)

Open config

(defun open-config ()
  (interactive)
  (find-file "~/.emacs.default/config.org"))
(keymap-global-set "C-c c" 'open-config)

Window command

Split verticaly

(keymap-global-set "C-x é" 'split-window-below)

Split horizontally

(keymap-global-set "C-x \"" 'split-window-right)

Close window

(keymap-global-set "C-x à" 'delete-window)

Switch window

(keymap-global-set "C-x :" 'next-window-any-frame)

Org

Org bullets

  (use-package org-bullets
    :config
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))

Font

    (font-lock-add-keywords 'org-mode
			    '(("^ *\\([-]\\) "
			       (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
  (custom-theme-set-faces
     'user
     '(variable-pitch ((t (:family "ETBembo" :height 220 :weight thin))))
     '(fixed-pitch ((t ( :family "Fira Code Retina" :height 200)))))
    (let* ((variable-tuple
	      (cond ((x-list-fonts "ETBembo")         '(:font "ETBembo"))
		    ((x-list-fonts "Source Sans Pro") '(:font "Source Sans Pro"))
		    ((x-list-fonts "Lucida Grande")   '(:font "Lucida Grande"))
		    ((x-list-fonts "Verdana")         '(:font "Verdana"))
		    ((x-family-fonts "Sans Serif")    '(:family "Sans Serif"))
		    (nil (warn "Cannot find a Sans Serif Font.  Install Source Sans Pro."))))
	     (base-font-color     (face-foreground 'default nil 'default))
	     (headline           `(:inherit default :weight bold :foreground ,base-font-color)))


      ;; Headlines
	(custom-theme-set-faces
	 'user
	 `(org-level-8 ((t (,@headline ,@variable-tuple))))
	 `(org-level-7 ((t (,@headline ,@variable-tuple))))
	 `(org-level-6 ((t (,@headline ,@variable-tuple))))
	 `(org-level-5 ((t (,@headline ,@variable-tuple))))
	 `(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1))))
	 `(org-level-3 ((t (,@headline ,@variable-tuple :height 1.25))))
	 `(org-level-2 ((t (,@headline ,@variable-tuple :height 1.5))))
	 `(org-level-1 ((t (,@headline ,@variable-tuple :height 1.75))))
	 `(org-document-title ((t (,@headline ,@variable-tuple :height 2.0 :underline nil))))))

Emphasis markers

  (setq org-hide-emphasis-markers t)

Hooks

Variable pitch mode

(add-hook 'org-mode-hook 'variable-pitch-mode)

Visual line mode

(add-hook 'org-mode-hook 'visual-line-mode)

Custom faces

(custom-theme-set-faces
   'user
   '(org-block ((t (:inherit fixed-pitch))))
   '(org-code ((t (:inherit (shadow fixed-pitch)))))
   '(org-document-info ((t (:foreground "dark orange"))))
   '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch)))))
   '(org-indent ((t (:inherit (org-hide fixed-pitch)))))
   '(org-link ((t (:foreground "royal blue" :underline t))))
   '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch)))))
   '(org-property-value ((t (:inherit fixed-pitch))) t)
   '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch)))))
   '(org-table ((t (:inherit fixed-pitch :foreground "#83a598"))))
   '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8))))
   '(org-verbatim ((t (:inherit (shadow fixed-pitch))))))

Terminal

  (use-package vterm)

Treemacs

(use-package treemacs
  :ensure t
  :defer t
  :init
  (with-eval-after-load 'winum
    (define-key winum-keymap (kbd "M-0") #'treemacs-select-window))
  :config
  (progn
    (setq treemacs-collapse-dirs                   (if treemacs-python-executable 3 0)
          treemacs-deferred-git-apply-delay        0.5
          treemacs-directory-name-transformer      #'identity
          treemacs-display-in-side-window          t
          treemacs-eldoc-display                   'simple
          treemacs-file-event-delay                2000
          treemacs-file-extension-regex            treemacs-last-period-regex-value
          treemacs-file-follow-delay               0.2
          treemacs-file-name-transformer           #'identity
          treemacs-follow-after-init               t
          treemacs-expand-after-init               t
          treemacs-find-workspace-method           'find-for-file-or-pick-first
          treemacs-git-command-pipe                ""
          treemacs-goto-tag-strategy               'refetch-index
          treemacs-header-scroll-indicators        '(nil . "^^^^^^")
          treemacs-hide-dot-git-directory          t
          treemacs-indentation                     2
          treemacs-indentation-string              " "
          treemacs-is-never-other-window           nil
          treemacs-max-git-entries                 5000
          treemacs-missing-project-action          'ask
          treemacs-move-files-by-mouse-dragging    t
          treemacs-move-forward-on-expand          nil
          treemacs-no-png-images                   nil
          treemacs-no-delete-other-windows         t
          treemacs-project-follow-cleanup          nil
          treemacs-persist-file                    (expand-file-name ".cache/treemacs-persist" user-emacs-directory)
          treemacs-position                        'left
          treemacs-read-string-input               'from-child-frame
          treemacs-recenter-distance               0.1
          treemacs-recenter-after-file-follow      nil
          treemacs-recenter-after-tag-follow       nil
          treemacs-recenter-after-project-jump     'always
          treemacs-recenter-after-project-expand   'on-distance
          treemacs-litter-directories              '("/node_modules" "/.venv" "/.cask")
          treemacs-project-follow-into-home        nil
          treemacs-show-cursor                     nil
          treemacs-show-hidden-files               t
          treemacs-silent-filewatch                nil
          treemacs-silent-refresh                  nil
          treemacs-sorting                         'alphabetic-asc
          treemacs-select-when-already-in-treemacs 'move-back
          treemacs-space-between-root-nodes        t
          treemacs-tag-follow-cleanup              t
          treemacs-tag-follow-delay                1.5
          treemacs-text-scale                      nil
          treemacs-user-mode-line-format           nil
          treemacs-user-header-line-format         nil
          treemacs-wide-toggle-width               70
          treemacs-width                           35
          treemacs-width-increment                 1
          treemacs-width-is-initially-locked       t
          treemacs-workspace-switch-cleanup        nil)

    ;; The default width and height of the icons is 22 pixels. If you are
    ;; using a Hi-DPI display, uncomment this to double the icon size.
    ;;(treemacs-resize-icons 44)

    (treemacs-follow-mode t)
    (treemacs-filewatch-mode t)
    (treemacs-fringe-indicator-mode 'always)
    (when treemacs-python-executable
      (treemacs-git-commit-diff-mode t))

    (pcase (cons (not (null (executable-find "git")))
                 (not (null treemacs-python-executable)))
      (`(t . t)
       (treemacs-git-mode 'deferred))
      (`(t . _)
       (treemacs-git-mode 'simple)))

    (treemacs-hide-gitignored-files-mode nil))
  :bind
  (:map global-map
        ("M-0"       . treemacs-select-window)
        ("C-x t 1"   . treemacs-delete-other-windows)
        ("C-x t t"   . treemacs)
        ("C-x t d"   . treemacs-select-directory)
        ("C-x t B"   . treemacs-bookmark)
        ("C-x t C-t" . treemacs-find-file)
        ("C-x t M-t" . treemacs-find-tag)))

(use-package treemacs-projectile
  :after (treemacs projectile)
  :ensure t)

(use-package treemacs-icons-dired
  :hook (dired-mode . treemacs-icons-dired-enable-once)
  :ensure t)

(use-package treemacs-magit
  :after (treemacs magit)
  :ensure t)

(use-package treemacs-persp ;;treemacs-perspective if you use perspective.el vs. persp-mode
  :after (treemacs persp-mode) ;;or perspective vs. persp-mode
  :ensure t
  :config (treemacs-set-scope-type 'Perspectives))

(use-package treemacs-tab-bar ;;treemacs-tab-bar if you use tab-bar-mode
  :after (treemacs)
  :ensure t
  :config (treemacs-set-scope-type 'Tabs))

Misceleaneous

Menu bar

(menu-bar-mode -1)

Tool bar

(tool-bar-mode -1)

Scroll bar

(scroll-bar-mode -1)

Global font

  (set-face-attribute 'default nil :family "Cascadia Mono" :height 200)

Icons

(use-package all-the-icons
  :if (display-graphic-p))