;; package Initialization
;; ==============================================================
(require 'package)
(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/")
("org" . "http://orgmode.org/elpa/")))
(package-initialize)
;; (setq inhibit-startup-screen t) ;remove startup screen
(scroll-bar-mode -1) ; Disable visible scrollbar
(tool-bar-mode -1) ; Disable the toolbar
(tooltip-mode -1) ; Disable tooltips
(set-fringe-mode 10) ; Give some breathing room
(menu-bar-mode -1) ; disable menubar
(global-hl-line-mode t)
;; transparent background
(set-frame-parameter (selected-frame) 'alpha '(98 . 95))
;; save session when quit
;(desktop-save-mode 1)
;; highlight matching parentheses
(show-paren-mode 1)
(menu-bar-display-line-numbers-mode 'absolute)
(display-line-numbers-mode 1)
;; Disable line numbers for some modes
(dolist (mode '(org-mode-hook
vterm-mode-hook
shell-mode-hook
dired-mode-hook))
(add-hook mode (lambda () (display-line-numbers-mode 0))))
(use-package rainbow-delimiters)
(rainbow-delimiters-mode)
;; get icon
(use-package all-the-icons)
;; show eol indicator
(whitespace-newline-mode 1)
;; set theme
(use-package doom-themes
:ensure t
:config
;; Global settings (defaults)
(setq doom-themes-enable-bold t ; if nil, bold is universally disabled
doom-themes-enable-italic t) ; if nil, italics is universally disabled
;; Enable flashing mode-line on errors
(doom-themes-visual-bell-config)
;; Enable custom neotree theme (all-the-icons must be installed!)
(doom-themes-neotree-config)
;; or for treemacs users
(setq doom-themes-treemacs-theme "doom-atom") ; use "doom-colors" for less minimal icon theme
(doom-themes-treemacs-config)
;; Corrects (and improves) org-mode's native fontification.
(doom-themes-org-config))
(load-theme 'doom-one t)
(use-package doom-modeline
:ensure t
:hook (after-init . doom-modeline-mode))
(setq doom-modeline-height 15)
(setq doom-modeline-icon t)
;;Set font size
(set-face-attribute 'default nil :font "Fira Code Retina" :height 70)
(set-face-attribute 'fixed-pitch nil :font "Fira Code Retina" :height 70)
;; Set the variable pitch face
(set-face-attribute 'variable-pitch nil :font "Cantarell" :height 90 :weight 'regular)
(defun efs/org-font-setup ()
;; Replace list hypen with dot
(font-lock-add-keywords 'org-mode
'(("^ *\\([-]\\) "
(0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
;; Set faces for heading levels
(dolist (face '((org-level-1 . 1.2)
(org-level-2 . 1.1)
(org-level-3 . 1.05)
(org-level-4 . 1.0)
(org-level-5 . 1.1)
(org-level-6 . 1.1)
(org-level-7 . 1.1)
(org-level-8 . 1.1)))
(set-face-attribute (car face) nil :font "Cantarell" :weight 'regular :height (cdr face)))
;; 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-code nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-table nil :inherit '(shadow 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)
)
store all backup file to make-button
;; store all backup and autosave files in the tmp dir
(setq backup-directory-alist
`((".*" . ,temporary-file-directory)))
(setq auto-save-file-name-transforms
`((".*" ,temporary-file-directory t)))
(setq scroll-step 0
scroll-conservatively 10000)
(setq scroll-margin 13);
; File Explorer Configuration
; =====================================================
(use-package dired
:hook (dired-mode . dired-hide-details-mode))
(use-package all-the-icons-dired
:hook (dired-mode . all-the-icons-dired-mode))
(use-package dired-open
:config
(setq dired-open-extensions '(("png" . "sxiv")
("mkv" . "mpv")
("mp4" . "mpv")
("jpg" . "sxiv"))))
(use-package dired-hide-dotfiles
:hook (dired-mode . dired-hide-dotfiles-mode)
:config
(define-key dired-mode-map "H" 'dired-hide-dotfiles-mode))
(recentf-mode 1)
(use-package projectile
:ensure t)
(define-key projectile-mode-map [C-tab] 'projectile-command-map)
(projectile-mode +1)
; Org mode configuration
; ================================================
(use-package org
:hook (org-mode . efs/org-mode-setup)
:config
(setq org-ellipsis " ▾")
(efs/org-font-setup))
(defun efs/org-mode-setup ()
(org-indent-mode)
(variable-pitch-mode)
(visual-line-mode))
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t) (python . t)))
; add side margin
(defun efs/org-mode-visual-fill ()
(setq visual-fill-column-width 150
visual-fill-column-center-text t)
(visual-fill-column-mode 1))
(use-package visual-fill-column
:hook (org-mode . efs/org-mode-visual-fill))
snippet `<el` will produce source block of emacs-lisp
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("py" . "src python"))
;; automatically tangle our Emacs.org config file when we save it
(defun efs/org-babel-tangle-config ()
(when (string-equal (buffer-file-name)
(expand-file-name "~/.emacs.d/emacs.org"))
;; Dynamic scoping rescue
(let ((org-confirm-babel-evaluate nil))
(org-babel-tangle))))
(add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'efs/org-babel-tangle-config)))
(use-package org-bullets
:after org
:hook (org-mode . org-bullets-mode)
:custom
(org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●")))
(global-unset-key (kbd "C-SPC"))
(global-unset-key (kbd "C-w"))
(global-unset-key (kbd "C-d"))
(global-unset-key (kbd "C-s"))
(global-set-key (kbd "M-1") 'amay/layout1)
(global-set-key (kbd "<f5>") 'amay/run)
(use-package winum)
(winum-mode)
(global-set-key (kbd "C-w s") 'winum-select-window-by-number)
(global-set-key (kbd "C-1") 'winum-select-window-1)
(global-set-key (kbd "C-2") 'winum-select-window-2)
(global-set-key (kbd "C-3") 'winum-select-window-3)
(global-set-key (kbd "C-4") 'winum-select-window-4)
(global-set-key (kbd "C-5") 'winum-select-window-5)
(global-set-key (kbd "C-6") 'winum-select-window-6)
(global-set-key (kbd "C-7") 'winum-select-window-7)
(global-set-key (kbd "C-8") 'winum-select-window-8)
(global-set-key (kbd "C-9") 'winum-select-window-9)
(global-set-key (kbd "C-w w") 'next-window-any-frame)
(global-set-key (kbd "C-w W") 'previous-window-any-frame)
(use-package hydra)
Every custom defined function start with amay/<FunctionName>
(defun amay/open-terminal()
"open term"
(interactive)
(call-process "urxvt" nil 0 nil)
)
(defun amay/term()
"open vterm"
(interactive)
(vterm "/usr/bin/fish")
(setq-local face-remapping-alist
'((default . (:background "#1f2026"))))
)
(defun amay/internal-terminal()
"open internal vterm and compilation"
(interactive)
(split-window-below -15)
(windmove-down)
(vterm "/usr/bin/fish")
(setq-local face-remapping-alist
'((default . (:background "#1f2026"))))
;; (split-window-right)
;; (windmove-right)
;; (switch-to-buffer "Compilation")
;; (compilation-mode)
;; (setq-local face-remapping-alist
;; '((default . (:background "#231f24"))))
)
(defun amay/dired()
"open dired"
(interactive)
(split-window-right 30)
(dired ".")
(setq-local face-remapping-alist
'((default . (:background "#33343a"))))
;; (split-window-below)
;; (windmove-down)
;; (windmove-right)
;; (lsp-ui-imenu)
;; (delete-window)
;; (windmove-left)
;; (switch-to-buffer "*lsp-ui-imenu*")
;; (setq-local face-remapping-alist
;; '((default . (:background "#3c393d"))))
)
(defun amay/layout1()
"buka banyak window"
(interactive)
(delete-other-windows)
(amay/dired)
(windmove-right)
(amay/internal-terminal)
(windmove-up)
)
(defun amay/run()
"Run c program"
(interactive)
(compile (concat "cc -g -Wall -Werror " (file-name-nondirectory buffer-file-name)
"&& ./a.out"))
;; (shell-command (concat "urxvt --hold -e ./a.out > /dev/null &1"))
)
(defun amay/new-blank-line()
(interactive)
(move-end-of-line 1)
(newline)
)
(defun amay/find()
"find text"
(interactive)
(split-window-right)
(windmove-right)
(swiper)
)
; Language server protocol
;==================================================
(use-package lsp-mode :commands lsp)
(use-package lsp-ui :commands lsp-ui-mode)
(use-package helm-lsp :commands helm-lsp-workspace-symbol)
(use-package lsp-ivy :commands lsp-ivy-workspace-symbol)
(use-package lsp-treemacs :commands lsp-treemacs-errors-list)
(use-package dap-mode)
(setq lsp-headerline-breadcrumb-enable nil)
(add-hook 'c-mode-hook 'lsp)
(add-hook 'c++-mode-hook 'lsp)
(with-eval-after-load 'lsp-mode
(add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration)
(require 'dap-cpptools)
(yas-global-mode))
(use-package ccls
:hook ((c-mode c++-mode objc-mode cuda-mode) .
(lambda () (require 'ccls) (lsp))))
(setq ccls-executable "/bin/ccls")
(use-package yasnippet
:ensure t)
(yas-global-mode 1)
(use-package company
:ensure t)
(add-hook 'after-init-hook 'global-company-mode)
(add-to-list 'company-backends 'company-capf)
(setq company-idle-delay 0)
;; Flycheck Config
;; =============================================
(use-package flycheck
:ensure t)
(global-flycheck-mode)
(add-hook 'c++-mode-hook (lambda () (setq flycheck-gcc-language-standard "c++17")))
(add-hook 'c++-mode-hook (lambda () (flycheck-select-checker 'c/c++-gcc)))
(global-set-key (kbd "C-w n") 'make-frame)
(global-set-key (kbd "C-w l") 'split-window-right)
(global-set-key (kbd "C-w j") 'split-window-below)
(global-set-key (kbd "C-s d") 'lsp-describe-thing-at-point)
(global-set-key (kbd "C-s r") 'xref-find-references)
(global-set-key (kbd "C-]") 'lsp-find-definition)
(require 'multiple-cursors)
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
(multiple-cursors-mode 1)
(global-set-key (kbd "C-n") 'mc/mark-next-like-this)
(global-set-key (kbd "C-S-n") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-p") 'previous-history-element)
(global-set-key (kbd "C-b") 'compile)
(global-set-key (kbd "C-t") 'hydra-navtab/body)