Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

STUDY

Emacs Configuration File 본문

emacs

Emacs Configuration File

__main__ 2020. 11. 25. 18:13

Emacs 를 설치하면서 해야 할 일들

 

* Emacs 를 C 드라이브에 설치하지 말고, D 드라이브나 USB 등의 저장 매체에 설치할 것. 그래야 C 드라이브를 포맷하고 복원할 때 다시 Emacs 를 설치하고 설정 파일을 조정하는 지겨운 작업을 피할 수 있다. 그게 아니면 Docker image 로 Docker Hub 에 올려놓거나, Dockerfile 을 만들어 클라우드에 저장시켜 놓는 방법도 있다. 

 

* 어느 PC 에서도 간단한 경로 설정만으로 똑같은 Emacs 가 되도록 configuration  파일 만들어 놓을 것. Reproducible 하다고 표현되는 개념. (Linux 라면 그래도 어느 정도 편하게 설치를 반복할 수는 있지만, Windows 운영 체제에서는 이렇게 제대로 된 설정 파일("~/.emacs" 혹은 "~/init.el")을 만들어 놓으면 대단히 편하다. 

 

* 특히 Org-mode 설정에 신경쓸 것. Org-mode 는 새로운 버전이 있으면 package list 에서 다운로드하여 설치해놓을 것. 그리고 좋아하는 프로그램 언어 중에 Emacs 가 IDE 여야만 하는 것들은 설정 파일에 추가해놓을 것. 

 

* 다른 사람들의 설정은 어떤지 주기적으로 살펴볼 것. 대표적인 Emacs 덕후는 필리핀의 Sacha Chua. 이 여성의 사이트는 놀라울 정도. 

 

D:/util/emacs/.emacs 파일 내용

;; ============================================================================
;;  Automatically created settings                                           
;; ============================================================================

  (custom-set-variables)

  ;; This is default - automatically generated by Eamcs
  ;; (custom-set-faces
  ;;   '(default ((nil (:family "Ubuntu mono" 
  ;;                 :foundry "outline" 
  ;;                 :slant normal 
  ;;                 :weight normal 
  ;;                 :height 140 
  ;;                 :width normal)))))

  (set-face-attribute 'default nil :family "Ubuntu mono" :height 140)
  (set-fontset-font nil 'hangul (font-spec :family "Malgun Gothic" :pixelsize 10))


;; ============================================================================
;;  Performance                                                              
;; ============================================================================

  ;; The default is 800 kilobytes.  Measured in bytes.
  (setq gc-cons-threshold (* 50 1000 1000))

  ;; Profile emacs startup
  (add-hook 'emacs-startup-hook
    (lambda ()
      (message "*** Emacs loaded in %s with %d garbage collections."
        (format "%.2f seconds"
          (float-time
            (time-subtract after-init-time before-init-time)))
      gcs-done)))


;; ============================================================================
;;  Package Sources                                                          
;; ============================================================================

  ;; package source
  (require 'package)
  (setq package-archives '(("melpa" . "https://melpa.org/packages/")
                          ("melpa-stable" . "https://stable.melpa.org/packages/")
                          ("org" . "https://orgmode.org/elpa/")
                          ("elpa" . "https://elpa.gnu.org/packages/")))
  (package-initialize)


;; ============================================================================
;;  Updating Packages                                                        
;; ============================================================================

  ;; ------------------------
  ;; use-package - more convenient package manager
  ;; ------------------------

    (when (not (package-installed-p 'use-package))
      (package-refresh-contents)
      (package-install 'use-package))


    (use-package use-package-hydra
      :ensure t)

  ;; ------------------------
  ;; install package automatically if not already present on your system
  ;; ------------------------

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

  ;; ------------------------
  ;; keep your packages updated automatically
  ;; ------------------------

    ;; commented to maintain org 9.4 version 
    (use-package auto-package-update
      :ensure t
      :config
      (setq auto-package-update-delete-old-versions t
            auto-package-update-interval 4)
      (auto-package-update-maybe))


;; ============================================================================
;;  my custom settings                                                       
;; ============================================================================

  ;; ------------------------
  ;; emacs frames
  ;; ------------------------

    (menu-bar-mode -1)                         ;; hide menu bar
    (tool-bar-mode -1)                         ;; hide tool bar 
    (scroll-bar-mode -1)                       ;; hide scroll bar  
    (setq inhibit-startup-screen t)            ;; skibp welcome screen
    ;; (add-hook 'emacs-startup-hook 'toggle-frame-maximized)
    ;; (when window-system (set-frame-position (selected-frame) 960 0))
    ;; (add-to-list 'default-frame-alist '(height . 50))
    ;; (add-to-list 'default-frame-alist '(width . 100))

    (setq frame-resize-pixelwise t)
    (set-frame-position (selected-frame) 960 0)
    (set-frame-size (selected-frame) 930 1000 t)

  ;; ------------------------
  ;; disable CJK coding/encoding (Chinese/Japanese/Korean characters)
  ;; ------------------------

    (setq utf-translate-cjk-mode nil)
    (set-language-environment 'utf-8)
    (setq locale-coding-system 'utf-8)

    ;; set the default encoding system
    (prefer-coding-system 'utf-8)
    (setq default-file-name-coding-system 'utf-8)
    (set-default-coding-systems 'utf-8)
    (set-terminal-coding-system 'utf-8)
    (set-keyboard-coding-system 'utf-8)

    ;; Treat clipboard input as UTF-8 string first; compound text next, etc.
    (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
    (setenv "LC_CTYPE" "UTF-8")

  ;; ------------------------
  ;; indentation, line number
  ;; ------------------------

    (setq tab-width 2 indent-tabs-mode nil)    ;; disable tab indentation 
    (global-linum-mode 1)                      ;; line number 
    (setq-default column-number-mode t)        ;; column number
    (electric-indent-mode -1)                  ;; indent 

  ;; ------------------------
  ;; Cursor
  ;; ------------------------

    (set-default 'cursor-type  '(bar . 5))
    (blink-cursor-mode 1)
    (set-cursor-color "#fdff00") 

  ;; ------------------------
  ;; disable backup, auto-save, auto-custom 
  ;; ------------------------

    (setq make-backup-files nil)               ;; disable auto-backup
    (setq auto-save-default nil)               ;; disable autosave
    (setq custom-file (make-temp-file "emacs-custom"))

  ;; ------------------------
  ;; parenthesis paring, line height
  ;; ------------------------

    (show-paren-mode t)                        ;; parenthesis 
    (setq show-paren-delay 0)      
    (setq-default line-spacing 0.2)            ;; line space              

  ;; ------------------------
  ;; display time, locale
  ;; ------------------------

    (display-time)                             ;; display time
    (setq system-time-locale "C")              ;; time format English

  ;; ------------------------
  ;; Yes-or-No, move focus between windows
  ;; ------------------------

    (defalias 'yes-or-no-p 'y-or-n-p)          ;; yes-or-no -> y-or-n
    (windmove-default-keybindings)             ;; Let me switch windows with shift-arrows instead of "C-x o" all the time

  ;; ------------------------
  ;; syntax highlighting
  ;; ------------------------

    (global-font-lock-mode 1)                  ;; syntax highlighting
    (tooltip-mode 1)                           ;; tool tip mode on

    ;; key setting
    (global-set-key [f12] 'shell)
    (global-set-key (kbd "<escape>") 'keyboard-escape-quit)
    (global-set-key (kbd "C-z") 'undo) ;Emacs default is bound to hide Emacs.


;; ============================================================================
;;  PKG: Programming                                                         
;; ============================================================================

  ;; ┌───────────────────────────────────────────┐
  ;; | Haskell Programming                       |
  ;; └───────────────────────────────────────────┘

    ;; ------------------------
    ;; haskell-mode 
    ;; ------------------------

      (use-package haskell-mode
        :ensure t
        :mode 
          (("\\.hs\\'"   . haskell-mode)
           ("\\.cabal\\'" . haskell-cabal-mode)
           ("\\.hcr\\'"   . haskell-core-mode))
        :hook 
          (haskell-mode . lsp)
          (haskell-mode . structured-haskell-mode)
          (haskell-mode . interactive-haskell-mode)
        :custom
          (haskell-process-type 'stack-ghci)
        :config
          (setq tab-width 2))    

    ;; ------------------------
    ;; lsp-haskell
    ;; ------------------------

      (use-package lsp-haskell
        :hook 
          ((haskell-mode . lsp))
        :custom
          (lsp-haskell-process-path-hie "ghcide")
          (lsp-haskell-process-args-hie '())
          (lsp-log-io t))

    ;; ------------------------
    ;; company mode
    ;; ------------------------

      (use-package company
        :ensure t
        :init
          (add-hook 'after-init-hook 'global-company-mode)        
        :config
          (setq company-idle-delay 0)
          (setq company-show-numbers "on"))

    ;; ------------------------
    ;; company-ghci mode
    ;; ------------------------

      (use-package company-ghci
        :ensure t
        :after (pos-tip)
        :config
          (defun show-hoogle-info-in-popup ()
            (pos-tip-show (company-ghci/hoogle-info (symbol-at-point)) nil nil nil -1))
          (defun company-ghci-setup ()
            (push 'company-ghci company-backends)
            (define-key evil-normal-state-map (kbd "C-;") (lambda () (interactive) (show-hoogle-info-in-popup))))
        :hook
          (haskell-interactive-mode . company-mode)
          (haskell-mode . company-ghci-setup))

  ;; ┌───────────────────────────────────────────┐
  ;; | Emacs Lisp                                |
  ;; └───────────────────────────────────────────┘

  ;; ┌───────────────────────────────────────────┐
  ;; | Common Lisp                               |
  ;; └───────────────────────────────────────────┘

    (use-package slime
      :ensure t
      :defer t
      :init
        (setq inferior-lisp-program "clisp")
      :config      
        (slime-setup '(slime-fancy slime-company))
      :hook
      (slime-mode . slime-company)
      (slime-mode . (lambda ()
                      (load (expand-file-name "C:/Users/k/quicklisp/slime-helper.el"))
                      (add-to-list 'slime-contribs 'slime-fancy)
                      (add-to-list 'slime-contribs 'inferior-slime))))

    (use-package slime-company
      :after slime
      :bind-keymap 
        ("C-n" . company-select-next)
        ("C-p" . company-select-previous)
        ("C-d" . company-show-doc-buffer)
        ("M-." . company-show-location)
      :config (setq slime-company-completion 'fuzzy
                    slime-company-after-completion 'slime-company-just-one-space))

  ;; ┌───────────────────────────────────────────┐
  ;; | Python                                    |
  ;; └───────────────────────────────────────────┘

    (use-package elpy
      :ensure t
      :mode ("\\.py\\'" . python-mode)
      :init
      (elpy-enable))


;; ============================================================================
;;  PKG - Prettifying Emacs                                                  
;; ============================================================================

  ;; ------------------------
  ;; Dashboard 
  ;; ------------------------

    (use-package dashboard
      :ensure t
      :config
      (setq dashboard-items '((recents  . 5)
                              (bookmarks . 5)
                              (projects . 5)
                              (agenda . 5)
                              (registers . 5)))
      (dashboard-setup-startup-hook)
      (setq dashboard-set-navigator t)
      (setq dashboard-center-content t))

  ;; ------------------------
  ;; smart-mode-line
  ;; ------------------------

    (use-package smart-mode-line
      :config
      (setq sml/no-confirm-load-theme t
            sml/theme 'dark)
      (sml/setup))

  ;; ------------------------
  ;; hl-line 
  ;; ------------------------

    (use-package hl-line
      ;; visible current line
      :disabled
      :ensure t
      :diminish global-hl-line-mode
      :config (global-hl-line-mode))

  ;; ------------------------
  ;; highlight-parentheses
  ;; ------------------------

    (use-package highlight-parentheses
      :ensure t
      :diminish highlight-parentheses-mode
      :commands highlight-parentheses-mode)

  ;; ------------------------
  ;; highlight multiple occurences
  ;; ------------------------

    (use-package highlight-symbol 
      :ensure t
      :config
        (set-face-attribute 'highlight-symbol-face nil
                            :background "default"
                            :foreground "#33FF5D")
        (setq highlight-symbol-idle-delay 0)
        (setq highlight-symbol-on-navigation-p t)
      :hook
        (prog-mode . highlight-symbol-mode)
        (prog-mode . highlight-symbol-nav-mode))

  ;; ------------------------
  ;; Highlight-Indentation-for-Emacs
  ;; ------------------------

    (use-package highlight-indentation
      :ensure t)

  ;; ------------------------
  ;; color scheme - gruvbox theme
  ;; ------------------------

    (use-package gruvbox-theme
      :ensure t
      :config
        (load-theme 'gruvbox-dark-hard t))

  ;; ------------------------
  ;; nyan cat mode
  ;; ------------------------

    (use-package nyan-mode
      :config
      (nyan-mode 1))

  ;; ------------------------
  ;; htmlize - syntax highlight for HTML export
  ;; ------------------------

    (use-package htmlize
      :ensure t)

  ;; ------------------------
  ;; powerline
  ;; ------------------------

    (use-package powerline
      :ensure t
      :config 
      (powerline-default-theme))

  ;; ------------------------
  ;; rainbow-delimiters 
  ;; ------------------------

    (use-package rainbow-delimiters
      :ensure t)

  ;; ------------------------
  ;; rainbow-blocks
  ;; ------------------------

    (use-package rainbow-blocks
      :ensure t)

  ;; ------------------------
  ;; hl-todo
  ;; ------------------------

    (use-package hl-todo
      :ensure t
      :config
      (setq hl-todo-keyword-faces
      '(("TODO"   . "#FF0000")
        ("FIXME"  . "#FF0000")
        ("DEBUG"  . "#A020F0")
        ("GOTCHA" . "#FF4500")
        ("STUB"   . "#1E90FF"))))


;; ============================================================================
;;  PKG: Project Management                                                  
;; ============================================================================

  ;; ------------------------
  ;; projectile
  ;; ------------------------

    (use-package projectile
      :diminish projectile-mode 
      :ensure t   
      :config (projectile-mode)
      :bind-keymap
        ("C-c p" . projectile-command-map)
      :init 
        (when (file-directory-p "C:/Users/k/Documents/emacs_practice")
          (setq projectile-project-search-path '("C:/Users/k/Documents/emacs_practice")))
        (setq projectile-switch-project-action #'projectile-dired)) 

    (use-package helm-projectile
      :ensure t
      :bind ("M-t" . helm-projectile-find-file)
      :config
      (helm-projectile-on))

    (defun sr-open-file ()
      "Open file using projectile+Helm or ido"
      (interactive)
      (if (projectile-project-p)
          (helm-projectile)
        (ido-find-file)))

    (global-set-key (kbd "M-o") 'sr-open-file)

  ;; ------------------------
  ;; org-projectile
  ;; ------------------------

    (use-package org-projectile
      :disabled 
      :bind (("C-c n p" . org-projectile-project-todo-completing-read)
            ("C-c c" . org-capture))
      :config
      (progn
        (setq org-directory "C:/Users/k/Documents/emacs_practice/")
        ;; (setq org-agenda-files (list org-directory))
        (setq org-projectile-projects-file
              "C:/Users/k/Documents/emacs_practice/projects.org")
        (setq org-agenda-files (append org-agenda-files (org-projectile-todo-files)))
        (push (org-projectile-project-todo-entry) org-capture-templates))
      :ensure t)


;; ============================================================================
;;  PKG: File Navigation, Mini-buffer Command, Help                          
;; ============================================================================

  ;; ------------------------
  ;; ibuffer
  ;; ------------------------

    (use-package ibuffer
      :after hydra
      :bind 
        ;; global key map 
        ("C-x C-b" . ibuffer)
        ;; ibuffer-mode key-map
        (:map ibuffer-mode-map ("." . hydra-ibuffer-main/body))
      :hydra 
        (hydra-ibuffer-main (:color pink :hint nil)
          "
          ^Navigation^       ^Mark^          ^Actions^          ^View^
          --------------------------------------------------------------------
          _k_  : move up     _m_: mark       _D_: delete        _g_: refresh
          _RET_: visit       _u_: unmark     _S_: save          _s_: sort
          _j_  : move down   _*_: specific   _a_: all actions   _/_: filter
          --------------------------------------------------------------------
          "
          ("j" ibuffer-forward-line)
          ("RET" ibuffer-visit-buffer :color blue)
          ("k" ibuffer-backward-line)

          ("m" ibuffer-mark-forward)
          ("u" ibuffer-unmark-forward)
          ("*" hydra-ibuffer-mark/body :color blue)

          ("D" ibuffer-do-delete)
          ("S" ibuffer-do-save)
          ("a" hydra-ibuffer-action/body :color blue)

          ("g" ibuffer-update)
          ("s" hydra-ibuffer-sort/body :color blue)
          ("/" hydra-ibuffer-filter/body :color blue)

          ("o" ibuffer-visit-buffer-other-window "other window" :color blue)
          ("q" quit-window "quit ibuffer" :color blue)
          ("." nil "toggle hydra" :color blue))

        (hydra-ibuffer-mark (:color teal :columns 5
                                      :after-exit (hydra-ibuffer-main/body))
          "Mark"
          ("*" ibuffer-unmark-all "unmark all")
          ("M" ibuffer-mark-by-mode "mode")
          ("m" ibuffer-mark-modified-buffers "modified")
          ("u" ibuffer-mark-unsaved-buffers "unsaved")
          ("s" ibuffer-mark-special-buffers "special")
          ("r" ibuffer-mark-read-only-buffers "read-only")
          ("/" ibuffer-mark-dired-buffers "dired")
          ("e" ibuffer-mark-dissociated-buffers "dissociated")
          ("h" ibuffer-mark-help-buffers "help")
          ("z" ibuffer-mark-compressed-file-buffers "compressed")
          ("b" hydra-ibuffer-main/body "back" :color blue))

        (hydra-ibuffer-action (:color teal :columns 4
                                        :after-exit
                                        (if (eq major-mode 'ibuffer-mode)
                                            (hydra-ibuffer-main/body)))
          "Action"
          ("A" ibuffer-do-view "view")
          ("E" ibuffer-do-eval "eval")
          ("F" ibuffer-do-shell-command-file "shell-command-file")
          ("I" ibuffer-do-query-replace-regexp "query-replace-regexp")
          ("H" ibuffer-do-view-other-frame "view-other-frame")
          ("N" ibuffer-do-shell-command-pipe-replace "shell-cmd-pipe-replace")
          ("M" ibuffer-do-toggle-modified "toggle-modified")
          ("O" ibuffer-do-occur "occur")
          ("P" ibuffer-do-print "print")
          ("Q" ibuffer-do-query-replace "query-replace")
          ("R" ibuffer-do-rename-uniquely "rename-uniquely")
          ("T" ibuffer-do-toggle-read-only "toggle-read-only")
          ("U" ibuffer-do-replace-regexp "replace-regexp")
          ("V" ibuffer-do-revert "revert")
          ("W" ibuffer-do-view-and-eval "view-and-eval")
          ("X" ibuffer-do-shell-command-pipe "shell-command-pipe")
          ("b" nil "back"))

        (hydra-ibuffer-sort (:color amaranth :columns 3)
          "Sort"
          ("i" ibuffer-invert-sorting "invert")
          ("a" ibuffer-do-sort-by-alphabetic "alphabetic")
          ("v" ibuffer-do-sort-by-recency "recently used")
          ("s" ibuffer-do-sort-by-size "size")
          ("f" ibuffer-do-sort-by-filename/process "filename")
          ("m" ibuffer-do-sort-by-major-mode "mode")
          ("b" hydra-ibuffer-main/body "back" :color blue))

        (hydra-ibuffer-filter (:color amaranth :columns 4)
          "Filter"
          ("m" ibuffer-filter-by-used-mode "mode")
          ("M" ibuffer-filter-by-derived-mode "derived mode")
          ("n" ibuffer-filter-by-name "name")
          ("c" ibuffer-filter-by-content "content")
          ("e" ibuffer-filter-by-predicate "predicate")
          ("f" ibuffer-filter-by-filename "filename")
          (">" ibuffer-filter-by-size-gt "size")
          ("<" ibuffer-filter-by-size-lt "size")
          ("/" ibuffer-filter-disable "disable")
          ("b" hydra-ibuffer-main/body "back" :color blue))
      )

  ;; ------------------------
  ;; buffler
  ;; ------------------------

  ;; ------------------------
  ;; restart-emacs
  ;; ------------------------

    (use-package restart-emacs
      :ensure t)

  ;; ------------------------
  ;; ido 
  ;; ------------------------

    (use-package ido-vertical-mode
      :init (ido-vertical-mode 1)
      :config
      ;; make buffer switch command do suggestions, also for find-file command
      (require 'ido)
      (ido-mode 1)
      (ido-everywhere 1)

      ;; show choices vertically
      (if (version< emacs-version "25")
          (progn
            (make-local-variable 'ido-separator)
            (setq ido-separator "\n"))
        (progn
          (make-local-variable 'ido-decorations)
          (setf (nth 2 ido-decorations) "\n")))

      ;; ido everywhere 
      (setq ido-everywhere t)

      ;; show any name that has the chars you typed
      (setq ido-enable-flex-matching t)

      ;; use current pane for newly opened file
      (setq ido-default-file-method 'selected-window)

      ;; use current pane for newly switched buffer
      (setq ido-default-buffer-method 'selected-window)

      ;; stop ido from suggesting when naming new file
      (define-key (cdr ido-minor-mode-map-entry) [remap write-file] nil))

  ;; ------------------------
  ;; company-quickhelp
  ;; ------------------------

    (use-package company-quickhelp          ; Documentation popups for Company
      :ensure t
      :defer t
      :init (add-hook 'global-company-mode-hook #'company-quickhelp-mode))

  ;; ------------------------
  ;; helpful
  ;; ------------------------

    (use-package helpful
      :ensure t
      :bind 
      (("C-h f" . helpful-callable)
       ("C-h v" . helpful-variable)
       ("C-h k" . helpful-key)))

  ;; ------------------------
  ;; ivy - counsel - swiper
  ;; ------------------------

  ;; ------------------------
  ;; smex
  ;; ------------------------

    (use-package smex
      :ensure t
      :config
      :bind 
        (("M-x" . smex)
         ("M-X" . smex-major-mode-commands)
         ("C-c C-c M-x" . execute-extended-command)))
         
  ;; ------------------------
  ;; treemacs
  ;; ------------------------

    (use-package treemacs
      :disabled
      :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                 t
              treemacs-file-event-delay              5000
              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-git-command-pipe              ""
              treemacs-goto-tag-strategy             'refetch-index
              treemacs-indentation                   2
              treemacs-indentation-string            " "
              treemacs-is-never-other-window         nil
              treemacs-max-git-entries               5000
              treemacs-missing-project-action        'ask
              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-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-show-cursor                   nil
              treemacs-show-hidden-files             t
              treemacs-silent-filewatch              nil
              treemacs-silent-refresh                nil
              treemacs-sorting                       'alphabetic-asc
              treemacs-space-between-root-nodes      t
              treemacs-tag-follow-cleanup            t
              treemacs-tag-follow-delay              1.5
              treemacs-user-mode-line-format         nil
              treemacs-user-header-line-format       nil
              treemacs-width                         35
              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 22)

        (treemacs-follow-mode t)
        (treemacs-filewatch-mode t)
        (treemacs-fringe-indicator-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))))
      :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 B"   . treemacs-bookmark)
            ("C-x t C-t" . treemacs-find-file)
            ("C-x t M-t" . treemacs-find-tag)))

    (use-package lsp-treemacs
      :after treemacs
      :config 
      (lsp-treemacs-sync-mode 1))

  ;; ------------------------
  ;; hydra
  ;; ------------------------

    (use-package hydra
      :after ibuffer
      :init
        ;; hydra for buffer menu
        (defhydra hydra-buffer-menu (:color pink :hint nil)
          "
        ^Mark^             ^Unmark^           ^Actions^          ^Search
        ^^^^^^^^-----------------------------------------------------------------
        _m_: mark          _u_: unmark        _x_: execute       _R_: re-isearch
        _s_: save          _U_: unmark up     _b_: bury          _I_: isearch
        _d_: delete        ^ ^                _g_: refresh       _O_: multi-occur
        _D_: delete up     ^ ^                _T_: files only: % -28`Buffer-menu-files-only
        _~_: modified
        "
          ("m" Buffer-menu-mark)
          ("u" Buffer-menu-unmark)
          ("U" Buffer-menu-backup-unmark)
          ("d" Buffer-menu-delete)
          ("D" Buffer-menu-delete-backwards)
          ("s" Buffer-menu-save)
          ("~" Buffer-menu-not-modified)
          ("x" Buffer-menu-execute)
          ("b" Buffer-menu-bury)
          ("g" revert-buffer)
          ("T" Buffer-menu-toggle-files-only)
          ("O" Buffer-menu-multi-occur :color blue)
          ("I" Buffer-menu-isearch-buffers :color blue)
          ("R" Buffer-menu-isearch-buffers-regexp :color blue)
          ("c" nil "cancel")
          ("v" Buffer-menu-select "select" :color blue)
          ("o" Buffer-menu-other-window "other-window" :color blue)
          ("q" quit-window "quit" :color blue))        

        (define-key Buffer-menu-mode-map "." 'hydra-buffer-menu/body))


;; ============================================================================
;;  PKG - Editting                                                           
;; ============================================================================

  ;; ------------------------
  ;; autocomplete
  ;; ------------------------

    (use-package auto-complete
      :disabled
      :ensure t
      :diminish auto-complete-mode
      :config
        (require 'auto-complete-config)
        (ac-config-default))

  ;; ------------------------
  ;; multiple-cursors - Sublime Text like selection 
  ;; ------------------------

    (use-package multiple-cursors
      :ensure t
      :defer t
      :bind (("C-S-c C-S-c" . mc/edit-lines)
            ("C->" . mc/mark-next-like-this)
            ("C-<" . mc/mark-previous-like-this)
            ("C-c C-<" . mc/mark-all-like-this)
            ("C-c o" . mc/mark-all-like-this)))

  ;; ------------------------
  ;; mark-multiple
  ;; ------------------------

    (use-package mark-multiple
      :disabled
      :ensure t
      :bind 
        ("C-x r t" . inline-string-rectangle)
        ("C-<" . mark-previous-like-this)
        ("C->" . mark-next-like-this)
        ("C-*" . mark-all-like-this)
      :hook
        (sgml-mode-hook . (lambda ()
            (require 'rename-sgml-tag)
            (define-key sgml-mode-map (kbd "C-c C-r") 'rename-sgml-tag))))

  ;; ------------------------
  ;; keypression: display pressed
  ;; ------------------------

    (use-package keypression
      :disabled
      :ensure t)

  ;; ------------------------
  ;; keypression: display pressed
  ;; ------------------------

    (use-package paredit
      :ensure t
      :diminish paredit-mode
      :init
      (use-package paredit-everywhere
        :ensure t))


;; ============================================================================
;;  Org-mode                                                                 
;; ============================================================================

  ;; ------------------------
  ;; org-mode config
  ;; ------------------------

    (use-package org
      ;; ------------------------------
      :mode (("\\.org$" . org-mode))
      
      ;; ------------------------------
      :bind 
        ("C-c a" . org-agenda)
        ("C-c c" . org-capture)
        ("C-c l" . org-store-link)
        ("C-c b" . org-iswitchb)

      ;; ------------------------------
      :hook 
        (org-mode . (lambda () (org-bullets-mode 1)))  ;; bullet mode on
        (org-src-mode . display-line-numbers-mode)     ;; show line numbers in current buffer
        (org-mode . visual-line-mode)                  ;; word wrap
        (org-mode . (lambda () (electric-indent-local-mode -1)))

      ;; ------------------------------
      :custom-face
        (org-document-title ((t (:inherit outline-1 :weight bold :height 2.0))))
        (org-level-1 ((t (:inherit outline-1 :weight bold :height 1.2))))
        (org-level-2 ((t (:inherit outline-2 :weight bold :height 1.1))))
        (org-level-3 ((t (:inherit outline-3 :weight bold :height 1.0))))
        (org-level-4 ((t (:inherit outline-4 :weight bold :height 1.0))))
        (org-level-5 ((t (:inherit outline-5 :weight bold :height 1.0))))

      ;; ------------------------------
      :custom
        ;; variable settings: src blocks, headings, etc.
        (electric-indent-mode -1)
        (org-cycle-separator-lines  -1)
        (org-hide-emphasis-markers  t)
        (org-hide-leading-stars  t)
        (org-src-fontify-natively  t)
        (org-src-tab-acts-natively  t)
        (org-edit-src-content-indentation  0)
        (org-hide-block-startup  nil)
        (org-src-preserve-indentation  nil)
        (org-startup-indented  t)
        ;; (org-startup-folded  'overview)
        ;; (org-cycle-separator-lines  2)

        ;; LOGBOOK always into drawer
        (org-log-state-notes-into-drawer  t)
        (org-log-into-drawer  t)

      ;; ------------------------------
      :config
        ;; code block background
        (require 'color)
        (set-face-attribute 'org-block nil :background
                            (color-darken-name
                            (face-attribute 'default :background) 3))
        ;; language specific settings
        ;; (setq org-src-block-faces '(("emacs-lisp" (:background "#000000"))
        ;;                             ("haskell" (:background "#000000"))))

        ;; org-agenda-files
        (setq org-directory "D:/backup/emacs_practice")
        (setq org-agenda-files (list org-directory))

        ;; Show full heading paths for refiling
        (setq org-refile-use-outline-path t)

        ;; org-refile variables
        (setq org-refile-targets (quote ((org-agenda-files :level . 1))))
        
        ;; varible settings: org-capture 
        ;; (setq org-default-notes-file "/notes.org")

        ;; org-babel
        (require 'org-tempo)

        (add-to-list 'org-structure-template-alist '("sh" . "src sh"))
        (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
        (add-to-list 'org-structure-template-alist '("sc" . "src scheme"))
        (add-to-list 'org-structure-template-alist '("ts" . "src typescript"))
        (add-to-list 'org-structure-template-alist '("py" . "src python"))
        (add-to-list 'org-structure-template-alist '("yaml" . "src yaml"))
        (add-to-list 'org-structure-template-alist '("json" . "src json"))

        (setq org-babel-load-languages
        '((awk        . t)
          (C          . t)
          (calc       . t)
          (css        . t)
          (ditaa      . t)
          (emacs-lisp . t)
          (gnuplot    . t)
          (haskell    . t)
          (js         . t)
          (lisp       . t)
          (org        . t)
          (plantuml   . t)
          (python     . t)
          (scheme     . t)
          (shell      . t)
          (sql        . t)))
        ;; Activate Babel languages
        (org-babel-do-load-languages
        'org-babel-load-languages
        org-babel-load-languages))

  ;; ------------------------
  ;; org autocomplete
  ;; ------------------------

    (use-package org-ac
      :config (org-ac/config-default))

  ;; ------------------------
  ;; org-bullets - prettify org bullets
  ;; ------------------------

    (use-package org-bullets
      :hook 
        (org-mode . (lambda () (org-bullets-mode 1))))

  ;; ------------------------
  ;; Org-roam
  ;; ------------------------

    (use-package org-roam
      :disabled                     ;; if you need this pkg, comment this line
      :ensure t      
      :custom
        ;; org-roam-directory 
        (org-roam-directory "C:/Users/k/Documents/emacs_practice")

        ;; path to org-graph 
        (org-roam-graph-executable "~/Graphviz/bin/dot.exe")
        (org-roam-graph-viewer "C:/Program Files (x86)/Google/Chrome/Application/chrome")
        ;; (org-roam-graph-viewer nil)              
        ;; (org-roam-graph-viewer #'eww-open-file)  ;; display SVG source code 

      :config
        ;; Generate a graph and then save it to a location
        (defun org-roam-graph-save ()
          (setq org-roam-graph-viewer nil)
          (interactive)
          (call-interactively 'org-roam-graph)
          (rename-file (nth 0 (file-expand-wildcards "C:/Users/k/AppData/Local/Temp/graph.*.dot")) "C:/Users/k/Documents/emacs_practice/graph.dot" t)
          (rename-file (nth 0 (file-expand-wildcards "C:/Users/k/AppData/Local/Temp/graph.*.svg")) "C:/Users/k/Documents/emacs_practice/graph.svg" t)) 

      :bind 
        (:map org-roam-mode-map
          (("C-c n l" . org-roam)
           ("C-c n f" . org-roam-find-file)
           ("C-c n g" . org-roam-graph)
           ("C-c n s" . org-roam-graph-save))
        :map org-mode-map
          (("C-c n i" . org-roam-insert))
          (("C-c n I" . org-roam-insert-immediate)))

      :hook
        (after-init . org-roam-mode))


    (use-package company-org-roam
      :disabled
      :ensure t
      :config
      (push 'company-org-roam company-backends))


  ;; ------------------------
  ;; Org-roam-server
  ;; ------------------------
    ;; display web-based node graph 
    ;; using "emacs server" and "org-roam-protocol" ???
    (use-package org-roam-server
      :disabled                     ;; if you need this pkg, comment this line
      :after org-roam
      :custom
        (org-roam-server-host  "127.0.0.1")
        (org-roam-server-port  8080)
        (org-roam-server-authenticate  nil)
        (org-roam-server-export-inline-images  t)
        (org-roam-server-serve-files  nil)
        (org-roam-server-served-file-extensions  '("pdf" "mp4" "ogv"))
        (org-roam-server-network-poll  t)
        (org-roam-server-network-arrows  nil)
        (org-roam-server-network-label-truncate  t)
        (org-roam-server-network-label-truncate-length  60)
        (org-roam-server-network-label-wrap-length  20))

 

 

'emacs' 카테고리의 다른 글

gVim Configuration  (0) 2020.06.04
Useful key bindings  (0) 2019.02.06
Changing the location of Emacs' config. file  (0) 2019.01.24
Vim - Select Multiple Cursors  (0) 2019.01.13
Comments