/.emacs.d

editor configuration

Primary LanguageEmacs Lisp

Package Configuration

Initialization

;; 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)

UI

Basic UI

common config

  ;; (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)

text file ui

theme

;; 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)

mode line

(use-package doom-modeline
  :ensure t
  :hook (after-init . doom-modeline-mode))
(setq doom-modeline-height 15)
(setq doom-modeline-icon t)

Font Configuration

default font

;;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)

org font

(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)
  )

Helper

File

set backup directory

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)))

scroll configuration

scroll step

(setq scroll-step            0
      scroll-conservatively  10000)

scroll margin

(setq scroll-margin 13);

File Explorer

; 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))

Recent File

(recentf-mode 1)

Project Managing

(use-package projectile
  :ensure t)
(define-key projectile-mode-map  [C-tab] 'projectile-command-map)
(projectile-mode +1)

Org Mode

Initialize

; 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)))

fill mode

; 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))

Template snippets

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"))

Auto-Tangle configuration Files

;; 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)))

bullet mode

(use-package org-bullets
  :after org
  :hook (org-mode . org-bullets-mode)
  :custom
  (org-bullets-bullet-list '("" "" "" "" "" "" "")))

KeyBinding

Removed/Changed Keybindings

(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 Keybinding

(global-set-key (kbd "M-1") 'amay/layout1)
(global-set-key (kbd "<f5>") 'amay/run) 

Window Navigation

window numbering

(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)

window operation

(global-set-key (kbd "C-w w") 'next-window-any-frame)
(global-set-key (kbd "C-w W") 'previous-window-any-frame)

hydra

(use-package hydra)

Custom Defined Function

Every custom defined function start with amay/<FunctionName>

Open/Closing buffer mode

open-terminal

(defun amay/open-terminal()
  "open term"
  (interactive)
  (call-process "urxvt" nil 0 nil)
  )

term

(defun amay/term()
  "open vterm"
  (interactive)
  (vterm "/usr/bin/fish")
  (setq-local face-remapping-alist
              '((default . (:background "#1f2026"))))
  )

internal-terminal

(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"))))
  )

dired

(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"))))
  )

Layout

layout 1

(defun amay/layout1()
  "buka banyak window"
  (interactive)
  (delete-other-windows)
  (amay/dired)
  (windmove-right)
  (amay/internal-terminal)
  (windmove-up)
  )

Functional

run

(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"))
)

new-blank-line

(defun amay/new-blank-line()
  (interactive)
  (move-end-of-line 1)
  (newline)
  )

find

(defun amay/find()
  "find text"
  (interactive)
  (split-window-right)
  (windmove-right)
  (swiper)
  )

Programming

LSP

; 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")

Snippet

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

autocomplete suggest

(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)

Real time syntax checking

;; 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)))

ssss

(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)