;; Make startup faster by reducing the frequency of garbage
;; collection. The default is 800 kilobytes
(setq gc-cons-threshold most-positive-fixnum)
;; Increase the amount of data which Emacs reads from the process.
;; The default is 4 kilobytes make it 1 Megabyte
(setq read-process-output-max (* 1024 1024))
(setq file-name-handler-alist nil)
;; 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)
(advice-add #'package--ensure-init-file :override #'ignore)
;; Prevent the glimpse of un-styled Emacs by disabling these UI elements early.
(push '(menu-bar-lines . 0) default-frame-alist)
(push '(tool-bar-lines . 0) default-frame-alist)
(push '(vertical-scroll-bars) default-frame-alist)
;; 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)
;; remove default menu bar
(menu-bar-mode nil)
;; disable electric pair and show parent
(electric-pair-mode nil)
(show-paren-mode nil)
;; hide both frame title bar and the icon
(setq ns-use-proxy-icon nil
frame-title-format nil)
;; disable these GUI based behaviors
(when window-system
(scroll-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1))
;; disable and customize startup message
(setq inhibit-startup-message t
initial-scratch-message ";; Happy Hacking\n")
;;; use UTF-8 everywhere
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
;; define the font family and size
(add-to-list 'default-frame-alist '(font . "PragmataPro-15"))
;; Load pragmatapro-lig.el
(add-to-list 'load-path "~/.emacs.d/files")
(require 'pragmatapro-lig)
(add-hook 'text-mode-hook 'prettify-hook)
(add-hook 'prog-mode-hook 'prettify-hook)
(global-prettify-symbols-mode t)
(defun set-initial-frame ()
"Defines and center the frame window"
(let* ((base-factor 0.54)
(a-width (* (display-pixel-width) base-factor))
(a-height (* (display-pixel-height) base-factor))
(a-left (truncate (/ (- (display-pixel-width) a-width) 2)))
(a-top (truncate (/ (- (display-pixel-height) a-height) 2))))
(set-frame-position (selected-frame) a-left a-top)
(set-frame-size (selected-frame) (truncate a-width) (truncate a-height) t)))
(setq frame-resize-pixelwise t)
(set-initial-frame)
;; enable transparent titlebar with dark-mode
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))
;; disable backup
(setq make-backup-files nil)
;; Don't make new frames when opening a new file with Emacs
(setq ns-pop-up-frames nil)
;; define alias to answering just 'y' or 'n' instead
(defalias 'yes-or-no-p 'y-or-n-p)
;; Highlight the current line
(global-hl-line-mode t)
;; nice scrolling
(setq scroll-margin 0
scroll-conservatively 100000
scroll-preserve-screen-position t)
;; make buffer name unique with style
(setq uniquify-buffer-name-style 'reverse
uniquify-separator "|"
uniquify-after-kill-buffer-p t
uniquify-ignore-buffers-re "^\\*")
;; dependable keybindings
(global-set-key (kbd "C-c l") #'goto-line)
(global-set-key (kbd "\C-c n") #'rename-buffer)
(global-set-key (kbd "C-c w") #'whitespace-mode)
(global-set-key (kbd "<C-s-return>") #'toggle-frame-fullscreen)
(require 'package)
(setq package-check-signature nil)
(setq package-enable-at-startup nil)
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/"))
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/"))
(package-initialize)
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package)
(package-install 'diminish)
(package-install 'bind-key))
(eval-when-compile
(require 'use-package))
(require 'diminish)
(require 'bind-key)
(use-package exec-path-from-shell
:ensure t
:if (memq window-system '(mac ns))
:config
(setq exec-path-from-shell-variables
'("LANG" "LC_CTYPE" "LC_NUMERIC" "LC_ALL" "HOME" "PERSONAL_ACCESS_TOKEN"
"FLASK_APP" "FLASK_ENV" "SECRET_KEY" "FLASK_MODE" "SERVER_MODE"
"POSTGRES_DB" "POSTGRES_DB_TEST" "POSTGRES_USER" "POSTGRES_PASSWORD"
"POSTGRES_PORT" "POSTGRES_HOST" "POSTGRES_TEST_HOST"
"MAIL_USERNAME" "MAIL_PASSWORD" "SECURITY_PASSWORD_SALT"
"TELCO_63510_SMS_SEND_PASSWORD" "TELCO_63514_SMS_SEND_PASSWORD"
"TELCO_63513_SMS_SEND_PASSWORD" "SENDGRID_API_KEY"
"PATH"))
(exec-path-from-shell-initialize))
(use-package doom-themes
:ensure t
:config
(setq doom-themes-enable-bold nil
doom-themes-enable-italic nil)
(load-theme 'doom-outrun-electric t)
(doom-themes-visual-bell-config)
(doom-themes-org-config))
(use-package doom-modeline
:ensure t
:config (setq doom-modeline-persp-name nil)
:hook (after-init . doom-modeline-mode))
(use-package winum
:ensure t
:config (winum-mode))
(use-package all-the-icons
:ensure t
:config (setq inhibit-compacting-font-caches t))
;; better error details
;; (setq debug-on-error t)
;; default directory for dire-mode
(setq default-directory "~/")
;; don't backup please. I got this
(setq make-backup-files nil)
;; disable emacs lockfiles
(setq create-lockfiles nil)
;; disable recentf
(recentf-mode nil)
;; activate column-number-mode
(column-number-mode t)
(setq-default indicate-buffer-boundaries 'right)
;; delete marked region with 'DEL' key or backspace
(delete-selection-mode t)
;; define abbrev file
(setq abbrev-file-name (expand-file-name "abbrev.el" user-emacs-directory))
(unless (file-exists-p abbrev-file-name)
(write-region "" "" abbrev-file-name))
;; supress some warning
(setq ad-redefinition-action 'accept)
;; add char-menu
(use-package char-menu
:ensure t
:bind ("M-p" . char-menu)
:custom
(char-menu '("—" "‘’" "“”" "…" "«»" "–"
("Typography" "•" "©" "†" "‡" "°" "·" "§" "№" "★")
("Mathematical Operators"
"∀" "∁" "∂" "∃" "∄" "∅" "∆" "∇" "∈" "∉" "∊" "∋" "∌" "∍" "∎" "∏"
"∐" "∑" "−" "∓" "∔" "∕" "∖" "∗" "∘" "∙" "√" "∛" "∜" "∝" "∞" "∟"
"∠" "∡" "∢" "∣" "∤" "∥" "∦" "∧" "∨" "∩" "∪" "∫" "∬" "∭" "∮" "∯"
"∰" "∱" "∲" "∳" "∴" "∵" "∶" "∷" "∸" "∹" "∺" "∻" "∼" "∽" "∾" "∿"
"≀" "≁" "≂" "≃" "≄" "≅" "≆" "≇" "≈" "≉" "≊" "≋" "≌" "≍" "≎" "≏"
"≐" "≑" "≒" "≓" "≔" "≕" "≖" "≗" "≘" "≙" "≚" "≛" "≜" "≝" "≞" "≟"
"≠" "≡" "≢" "≣" "≤" "≥" "≦" "≧" "≨" "≩" "≪" "≫" "≬" "≭" "≮" "≯"
"≰" "≱" "≲" "≳" "≴" "≵" "≶" "≷" "≸" "≹" "≺" "≻" "≼" "≽" "≾" "≿"
"⊀" "⊁" "⊂" "⊃" "⊄" "⊅" "⊆" "⊇" "⊈" "⊉" "⊊" "⊋" "⊌" "⊍" "⊎" "⊏"
"⊐" "⊑" "⊒" "⊓" "⊔" "⊕" "⊖" "⊗" "⊘" "⊙" "⊚" "⊛" "⊜" "⊝" "⊞" "⊟"
"⊠" "⊡" "⊢" "⊣" "⊤" "⊥" "⊦" "⊧" "⊨" "⊩" "⊪" "⊫" "⊬" "⊭" "⊮" "⊯"
"⊰" "⊱" "⊲" "⊳" "⊴" "⊵" "⊶" "⊷" "⊸" "⊹" "⊺" "⊻" "⊼" "⊽" "⊾" "⊿"
"⋀" "⋁" "⋂" "⋃" "⋄" "⋅" "⋆" "⋇" "⋈" "⋉" "⋊" "⋋" "⋌" "⋍" "⋎" "⋏"
"⋐" "⋑" "⋒" "⋓" "⋔" "⋕" "⋖" "⋗" "⋘" "⋙" "⋚" "⋛" "⋜" "⋝" "⋞" "⋟"
"⋠" "⋡" "⋢" "⋣" "⋤" "⋥" "⋦" "⋧" "⋨" "⋩" "⋪" "⋫" "⋬" "⋭" "⋮" "⋯"
"⋰" "⋱" "⋲" "⋳" "⋴" "⋵" "⋶" "⋷" "⋸" "⋹" "⋺" "⋻" "⋼" "⋽" "⋾" "⋿")
("Superscripts & Subscripts"
"⁰" "ⁱ" "⁴" "⁵" "⁶" "⁷" "⁸" "⁹" "⁺" "⁻" "⁼" "⁽" "⁾" "ⁿ"
"₀" "₁" "₂" "₃" "₄" "₅" "₆" "₇" "₈" "₉" "₊" "₋" "₌" "₍₎"
"ₐ" "ₑ" "ₒ" "ₓ" "ₔ" "ₕ" "ₖ" "ₗ" "ₘ" "ₙ" "ₚ" "ₛ" "ₜ")
("Arrows" "←" "→" "↑" "↓" "⇐" "⇒" "⇑" "⇓")
("Greek" "α" "β" "Y" "δ" "ε" "ζ" "η" "θ" "ι" "κ" "λ" "μ"
"ν" "ξ" "ο" "π" "ρ" "σ" "τ" "υ" "φ" "χ" "ψ" "ω")
("Enclosed Alphanumerics"
"①" "②" "③" "④" "⑤" "⑥" "⑦" "⑧" "⑨" "Ⓐ" "Ⓑ" "Ⓒ" "Ⓓ" "Ⓔ" "Ⓕ" "Ⓖ"
"Ⓗ" "Ⓘ" "Ⓙ" "Ⓚ" "Ⓛ" "Ⓜ" "Ⓝ" "Ⓞ" "Ⓟ" "Ⓠ" "Ⓡ" "Ⓢ" "Ⓣ" "Ⓤ" "Ⓥ" "Ⓦ"
"Ⓧ" "Ⓨ" "Ⓩ" "ⓐ" "ⓑ" "ⓒ" "ⓓ" "ⓔ" "ⓕ" "ⓖ" "ⓗ" "ⓘ" "ⓙ" "ⓚ" "ⓛ" "ⓜ"
"ⓝ" "ⓞ" "ⓟ" "ⓠ" "ⓡ" "ⓢ" "ⓣ" "ⓤ" "ⓥ" "ⓦ" "ⓧ" "ⓨ" "ⓩ" "⓪")
("Annotations"
" " " " " " " " " " " " " " " "
" " " " " " " " " " " "))))
(setq-default cursor-type '(bar . 1)
blink-cursor-delay 0
blink-cursor-interval 0.4)
;; flashes the cursor's line switched buffer
(use-package beacon
:ensure t
:config
(beacon-mode t)
(setq beacon-color "#0057FF"))
(use-package which-key
:ensure t
:custom
(which-key-separator " ")
(which-key-prefix-prefix "+")
:config (which-key-mode t))
(use-package ivy
:ensure t
:diminish (ivy-mode . "")
:init (ivy-mode t) ; globally at startup
:config
(setq ivy-count-format "%d/%d "
ivy-display-style 'fancy
ivy-initial-input-alist nil
;; ivy-re-builders-alist
;; '((swiper . ivy--regex-plus)
;; (t . ivy--regex-fuzzy))
))
(use-package ivy-rich
:ensure t
:config
(setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line)
(ivy-rich-mode t))
(use-package all-the-icons-ivy
:ensure t
:after ivy
:config (all-the-icons-ivy-setup))
(use-package amx
:ensure t
:after ivy
:custom (amx-set-backend 'auto)
:config (amx-mode t))
(use-package flx :ensure t)
(use-package counsel
:ensure t
:after (ivy amx)
:bind* ; load when pressed
(("C-x C-m" . counsel-M-x)
("M-x" . counsel-M-x)
("C-s" . swiper-isearch)
("C-r" . swiper-isearch)
("C-x C-f" . counsel-find-file)
("C-x C-r" . counsel-recentf)
("C-c g" . counsel-git)
("C-c j" . counsel-git-grep)
("C-c /" . counsel-ag)
("C-x l" . counsel-locate)
("C-x C-f" . counsel-find-file)
("<f1> f" . counsel-describe-function)
("<f1> v" . counsel-describe-variable)
("<f1> l" . counsel-find-library)
("<f2> i" . counsel-info-lookup-symbol)
("<f2> u" . counsel-unicode-char)
("C-c C-r" . ivy-resume)))
(use-package counsel-osx-app
:ensure t)
(use-package avy-flycheck
:ensure t
:config
(global-set-key (kbd "C-'") #'avy-flycheck-goto-error))
(use-package org
:ensure org-plus-contrib
:config (setq
org-startup-folded t
org-src-fontify-natively t
org-src-tab-acts-natively t
org-todo-keywords '((sequence "BACKLOG(b)" "TODO(t)" "DOING(n)" "|" "DONE(d)")
(sequence "|" "ONHOLD(h)" "CANCELED(c)"))
org-agenda-files '("~/.org/agenda.org")))
(use-package restclient
:ensure t
:config (add-hook 'restclient-mode-hook 'company-restclient))
(use-package company-restclient
:ensure t
:config
(progn
(add-hook 'restclient-mode-hook
(lambda ()
(set (make-local-variable 'company-backends)'(company-restclient))
(company-mode t)))))
(use-package ob-restclient
:ensure t
:config
(org-babel-do-load-languages 'org-babel-load-languages '((restclient . t))))
;; ANSI & XTERM 256 color support
(use-package xterm-color
:ensure t
:defines (compilation-environment
eshell-preoutput-filter-functions
eshell-output-filter-functions)
:functions (compilation-filter my-advice-compilation-filter)
:init
;; For shell and interpreters
(setenv "TERM" "xterm-256color")
(setq comint-output-filter-functions
(remove 'ansi-color-process-output comint-output-filter-functions))
(add-hook 'comint-preoutput-filter-functions 'xterm-color-filter)
(add-hook 'shell-mode-hook
(lambda ()
;; Disable font-locking to improve performance
(font-lock-mode -1)
;; Prevent font-locking from being re-enabled
(make-local-variable 'font-lock-function)
(setq font-lock-function #'ignore)))
;; For eshell
(with-eval-after-load 'esh-mode
(add-hook 'eshell-before-prompt-hook
(lambda ()
(setq xterm-color-preserve-properties t)))
(add-to-list 'eshell-preoutput-filter-functions 'xterm-color-filter)
(setq eshell-output-filter-functions
(remove 'eshell-handle-ansi-color eshell-output-filter-functions)))
;; For compilation buffers
(setq compilation-environment '("TERM=xterm-256color"))
(defun my-advice-compilation-filter (f proc string)
(funcall f proc
(if (eq major-mode 'rg-mode) ; compatible with `rg'
string
(xterm-color-filter string))))
(advice-add 'compilation-filter :around #'my-advice-compilation-filter)
(advice-add 'gud-filter :around #'my-advice-compilation-filter))
;; nameframe
(use-package nameframe
:ensure t
:config
(global-set-key (kbd "C-c :") 'nameframe-create-frame)
(global-set-key (kbd "C-c ;") 'nameframe-switch-frame))
;; perspective
(use-package perspective
:ensure t
:init
(setq persp-mode-prefix-key (kbd "C-c C-p"))
:config
(persp-mode)
(persp-turn-on-modestring)
(define-key persp-mode-map (kbd "C-x b") 'persp-switch-to-buffer*)
(define-key persp-mode-map (kbd "C-x k") 'persp-kill-buffer*))
(use-package nameframe-perspective
:ensure t
:config
(nameframe-perspective-mode t))
;; projectile
(use-package projectile
:ensure t
:config
(projectile-global-mode)
(setq projectile-completion-system 'ivy)
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))
(use-package counsel-projectile
:ensure t
:config
(counsel-projectile-mode))
(setenv "PAGER" "cat")
(use-package shrink-path
:ensure t)
(use-package esh-autosuggest
:ensure t
:hook (eshell-mode . esh-autosuggest-mode))
(use-package eshell
:ensure t
:config
(setq
eshell-banner-message "...\n"
eshell-hist-ignoredups t
eshell-error-if-no-glob t
eshell-cmpl-ignore-case t
eshell-save-history-on-exit t
eshell-history-size 1024
eshell-prefer-lisp-functions nil
eshell-destroy-buffer-when-process-dies t
eshell-scroll-to-bottom-on-input 'all))
(use-package eshell-fringe-status
:ensure t
:config
(add-hook 'eshell-mode-hook 'eshell-fringe-status-mode))
(defun git-get-current-branch ()
"Get git branch in the current directory."
(when (and (eshell-search-path "git") (locate-dominating-file (eshell/pwd) ".git"))
(s-trim (shell-command-to-string (concat "git symbolic-ref --short HEAD --")))))
(defun display-git-prompt-branch ()
"Displays the git in the prompt."
(if (not (null (git-get-current-branch))) (concat "│" (git-get-current-branch)) ""))
(defun get-first-char (str)
"Get first character of string STR."
(if (zerop (length str)) "" (substring str 0 1)))
(defun fill-window-with-char ()
"Fill the window width with one character acting as a line."
(concat (make-string (- (window-body-width) 1) ? ) "\n"))
(defun pwd-shorten-dirs (pwd)
"Shorten all directory names in PWD except the last two."
(let ((path-items (split-string pwd "/")))
(if (> (length path-items) 2)
(concat
(mapconcat 'get-first-char (butlast path-items 2) "/")
"/"
(mapconcat (lambda (item) item) (last path-items 2) "/"))
pwd)))
(defun eshell/clear ()
"Clear and scrollback."
(eshell/clear-scrollback))
(setq eshell-prompt-function
(lambda nil
(concat
(propertize "\n" 'face nil)
;; (propertize "\n" 'face '(:background "#191919"))
(propertize "╭⟢" 'face '(:foreground "#A2DEB2"))
(propertize " " 'face nil)
(propertize (user-login-name) 'face '(:foreground "#5DC078"))
(propertize "@" 'face '(:foreground "#0057FF"))
(propertize (system-name) 'face '(:foreground "#0083FF"))
(propertize " ⯌ " 'face nil)
(propertize "│" 'face '(:foreground "#74CAFF"))
(propertize (pwd-shorten-dirs (abbreviate-file-name (eshell/pwd)))
'face '(:foreground "#74CAFF"))
(propertize " ⯌ " 'face nil)
(propertize (display-git-prompt-branch) 'face '(:foreground "#A2DEB2"))
(propertize "\n" 'face nil)
(propertize "╰🡢" 'face '(:foreground "#A2DEB2"))
(propertize " " 'face nil))))
(setq eshell-highlight-prompt nil)
;; Set this to match eshell-prompt-function
(setq eshell-prompt-regexp "^╰🡢 ")
(use-package flycheck
:ensure t
:hook ((prog-mode . flycheck-mode))
:config
(setq flycheck-highlighting-mode 'lines))
(use-package company
:ensure t
:config
(global-company-mode t)
(setq company-idle-delay 0.0
company-minimum-prefix-length 1
company-global-modes '(not eshell-mode))
(define-key company-active-map (kbd "M-n") nil)
(define-key company-active-map (kbd "M-p") nil)
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "TAB") 'company-complete)
(define-key company-active-map (kbd "<tab>") 'company-complete))
(use-package company-flx
:ensure t
:config (company-flx-mode t))
(use-package smartparens
:ensure t
:config (progn (show-smartparens-global-mode t))
:hook (prog-mode . turn-on-smartparens-mode))
(use-package rainbow-delimiters
:ensure t
:hook (prog-mode . rainbow-delimiters-mode))
(use-package highlight-indent-guides
:ensure t
:hook (prog-mode . highlight-indent-guides-mode)
:custom
(highlight-indent-guides-character ?\│)
(highlight-indent-guides-auto-odd-face-perc 2)
(highlight-indent-guides-auto-even-face-perc 2)
(highlight-indent-guides-auto-character-face-perc 8)
(highlight-indent-guides-method 'character)
(highlight-indent-guides-responsive 'character)
(highlight-indent-guides-delay 0))
(use-package lsp-python-ms
:ensure t
:config
(add-to-list 'lsp-language-id-configuration '(python-mode . "python"))
:hook (python-mode . (lambda () (require 'lsp-python-ms) (lsp))))
;; (use-package pyenv-mode :ensure t)
;; (use-package pyenv-mode-auto :ensure t)
;; (use-package blacken
;; :after python
;; :hook (python-mode . blacken-mode))
(defun flutter-lsp-save ()
"Upgrade save in flutter to do formatting and hot-reload"
(interactive)
(lsp-format-buffer)
(save-buffer)
(if (flutter--running-p)
(flutter-hot-reload)))
(use-package dart-mode
:ensure t
:config
(add-to-list 'lsp-language-id-configuration '(dart-mode . "dart"))
(with-eval-after-load "projectile"
(add-to-list 'projectile-project-root-files-bottom-up "pubspec.yaml")
(add-to-list 'projectile-project-root-files-bottom-up "build")))
(use-package flutter
:ensure t
:after dart-mode
;; :custom (flutter-sdk-path "/Applications/flutter/")
:bind (:map dart-mode-map ("C-x C-s" . #'flutter-lsp-save)))
(use-package lua-mode
:ensure t)
(use-package groovy-mode
:ensure t
:mode "\\.groovy\\'\\|\\.gradle\\'")
(use-package toml-mode
:ensure t)
(use-package rust-mode
:ensure t
:init
(setq rust-format-on-save t)
:hook (rust-mode . lsp))
(use-package cargo
:ensure t
:hook (rust-mode . cargo-minor-mode))
(use-package flycheck-rust
:ensure t
:after (rust-mode)
:hook ((rust-mode . flycheck-rust-setup)
(flycheck-mode . flycheck-rust-setup)))
(use-package json-mode
:ensure t
:mode (("\\.json\\'" . json-mode)
("\\.tmpl\\'" . json-mode)
("\\.eslintrc\\'" . json-mode))
:config (setq-default js-indent-level 2))
(use-package json-reformat
:ensure t
:after json-mode
:bind (("C-c r" . json-reformat-region)))
(use-package js2-mode
:ensure t
:mode "\\.jsx?\\'"
:config (setq js2-basic-offset 2
js-indent-level 2)
:hook (js2-mode . lsp))
(use-package rjsx-mode
:ensure t
:mode "\\.jsx?\\'"
:config (setq-default js2-basic-offset 2))
(use-package typescript-mode
:ensure t
:mode "\\.tsx?\\'"
:config (setq typescript-indent-level 2)
:hook (typescript-mode . lsp))
(use-package prettier-js
:ensure t
:init
(add-hook 'js2-mode-hook 'prettier-js-mode)
(add-hook 'rjsx-mode-hook 'prettier-js-mode)
(add-hook 'typescript-mode-hook 'prettier-js-mode))
(use-package skewer-mode
:ensure t
:bind (("C-c K" . run-skewer))
:diminish skewer-mode
:init
(add-hook 'js2-mode-hook 'skewer-mode)
(add-hook 'css-mode-hook 'skewer-css-mode)
(add-hook 'html-mode-hook 'skewer-html-mode))
(defun get-dart-path ()
(string-trim-right
(car
(seq-filter
(lambda (str) (string-match "dart" str))
(split-string (getenv "PATH") ":")))
"/bin"))
(use-package lsp-mode
:ensure t
:config
(setq lsp-prefer-flymake nil
;; lsp-dart-sdk-dir (get-dart-path)
lsp-enable-on-type-formatting nil
lsp-headerline-breadcrumb-enable nil
lsp-idle-delay 0.500 ;; can improve performance
lsp-prefer-capf t ;; replacing company-lsp
lsp-log-max 10000)
:hook
(sh-mode . lsp)
(python-mode . lsp)
(dart-mode . lsp)
(js2-mode . lsp)
(typescript-mode . lsp)
(lsp-mode . lsp-enable-which-key-integration)
:commands (lsp lsp-ensurered))
(use-package lsp-ui
:ensure t
:requires lsp-mode flycheck
:config
(setq lsp-ui-sideline-enable t
lsp-ui-sideline-show-symbol nil)
:hook (lsp-mode . lsp-ui-mode))
(use-package lsp-ivy :commands lsp-ivy-workspace-symbol)
(use-package yasnippet
:ensure t
:diminish yas-minor-mode
:config
(use-package yasnippet-snippets
:ensure t)
(yas-global-mode t))
(use-package magit
:ensure t
:config (setq magit-completing-read-function 'ivy-completing-read)
:bind ("C-x g" . magit-status))
(use-package forge
:ensure t
:after magit
:config
(add-to-list
'forge-alist
'("er.github.com" "api.github.com" "github.com"
forge-github-repository))
(add-to-list
'forge-alist
'("er.bitbucket.org" "api.bitbucket.org/2.0" "bitbucket.org"
forge-bitbucket-repository)))
(if (display-graphic-p)
(use-package git-gutter-fringe
:ensure t
:init (global-git-gutter-mode))
(use-package git-gutter
:ensure t
:init (global-git-gutter-mode)))
(use-package dockerfile-mode :ensure t)
(use-package docker-compose-mode :ensure t)
(use-package docker-tramp :ensure t)
(add-hook
'after-init-hook
(lambda ()
(let ((custom-file
(expand-file-name "custom.el" user-emacs-directory)))
(unless (file-exists-p custom-file)
(write-region "" "" custom-file))
(load custom-file))))
;; Make gc pauses faster by decreasing the threshold.
(setq gc-cons-threshold (* 16 1000 1000))