- Early Init
- Package Management
- Base Config
- Evil
- UI
- Daemon
- Buffers
- Terminal
- Dired
- Org
- Files
- Workspaces
- Projectile
- Completion
- Editing
- Company
- Coding
- Emacs
- Telega
- Async
(setq gc-cons-threshold most-positive-fixnum
gc-cons-percentage 0.6)
(setq comp-deferred-compilation nil)
(when (featurep 'native-compile)
;; Silence compiler warnings as they can be pretty disruptive
(setq native-comp-async-report-warnings-errors nil)
;; Make native compilation happens asynchronously
(setq native-comp-deferred-compilation t)
;; Set the right directory to store the native compilation cache
(add-to-list 'native-comp-eln-load-path (expand-file-name "eln-cache/" user-emacs-directory)))
In Emacs 27+, package initialization occurs before `user-init-file' is
loaded, but after `early-init-file'. Doom handles package initialization, so
we must prevent Emacs from doing it early!
(setq package-enable-at-startup nil)
Do not allow loading from the package cache (same reason).
(setq package-quickstart nil)
(setq inhibit-startup-message t)
(push '(tool-bar-lines . 0) default-frame-alist)
(push '(menu-bar-lines . 0) default-frame-alist)
(push '(vertical-scroll-bars) default-frame-alist)
(push '(background-color . "#232635") default-frame-alist)
(push '(foreground-color . "#FFFFFF") default-frame-alist)
(push '(mouse-color . "white") default-frame-alist)
(setq initial-major-mode 'fundamental-mode)
Resizing the Emacs frame can be a terribly expensive part of changing the
font. By inhibiting this, we easily halve startup times with fonts that are
larger than the system default.
(setq frame-inhibit-implied-resize t)
(setq make-backup-files nil)
(menu-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1)
(scroll-bar-mode -1)
(setq inhibit-splash-screen t)
(setq use-file-dialog nil)
Taken from DOOM's init
`file-name-handler-alist' is consulted on every `require', `load' and various
path/io functions. You get a minor speed up by nooping this. However, this
may cause problems on builds of Emacs where its site lisp files aren't
byte-compiled and we're forced to load the *.el.gz files (e.g. on Alpine)
(unless (daemonp)
(defvar doom--initial-file-name-handler-alist file-name-handler-alist)
(setq file-name-handler-alist nil)
;; Restore `file-name-handler-alist' later, because it is needed for handling
;; encrypted or compressed files, among other things.
(defun doom-reset-file-handler-alist-h ()
;; Re-add rather than `setq', because changes to `file-name-handler-alist'
;; since startup ought to be preserved.
(dolist (handler file-name-handler-alist)
(add-to-list 'doom--initial-file-name-handler-alist handler))
(setq file-name-handler-alist doom--initial-file-name-handler-alist))
(add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)
(add-hook 'after-init-hook (lambda ()
;; restore after startup
(setq gc-cons-threshold 16777216
gc-cons-percentage 0.1)))
)
;; Ensure Doom is running out of this file's directory
(setq user-emacs-directory (file-truename (file-name-directory load-file-name)))
Install straight.el
(defvar bootstrap-version)
(let ((bootstrap-file
(expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
(bootstrap-version 5))
(unless (file-exists-p bootstrap-file)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
'silent 'inhibit-cookies)
(goto-char (point-max))
(eval-print-last-sexp)))
(load bootstrap-file nil 'nomessage))
(defun bk/set-font-faces ()
(set-face-attribute 'default nil
:font "JetBrains Mono"
:height 90
:weight 'normal)
(set-face-attribute 'fixed-pitch nil
:font "JetBrains Mono"
:height 90
:weight 'normal)
(set-face-attribute 'variable-pitch nil
:font "JetBrains Mono"
:height 90
:weight 'normal))
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(setq-default evil-normal-state-cursor '(box "medium sea green")
evil-insert-state-cursor '(bar "medium sea green")
evil-visual-state-cursor '(hollow "orange")
blink-cursor-mode nil)
enable column number mode
(column-number-mode)
Enable line numbers for some modes
(dolist (mode '(text-mode-hook
prog-mode-hook
conf-mode-hook))
(add-hook mode (lambda ()
(display-line-numbers-mode 1)
(setq-default display-line-numbers-type 'relative))))
Make scrolling less stuttered
(setq auto-window-vscroll nil)
(setq fast-but-imprecise-scrolling t)
(setq scroll-conservatively 101)
(setq scroll-margin 0)
(setq scroll-preserve-screen-position t)
Make ESC quit prompts
(global-set-key (kbd "<escape>") 'keyboard-escape-quit)
Use y and n to confirm/negate prompt instead of yes and no
(fset 'yes-or-no-p 'y-or-n-p)
Make GC pauses faster by decreasing the threshold
(setq gc-cons-threshold (* 2 1000 1000))
(straight-use-package 'snow)
(server-start)
;; (setq visible-bell nil)
(setq ring-bell-function `ignore)
(straight-use-package 'evil)
Set some variables that must be configured before loading the package
(setq evil-want-integration t
evil-want-keybinding nil
;; evil-want-C-u-scroll t
;; evil-want-C-i-jump nil
evil-respect-visual-line-mode t
evil-undo-system 'undo-fu)
Load Evil and enable it globally
(require 'evil)
(evil-mode 1)
set leader key in normal state
(evil-set-leader 'normal (kbd "SPC"))
set local leader in normal state for dired-mode
(evil-set-leader 'normal (kbd "M-SPC") t)
(straight-use-package 'undo-fu)
(define-key evil-normal-state-map "u" 'undo-fu-only-undo)
(define-key evil-normal-state-map "\C-r" 'undo-fu-only-redo)
(straight-use-package 'evil-collection)
(with-eval-after-load 'evil
(evil-collection-init))
(straight-use-package 'evil-nerd-commenter)
(global-set-key (kbd "M-/") 'evilnc-comment-or-uncomment-lines)
(defun bk/evil-shift-right ()
(interactive)
(evil-shift-right evil-visual-beginning evil-visual-end)
(evil-normal-state)
(evil-visual-restore))
(defun bk/evil-shift-left ()
(interactive)
(evil-shift-left evil-visual-beginning evil-visual-end)
(evil-normal-state)
(evil-visual-restore))
(evil-define-key 'visual global-map (kbd ">") 'bk/evil-shift-right)
(evil-define-key 'visual global-map (kbd "<") 'bk/evil-shift-left)
after first installation packaage all-the-icons M-x: all-the-icons-install-fonts
(straight-use-package 'all-the-icons)
(straight-use-package 'doom-themes)
(setq doom-themes-enable-bold t
doom-themes-enable-italic t
doom-themes-visual-bell-config nil)
(doom-themes-org-config)
(load-theme 'doom-one t)
;; (straight-use-package 'catppuccin-theme)
;; (load-theme 'catppuccin :no-confirm)
(straight-use-package 'mood-line)
(mood-line-mode)
(straight-use-package 'dashboard)
(setq dashboard-banner-logo-title "Welcome to Emacs!"
dashboard-startup-banner 'logo
dashboard-center-content t
dashboard-items '((recents . 10)
(projects . 10)
(bookmarks . 10))
dashboard-set-heading-icons t
dashboard-set-file-icons t
dashboard-set-navigator t)
(dashboard-setup-startup-hook)
(defun bk/switch-to-dashboard ()
(interactive)
(switch-to-buffer dashboard-buffer-name)
(dashboard-insert-startupify-lists)
(dashboard-refresh-buffer))
(set-frame-parameter (selected-frame) 'alpha '(95 . 95))
(add-to-list 'default-frame-alist '(alpha . (95 . 95)))
(straight-use-package 'helpful)
(require 'helpful)
(straight-use-package 'visual-fill-column)
(dolist (mode '(org-mode-hook
prog-mode-hook))
(add-hook mode (lambda ()
(setq visual-fill-column-width 120
visual-fill-column-center-text t)
(visual-fill-column-mode 1))))
(add-hook 'dired-mode-hook (lambda ()
(setq visual-fill-column-width 200
visual-fill-column-center-text t)
(visual-fill-column-mode 1)))
(if (daemonp)
(add-hook 'after-make-frame-functions
(lambda (frame)
(with-selected-frame frame
(load-theme 'doom-one t)
(setq telega-use-images '(scale rotate90)
telega-root-show-avatars '(scale rotate90)
telega-chat-show-avatars '(scale rotate90)
telega-user-show-avatars '(scale rotate90))
(bk/set-font-faces))))
(bk/set-font-faces))
(add-hook 'server-after-make-frame-hook 'bk/switch-to-dashboard)
Revert Dired and other buffers
(setq global-auto-revert-non-file-buffers t)
Revert buffers when the underlying file has changed
(global-auto-revert-mode 1)
(evil-define-key 'normal 'global
(kbd "<leader>fs") 'save-buffer
(kbd "<leader>bk") 'kill-this-buffer
(kbd "<leader>bK") 'kill-buffer
(kbd "<leader>bw") 'kill-buffer-and-window
(kbd "<leader>bj") 'consult-bookmark
(kbd "<leader>bs") 'bookmark-set
(kbd "<leader>bl") 'evil-switch-to-windows-last-buffer
(kbd "<leader>dd") 'dired
(kbd "<leader>dj") 'dired-jump
(kbd "<leader>wv") (lambda () (interactive) (evil-window-vsplit) (other-window 1))
(kbd "<leader>ws") (lambda () (interactive) (evil-window-split) (other-window 1))
(kbd "<leader>wh") 'evil-window-left
(kbd "<leader>wl") 'evil-window-right
(kbd "<leader>wj") 'evil-window-down
(kbd "<leader>wk") 'evil-window-up
(kbd "<leader>wd") 'delete-window
(kbd "<leader>w=") 'balance-window
(kbd "<leader>w+") 'evil-window-increase-height
(kbd "<leader>w-") 'evil-window-decrease-height
(kbd "<leader>w>") 'evil-window-increase-width
(kbd "<leader>w<") 'evil-window-decrease-width)
(straight-use-package 'vterm)
(straight-use-package 'multi-vterm)
(evil-define-key 'normal 'global
(kbd "<leader>to") 'multi-vterm
(kbd "<leader>tn") 'multi-vterm-next
(kbd "<leader>tp") 'multi-vterm-prev
(kbd "<leader>tt") 'multi-vterm-dedicated-toggle)
(defun bk/exit-vtem-frame ()
(interactive)
(kill-this-buffer)
(delete-frame))
(evil-define-key 'normal 'global
(kbd "<leader>te") 'bk/exit-vtem-frame)
(straight-use-package 'diredfl)
(add-hook 'dired-mode-hook 'diredfl-mode)
(straight-use-package 'dired-rainbow)
(require 'dired-rainbow)
(with-eval-after-load 'dired
(progn
(dired-rainbow-define-chmod directory "#6cb2eb" "d.*")
(dired-rainbow-define html "#eb5286" ("css" "less" "sass" "scss" "htm" "html" "jhtm" "mht" "eml" "mustache" "xhtml"))
(dired-rainbow-define xml "#f2d024" ("xml" "xsd" "xsl" "xslt" "wsdl" "bib" "json" "msg" "pgn" "rss" "yaml" "yml" "rdata"))
(dired-rainbow-define document "#9561e2" ("docm" "doc" "docx" "odb" "odt" "pdb" "pdf" "ps" "rtf" "djvu" "epub" "odp" "ppt" "pptx"))
(dired-rainbow-define markdown "#ffed4a" ("org" "etx" "info" "markdown" "md" "mkd" "nfo" "pod" "rst" "tex" "textfile" "txt"))
(dired-rainbow-define database "#6574cd" ("xlsx" "xls" "csv" "accdb" "db" "mdb" "sqlite" "nc"))
(dired-rainbow-define media "#de751f" ("mp3" "mp4" "MP3" "MP4" "avi" "mpeg" "mpg" "flv" "ogg" "mov" "mid" "midi" "wav" "aiff" "flac" "mkv"))
(dired-rainbow-define image "#f66d9b" ("tiff" "tif" "cdr" "gif" "ico" "jpeg" "jpg" "png" "psd" "eps" "svg"))
(dired-rainbow-define log "#c17d11" ("log"))
(dired-rainbow-define shell "#f6993f" ("awk" "bash" "bat" "sed" "sh" "zsh" "vim"))
(dired-rainbow-define interpreted "#38c172" ("py" "ipynb" "rb" "pl" "t" "msql" "mysql" "pgsql" "sql" "r" "clj" "cljs" "scala" "js"))
(dired-rainbow-define compiled "#4dc0b5" ("asm" "cl" "lisp" "el" "c" "h" "c++" "h++" "hpp" "hxx" "m" "cc" "cs" "cp" "cpp" "go" "f" "for" "ftn" "f90" "f95" "f03" "f08" "s" "rs" "hi" "hs" "pyc" ".java"))
(dired-rainbow-define executable "#8cc4ff" ("exe" "msi"))
(dired-rainbow-define compressed "#51d88a" ("7z" "zip" "bz2" "tgz" "txz" "gz" "xz" "z" "Z" "jar" "war" "ear" "rar" "sar" "xpi" "apk" "xz" "tar"))
(dired-rainbow-define packaged "#faad63" ("deb" "rpm" "apk" "jad" "jar" "cab" "pak" "pk3" "vdf" "vpk" "bsp"))
(dired-rainbow-define encrypted "#ffed4a" ("gpg" "pgp" "asc" "bfe" "enc" "signature" "sig" "p12" "pem"))
(dired-rainbow-define fonts "#6cb2eb" ("afm" "fon" "fnt" "pfb" "pfm" "ttf" "otf"))
(dired-rainbow-define partition "#e3342f" ("dmg" "iso" "bin" "nrg" "qcow" "toast" "vcd" "vmdk" "bak"))
(dired-rainbow-define vc "#0074d9" ("git" "gitignore" "gitattributes" "gitmodules"))
(dired-rainbow-define-chmod executable-unix "#38c172" "-.*x.*")
))
(straight-use-package 'dired-open)
(require 'dired-open)
(with-eval-after-load 'dired
(setq dired-open-extensions
'(("mkv" . "mpv")
("mp4" . "mpv")
("avi" . "mpv")
("webm" . "mpv")
;; ("html" . "firefox")
)))
(straight-use-package 'all-the-icons-dired)
(add-hook 'dired-mode-hook 'all-the-icons-dired-mode)
(setq bookmark-default-file "~/.emacs-bookmarks")
(evil-collection-define-key 'normal 'dired-mode-map
"h" 'dired-up-directory
"l" 'dired-find-file)
(evil-define-key 'normal dired-mode-map
(kbd "<localleader>hF") #'helpful-function
(kbd "<localleader>hC") #'helpful-command
(kbd "<localleader>fs") 'save-buffer
(kbd "<localleader>ff") 'find-file
(kbd "<localleader>.") 'persp-switch-to-buffer*
(kbd "<localleader>,") 'consult-buffer
(kbd "<localleader>tt") 'multi-vterm
(kbd "<localleader>bK") 'kill-buffer
(kbd "<localleader>bk") 'kill-this-buffer
(kbd "<localleader>bw") 'kill-buffer-and-window
(kbd "<localleader>bl") 'evil-switch-to-windows-last-buffer
(kbd "<localleader>bj") 'consult-bookmark
(kbd "<localleader>bs") 'bookmark-set
(kbd "<localleader>df") 'delete-frame
(kbd "<localleader><tab>n") 'persp-next
(kbd "<localleader><tab>p") 'persp-prev
(kbd "<localleader><tab>k") 'persp-kill
(kbd "<localleader><tab>b") 'persp-kill-buffer* ; kill perspective buffer
(kbd "<localleader><tab>K") 'persp-kill-others
(kbd "<localleader><tab>l") 'persp-switch-last
(kbd "<localleader><tab>.") 'persp-switch ; switch by name
(kbd "<localleader><tab>r") 'persp-remove-buffer ; remove buffer from current perspective
(kbd "<localleader><tab>R") 'persp-rename
(kbd "<localleader><tab>s") 'persp-state-save ; save persp
(kbd "<localleader><tab>L") 'persp-state-load ; load persp
(kbd "<localleader>wv") (lambda () (interactive) (evil-window-vsplit) (other-window 1))
(kbd "<localleader>ws") (lambda () (interactive) (evil-window-split) (other-window 1))
(kbd "<localleader>wh") 'evil-window-left
(kbd "<localleader>wl") 'evil-window-right
(kbd "<localleader>wj") 'evil-window-down
(kbd "<localleader>wk") 'evil-window-up
(kbd "<localleader>wd") 'evil-window-delete
(kbd "<localleader>qq") 'kill-emacs
(kbd "<localleader>wq") 'save-buffers-kill-emacs)
(straight-use-package 'org)
;; (straight-use-package '(org :type built-in))
(add-hook 'org-mode-hook (lambda ()
(org-indent-mode)
(variable-pitch-mode 1)
(auto-fill-mode 0)
(visual-line-mode 1)
(setq evil-auto-indent nil)
(display-line-numbers-mode 0)))
(setq org-ellipsis " â–ľ"
org-hide-emphasis-markers t
org-src-preserve-indentation t
org-startup-folded t)
(straight-use-package 'org-superstar)
(with-eval-after-load "org"
(add-hook 'org-mode-hook 'org-superstar-mode)
(setq org-superstar-remove-leading-stars t
org-superstar-headline-bullets-list '("â—‰" "â—‹" "â—Ź" "â—‹" "â—Ź" "â—‹" "â—Ź")))
Make sure org-indent face is available
(require 'org-indent)
;; Ensure that anything that should be fixed-pitch in Org files appears that way
(set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
(set-face-attribute 'org-table nil :inherit 'fixed-pitch)
(set-face-attribute 'org-formula nil :inherit 'fixed-pitch)
(set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-indent nil :inherit '(org-hide fixed-pitch))
(set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
(set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
(set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch)
Get rid of the background on column views
(set-face-attribute 'org-column nil :background nil)
(set-face-attribute 'org-column-title nil :background nil)
(setq org-confirm-babel-evaluate nil)
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(python . t)
(shell . t)))
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("p" . "src python"))
(add-to-list 'org-structure-template-alist '("cf" . "src conf"))
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("yl" . "src yaml"))
(add-to-list 'org-structure-template-alist '("vr" . "src vimrc"))
(add-to-list 'org-structure-template-alist '("scc" . "src scc"))
(straight-use-package 'toc-org)
(add-hook 'org-mode-hook 'toc-org-mode)
(evil-define-key 'normal org-mode-map
">" 'org-shiftmetaright
"<" 'org-shiftmetaleft
(kbd "<leader>obt") 'org-babel-tangle)
(straight-use-package 'sudo-edit)
(straight-use-package 'pdf-tools)
(pdf-tools-install)
(setq-default pdf-view-display-size 'fit-page)
(recentf-mode 1)
(setq recentf-max-saved-items 50)
(evil-define-key 'normal 'global
(kbd "<leader>ff") 'find-file
(kbd "<leader>fr") 'recentf-open-files)
- =’persp-modestring-short’= - only displays the current perspective
(straight-use-package 'perspective)
(setq-default persp-initial-frame-name "Main"
persp-modestring-short t
persp-show-modestring nil
;;(persp-format-name NAME)
;; persp-modestring-dividers '("| " " |" " | ") ; Its value is ("[" "]" "|")
persp-modestring-dividers '(" " " " " | ")
persp-state-default-file "~/.persp"
persp-suppress-no-prefix-key-warning t)
;; Running `persp-mode' multiple times resets the perspective list...
(unless (equal persp-mode t)
(persp-mode))
(evil-define-key 'normal 'global
(kbd "<leader>.") 'persp-switch-to-buffer*
(kbd "<leader><tab>n") 'persp-next
(kbd "<leader><tab>p") 'persp-prev
(kbd "<leader><tab>k") 'persp-kill
(kbd "<leader><tab>b") 'persp-kill-buffer* ; kill perspective buffer
(kbd "<leader><tab>K") 'persp-kill-others
(kbd "<leader><tab>l") 'persp-switch-last
(kbd "<leader><tab>.") 'persp-switch ; switch by name
(kbd "<leader><tab>r") 'persp-remove-buffer ; remove buffer from current perspective
(kbd "<leader><tab>R") 'persp-rename
(kbd "<leader><tab>s") 'persp-state-save ; save persp
(kbd "<leader><tab>L") 'persp-state-load) ; load persp
(straight-use-package 'projectile)
(projectile-mode +1)
(define-key projectile-mode-map (kbd "<localleader>p") 'projectile-command-map)
(setq projectile-switch-project-action #'projectile-dired)
(straight-use-package 'vertico)
(vertico-mode 1)
(customize-set-variable 'vertico-cycle t)
(require 'vertico)
;; (require 'vertico-directory "extensions/vertico-directory.el")
(with-eval-after-load "evil"
(define-key vertico-map (kbd "C-j") 'vertico-next)
(define-key vertico-map (kbd "C-k") 'vertico-previous)
(define-key vertico-map [backspace] 'vertico-directory-delete-char))
(straight-use-package 'counsel)
;; (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
;; (global-set-key (kbd "M-x") 'counsel-M-x)
;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
;; (global-set-key (kbd "C-h f") 'counsel-describe-function)
;; (global-set-key (kbd "C-h v") 'counsel-describe-variable)
;; (global-set-key (kbd "C-h o") 'counsel-describe-symbol)
;; (global-set-key (kbd "C-h b") 'counsel-descbinds)
;; (global-set-key (kbd "C-c g") 'counsel-git)
;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
;; (global-set-key (kbd "C-c k") 'counsel-ag)
(global-set-key (kbd "C-c m") 'counsel-linux-app)
;; (global-set-key (kbd "C-c n") 'counsel-fzf)
;; (global-set-key (kbd "C-x l") 'counsel-locate)
(straight-use-package 'marginalia)
(with-eval-after-load "vertico"
(setq marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil))
(marginalia-mode 1))
(straight-use-package 'orderless)
(require 'orderless)
(customize-set-variable 'completion-styles '(orderless))
(customize-set-variable 'completion-category-overrides '((file (styles . (partial-completion)))))
(setq completion-category-defaults nil)
(straight-use-package 'consult)
(global-set-key (kbd "C-s") 'consult-line)
(define-key minibuffer-local-map (kbd "C-r") 'consult-history)
(setq completion-in-region-function #'consult-completion-in-region)
(define-key minibuffer-local-map (kbd "C-r") 'consult-history)
(evil-define-key 'normal 'global
(kbd "<leader>,") 'consult-buffer)
(straight-use-package 'embark)
(global-set-key [remap describe-bindings] #'embark-bindings)
(global-set-key (kbd "C-.") 'embark-act)
;; Use Embark to show bindings in a key prefix with `C-h`
(setq prefix-help-command #'embark-prefix-help-command)
(straight-use-package 'embark-consult)
(with-eval-after-load "embark consult"
(add-hook 'embark-collect-mode 'consult-preview-at-point-mode))
Persist history over Emacs restarts. Vertico sorts by history position
(savehist-mode 1)
(defun bk/minibuffer-backward-kill (arg)
"When minibuffer is completing a file name delete up to parent
folder, otherwise delete a word"
(interactive "p")
(if minibuffer-completing-file-name
;; Borrowed from https://github.com/raxod502/selectrum/issues/498#issuecomment-803283608
(if (string-match-p "/." (minibuffer-contents))
(zap-up-to-char (- arg) ?/)
(delete-minibuffer-contents))
(backward-kill-word arg)))
Set up ws-butler for trimming whitespace and line endings
(straight-use-package 'ws-butler)
(add-hook 'text-mode-hook 'ws-butler-mode)
(add-hook 'prog-mode-hook 'ws-butler-mode)
Do not saves duplicates in kill-ring
(setq kill-do-not-save-duplicates t)
Use spaces instead of tabs
(setq-default indent-tabs-mode nil
tab-width 4)
(save-place-mode 1)
(show-paren-mode 1)
(electric-pair-mode 1)
(straight-use-package 'company)
(add-hook 'after-init-hook 'global-company-mode)
(setq company-minimum-prefix-length 3)
(setq company-idle-delay 0.3)
(straight-use-package 'company-box)
(add-hook 'company-mode-hook 'company-box-mode)
(straight-use-package 'magit)
(straight-use-package 'diff-hl)
(global-diff-hl-mode 1)
(diff-hl-flydiff-mode 1)
(add-hook 'magit-pre-refresh-hook 'diff-hl-magit-pre-refresh)
(add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh)
(evil-define-key 'normal 'global
(kbd "<leader>glc") 'magit-log-current
(kbd "<leader>glf") 'magit-log-buffer-file
(kbd "<leader>gc") 'magit-commit
(kbd "<leader>gs") 'magit-status
(kbd "<leader>gdu") 'magit-diff-unstaged
(kbd "<leader>gc") 'magit-branch-or-checkout
(kbd "<leader>gb") 'magit-branch
(kbd "<leader>gp") 'magit-push-current
(kbd "<leader>gP") 'magit-pull-branch
(kbd "<leader>gf") 'magit-fetch
(kbd "<leader>gF") 'magit-fetch-all
(kbd "<leader>gr") 'magit-rebase)
(straight-use-package 'lsp-mode)
(setq lsp-keymap-prefix "<leader>l")
(setq lsp-enable-folding nil
lsp-enable-text-document-color nil
lsp-enable-on-type-formatting nil
lsp-headerline-breadcrumb-enable nil
lsp-keep-workspace-alive nil
lsp-auto-guess-root t)
(straight-use-package 'lsp-ui)
(straight-use-package 'tree-sitter)
(straight-use-package 'tree-sitter-langs)
(require 'tree-sitter)
(require 'tree-sitter-langs)
(global-tree-sitter-mode)
(add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)
(straight-use-package 'treemacs)
(evil-define-key 'normal 'global
(kbd "<leader>et") 'treemacs)
(straight-use-package 'rust-mode)
(straight-use-package 'cargo)
(add-hook 'rust-mode-hook 'cargo-minor-mode)
(straight-use-package 'python-mode)
(straight-use-package 'lsp-pyright)
(require 'lsp-pyright)
;; (add-hook 'python-mode-hook #'lsp-deferred)
(straight-use-package 'lsp-java)
(require 'lsp-java)
;; (add-hook 'java-mode-hook #'lsp-deferred)
(straight-use-package 'flycheck)
(straight-use-package 'flycheck-rust)
(require 'flycheck)
(add-hook 'after-init-hook #'global-flycheck-mode)
(setq flycheck-check-syntax-automatically '(save
idle-change
mode-enabled))
(add-hook 'emacs-lisp-mode-hook (lambda ()
(flycheck--emacs-lisp-checkdoc-enabled-p)))
(with-eval-after-load 'rust-mode
(add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
#- Make shebang (#!) file executable when saved
(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
(straight-use-package 'yasnippet)
(require 'yasnippet)
(yas-global-mode 1)
(straight-use-package 'yaml-mode)
(add-hook 'yaml-mode-hook 'yaml-mode)
(evil-define-key 'normal 'global
(kbd "<leader>qq") 'kill-emacs
(kbd "<leader>wq") 'save-buffers-kill-emacs
(kbd "<leader>df") 'delete-frame
)
;; (straight-use-package 'telega)
;; (dolist (mode '(telega-root-mode-hook
;; telega-webpage-mode-hook))
;; (add-hook mode (lambda ()
;; (setq visual-fill-column-width 120
;; visual-fill-column-center-text t)
;; (visual-fill-column-mode 1))))
;; (add-hook 'telega-chat-mode-hook (lambda ()
;; (setq visual-fill-column-width 75
;; visual-fill-column-center-text t)
;; (visual-fill-column-mode 1)))
;; ;; (telega-mode-line-mode 1)
;; (telega-notifications-mode 1)
;; (defun bk/telega-msg-count ()
;; (let ((msg_unmuted_count (plist-get telega--unread-message-count :unread_unmuted_count))
;; (chat_unmuted_count (plist-get telega--unread-chat-count :unread_unmuted_count)))
;; (with-temp-file "~/.telega-msg-count.txt"
;; (insert (format "%s(%s)"
;; chat_unmuted_count msg_unmuted_count)))))
;; (add-hook 'telega-root-update-hook 'bk/telega-msg-count)
(straight-use-package 'async)
bytecomp async
(async-bytecomp-package-mode 1)
dired-async
(autoload 'dired-async-mode "dired-async.el" nil t)
(dired-async-mode 1)