mirror of https://github.com/Chizi123/.emacs.d.git

Joel Grunbaum
2021-12-22 5324d5fcbf8e365dc774795ceeedf1cac9d0b4bb
config.org
@@ -8,7 +8,7 @@
  (cond ((eq system-type 'windows-nt)
         (add-to-list 'exec-path "C:/msys64/usr/bin")
         (add-to-list 'exec-path "C:/msys64/mingw64/bin")
         (add-to-list 'exec-path "c:/Program Files/gnuplot")
         (add-to-list 'exec-path "C:/Program Files/gnuplot")
         (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
        ((eq system-type 'darwin)
         (use-package exec-path-from-shell
@@ -86,12 +86,12 @@
  (set-face-italic 'font-lock-keyword-face t)
#+END_SRC
** Remove menu bar, toolbar, but keep scroll bar
** Remove menu bar, toolbar, and scroll bar
Make the emacs interface slightly nicer.
#+BEGIN_SRC emacs-lisp
  (menu-bar-mode 0)
  (tool-bar-mode 0)
  (scroll-bar-mode 1)
  (scroll-bar-mode 0)
#+END_SRC
* COMMENT EXWM
Emacs window manager.
@@ -614,7 +614,7 @@
#+BEGIN_SRC emacs-lisp
  (setq c-default-style '((java-mode . "java")
                         (awk-mode . "awk")
                         (other . "linux")))
                         (other . "k&r")))
#+END_SRC
** Coding system
@@ -624,12 +624,22 @@
  (set-keyboard-coding-system 'utf-8)
  (set-language-environment "UTF-8")
  (prefer-coding-system 'utf-8)
  (setq-default indent-tabs-mode t
                tab-width 8
  (setq-default indent-tabs-mode nil
                tab-width 4
                c-basic-offset tab-width
                cperl-indent-level tab-width)
  (c-set-offset 'inline-open '0)
  (delete-selection-mode)
  (global-set-key (kbd "RET") 'newline-and-indent)
#+END_SRC
*** Smart tabs
Tabs for indentation, spaces for alignment
#+BEGIN_SRC emacs-lisp
    (use-package smart-tabs-mode
      :ensure t
      :config
      (smart-tabs-insinuate 'c 'c++ 'java 'javascript 'cperl 'python 'ruby
                            'nxml))
#+END_SRC
** Move to beginning of line ignoring whitespace
@@ -685,9 +695,15 @@
Remote editing mode.
Hate having to re-input passwords.
#+BEGIN_SRC emacs-lisp
  (when (eq system-type 'windows-nt)
    (setq tramp-default-method "pscp"))
  (setq password-cache-expiry nil)
  (use-package tramp
    :ensure t
    :pin gnu
    :config
    ;; (setq tramp-default-method "ssh")
    (when (eq system-type 'windows-nt)
      (setq tramp-default-method "pscp"))
    (setq password-cache-expiry nil)
    (add-to-list 'tramp-remote-path 'tramp-own-remote-path))
#+END_SRC
** COMMENT Y or N instead of yes or no
@@ -718,6 +734,13 @@
    (minimap-mode))
#+END_SRC
** Highlight indentation
Vertical demarcations for indent levels
#+BEGIN_SRC emacs-lisp
  (use-package highlight-indentation
    :ensure t
    :hook (prog-mode . highlight-indentation-mode))
#+END_SRC
* Mode line tweaks
Diminish is used but is included in init.el such that it can be used throughout this document
** Spaceline
@@ -784,7 +807,6 @@
  :config
  (flycheck-pos-tip-mode))
#+END_SRC
** Company
Company is auto-complete for Emacs.
Uses various backends, more of which are added later.
@@ -795,24 +817,25 @@
    :config
    (global-company-mode)
    (setq company-idle-delay 0)
    (setq company-minimum-prefix-length 3))
    (setq company-minimum-prefix-length 1))
#+END_SRC
** LSP Mode
Use LSP for completion suggestions.
Causes too much memory usage, need to debug.
Need to generate ~compile_flags~ for c/c++, can use ~bear~ but may need other tools.
#+BEGIN_SRC emacs-lisp
  (use-package lsp-mode
    :ensure t
    :hook (((c-mode
             cpp-mode
             c++-mode
             tex-mode
             latex-mode
             TeX-mode
             LaTeX-mode
             rust-mode
             sh-mode
             verilog-mode
             ;; verilog-mode
             go-mode) . lsp))
    :init
    (setq lsp-keymap-prefix "C-c l")
@@ -823,11 +846,11 @@
    (setq lsp-completion-provider :capf)
    (setq lsp-keep-workspace-alive 'nil)
    (add-to-list 'exec-path "~/.cargo/bin"))
  (use-package lsp-ui
    :ensure t
    :commands lsp-ui-mode)
  (use-package helm-lsp
    :ensure t
    :commands helm-lsp-workspace-symbol)
@@ -844,57 +867,89 @@
Emacs git client.
Pretty good and offers fairly decent features.
#+BEGIN_SRC emacs-lisp
  (use-package magit
    :ensure t
    :commands magit-get-top-dir
    :bind ("C-x g" . magit-status)
    :init
    (progn
      ;; make magit status go full-screen but remember previous window
      ;; settings
      ;; from: http://whattheemacsd.com/setup-magit.el-01.html
      (defadvice magit-status (around magit-fullscreen activate)
        (window-configuration-to-register :magit-fullscreen)
        ad-do-it
        (delete-other-windows))
      ;; Close popup when committing - this stops the commit window
      ;; hanging around
      ;; From: http://git.io/rPBE0Q
      (defadvice git-commit-commit (after delete-window activate)
        (delete-window))
      (defadvice git-commit-abort (after delete-window activate)
        (delete-window))
      :config
    (use-package magit
      :ensure t
      :commands magit-get-top-dir
      :bind ("C-x g" . magit-status)
      :init
      (progn
        ;; restore previously hidden windows
        (defadvice magit-quit-window (around magit-restore-screen activate)
          (let ((current-mode major-mode))
            ad-do-it
            ;; we only want to jump to register when the last seen buffer
            ;; was a magit-status buffer.
            (when (eq 'magit-status-mode current-mode)
              (jump-to-register :magit-fullscreen)))))
        ;; make magit status go full-screen but remember previous window
        ;; settings
        ;; from: http://whattheemacsd.com/setup-magit.el-01.html
        (defadvice magit-status (around magit-fullscreen activate)
          (window-configuration-to-register :magit-fullscreen)
          ad-do-it
          (delete-other-windows))
      ;; magit settings
      (setq
       ;; don't put "origin-" in front of new branch names by default
       magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
       ;; open magit status in same window as current buffer
       magit-status-buffer-switch-function 'switch-to-buffer
       ;; highlight word/letter changes in hunk diffs
       magit-diff-refine-hunk t
       ;; ask me if I want to include a revision when rewriting
       magit-rewrite-inclusive 'ask
       ;; ask me to save buffers
       magit-save-some-buffers t
       ;; pop the process buffer if we're taking a while to complete
       magit-process-popup-time 10
       ;; ask me if I want a tracking upstream
       magit-set-upstream-on-push 'askifnotset
       )))
        ;; Close popup when committing - this stops the commit window
        ;; hanging around
        ;; From: http://git.io/rPBE0Q
        (defadvice git-commit-commit (after delete-window activate)
          (delete-window))
        (defadvice git-commit-abort (after delete-window activate)
          (delete-window))
        :config
        (progn
          ;; restore previously hidden windows
          (defadvice magit-quit-window (around magit-restore-screen activate)
            (let ((current-mode major-mode))
              ad-do-it
              ;; we only want to jump to register when the last seen buffer
              ;; was a magit-status buffer.
              (when (eq 'magit-status-mode current-mode)
                (jump-to-register :magit-fullscreen)))))
        ;; magit settings
        (setq
         ;; don't put "origin-" in front of new branch names by default
         magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
         ;; open magit status in same window as current buffer
         magit-status-buffer-switch-function 'switch-to-buffer
         ;; highlight word/letter changes in hunk diffs
         magit-diff-refine-hunk t
         ;; ask me if I want to include a revision when rewriting
         magit-rewrite-inclusive 'ask
         ;; ask me to save buffers
         magit-save-some-buffers t
         ;; pop the process buffer if we're taking a while to complete
         magit-process-popup-time 10
         ;; ask me if I want a tracking upstream
         magit-set-upstream-on-push 'askifnotset
         ))
      )
#+END_SRC
*** More general yes and no prompt
The default setting can miss some.
Don't redefine the regex in case this is too general.
#+BEGIN_SRC emacs-lisp
  ;;(when-let ((regex "[\[\(]]?\\([Yy]\\(es\\)?\\)[/|]\\([Nn]o?\\)[\]\)]")
  (defun magit-process-general-yn-prompt-hook (proc str)
    "Handle [y/n] prompts"
    (when-let ((beg (string-match "[\[\(]]?\\([Yy]\\(es\\)?\\)[/|]\\([Nn]o?\\)[\]\)]" str)))
      (let ;; ((max-mini-window-height 30))
          (process-send-string
           proc
           (downcase
            (concat
             (match-string
              (if (save-match-data
                    (magit-process-kill-on-abort proc
                                                 (y-or-n-p (substring str 0 beg)))) 1 2)
              str)
             "\n"))))))
  (add-hook 'magit-process-prompt-functions
            #'magit-process-general-yn-prompt-hook)
#+END_SRC
*** Gerrit integration
Gerrit takes ~origin:refs/for/master~ as a destination.
Enable magit to work with its oddities.
#+BEGIN_SRC emacs-lisp
  (use-package magit-gerrit
    :ensure t)
#+END_SRC
** CEDET
@@ -948,7 +1003,8 @@
** Language specific configs
*** C/C++
**** Flycheck clang
**** Flycheck
***** Flycheck clang
Add the clang backend for linting.
#+BEGIN_SRC emacs-lisp
  (use-package flycheck-clang-analyzer
@@ -959,8 +1015,25 @@
      (require 'flycheck-clang-analyzer)
       (flycheck-clang-analyzer-setup)))
#+END_SRC
***** Flycheck project root
Flycheck tends to fail finding the project root, giving errors about missing files.
This should remove them.
#+BEGIN_SRC emacs-lisp
  (defun setup-flycheck-project-path ()
    (let ((root (ignore-errors (projectile-project-root))))
      (when root
        (add-to-list
         (make-variable-buffer-local 'flycheck-clang-include-path)
         root)
        (add-to-list
         (make-variable-buffer-local 'flycheck-gcc-include-path)
         root))))
**** Company
  (add-hook 'c-mode-hook 'setup-flycheck-project-path)
  (add-hook 'c++-mode-hook 'setup-flycheck-project-path)
#+END_SRC
**** COMMENT Company
Add header completion as well as Irony, which uses clang for suggestions.
#+BEGIN_SRC emacs-lisp
  (use-package company-c-headers
@@ -970,40 +1043,50 @@
      (add-hook 'c++-mode-hook 'company-mode)
      (add-hook 'c-mode-hook 'company-mode))
  (use-package irony
    :ensure t
    :init
    (setq w32-pipe-read-delay 0)
    (setq irony-server-w32-pipe-buffer-size (* 64 1024))
    (add-hook 'c++-mode-hook 'irony-mode)
    (add-hook 'c-mode-hook 'irony-mode)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
  ;; (use-package irony
  ;;   :ensure t
  ;;   :init
  ;;   (setq w32-pipe-read-delay 0)
  ;;   (setq irony-server-w32-pipe-buffer-size (* 64 1024))
  ;;   (add-hook 'c++-mode-hook 'irony-mode)
  ;;   (add-hook 'c-mode-hook 'irony-mode)
  ;;   (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
  ;;   (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
  (use-package company-irony
    :ensure t
    :after irony
    :config
    (add-to-list 'company-backends '(company-c-headers
                                     company-dabbrev-code
                                     company-irony)))
  ;; (use-package company-irony
  ;;   :ensure t
  ;;   :after irony
  ;;   :config
  ;;   (add-to-list 'company-backends '(company-c-headers
  ;;                                    company-dabbrev-code
  ;;                                    company-irony)))
#+END_SRC
**** Clang-format
Automatically format buffer on save.
#+BEGIN_SRC emacs-lisp
  (when (file-exists-p "/usr/share/clang/clang-format.el")
    (load "/usr/share/clang/clang-format.el")
    (setq clang-format-linux-style (concat "{BasedOnStyle: LLVM,"
                                           "IndentWidth: 8,"
                                           "UseTab: Always,"
                                           "BreakBeforeBraces: Linux,"
                                           "AllowShortIfStatementsOnASingleLine: false,"
                                           "IndentCaseLabels: false}"))
    (setq-default clang-format-style clang-format-linux-style)
    (defun clang-format-on-save ()
      (add-hook 'before-save-hook 'clang-format-buffer nil t))
    (add-hook 'c-mode-hook 'clang-format-on-save nil t)
    (add-hook 'c++-mode-hook 'clang-format-on-save nil t))
      (defun set-clang-format-style ()
          (if (file-exists-p (concat
                              (projectile-project-root)
                              ".clang-format"))
              (setq-local clang-format-style nil)
            (setq-local clang-format-style (concat "{BasedOnStyle: LLVM,"
                                                   "IndentWidth: " (format "%s" tab-width) ","
                                                   "UseTab: " (if (eq indent-tabs-mode nil)
                                                                  "Never"
                                                                "AlignWithSpaces")
  ","
                                                   "BreakBeforeBraces: Linux,"
                                                   "AllowShortIfStatementsOnASingleLine: false,"
                                                   "IndentCaseLabels: false}"))))
      (use-package clang-format
        :ensure t
        :hook (c-mode-common . (set-clang-format-style)))
      ;;   (defun clang-format-on-save ()
      ;;     (add-hook 'before-save-hook 'clang-format-buffer nil t))
      ;;   (add-hook 'c-mode-hook 'clang-format-on-save nil t)
      ;;   (add-hook 'c++-mode-hook 'clang-format-on-save nil t))
#+END_SRC
*** emacs-lisp
**** COMMENT Company
@@ -1121,10 +1204,13 @@
    :ensure t
    :init
    (cond ((eq system-type 'windows-nt)
           (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
           (when (file-exists-p "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar")
             (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar")
             (setq planuml-default-exec-mode 'jar)))
          ((eq system-type 'gnu/linux)
           (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar")))
    (setq planuml-default-exec-mode 'jar))
           (when (file-exists-p "/usr/share/java/plantuml/plantuml.jar")
             (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar")
             (setq planuml-default-exec-mode 'jar)))))
#+END_SRC
*** COMMENT Racket
@@ -1141,75 +1227,41 @@
      (autoload 'racket-mode "Racket" "Racket Editing Mode" t)
      (add-to-list
       'auto-mode-alist
       '("\\.rkt$" . racket-mode))
      (setq matlab-indent-function t))
       '("\\.rkt$" . racket-mode)))
#+END_SRC
*** COMMENT Verilog
*** Verilog
**** Get latest version
Pull the latest version from the web.
Use latest version from repositories.
#+BEGIN_SRC emacs-lisp
  (defun get-verilog-latest()
    (if (not(file-directory-p "~/.emacs.d/elpa/verilog-mode"))
        (make-directory "~/.emacs.d/elpa/verilog-mode"))
    (if (file-exists-p "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
        (delete-file "~/.emacs.d/elpa/verilog-mode/verilog-mode.el"))
    (url-copy-file "https://www.veripool.org/ftp/verilog-mode.el" "~/.emacs.d/elpa/verilog-mode/verilog-mode.el" 1))
#+END_SRC
**** Integrate into emacs
Add updated version (based off auto-package-update) and integrate it with Emacs.
#+BEGIN_SRC emacs-lisp
  (defun verilog-read-file-as-string (file)
    "Read FILE contents."
    (when (file-exists-p file)
      (with-temp-buffer
        (insert-file-contents file)
        (buffer-string))))
  (defun verilog-write-string-to-file (file string)
    "Substitute FILE contents with STRING."
    (with-temp-buffer
      (insert string)
      (when (file-writable-p file)
        (write-region (point-min)
                      (point-max)
                      file))))
  (defun verilog-today-day ()
    (time-to-days (current-time)))
  (defun should-update-verilog-p ()
    "Return non-nil when an update is due."
    (and
     (or
      (not (file-exists-p "~/.emacs.d/.last-verilog-update-day"))
      (if (>= (/ (- (verilog-today-day) (verilog-read-last-update-day)) 7) 1)
          t
        nil))))
  (defun verilog-read-last-update-day ()
    "Read last update day."
    (string-to-number
     (verilog-read-file-as-string "~/.emacs.d/.last-verilog-update-day")))
  (defun verilog-write-current-day ()
    "Store current day."
    (verilog-write-string-to-file
     "~/.emacs.d/.last-verilog-update-day"
     (int-to-string (verilog-today-day))))
  (use-package verilog-mode
    :init
    (when (should-update-verilog-p)
        (get-verilog-latest)
        (verilog-write-current-day))
    (add-to-list 'load-path "~/.emacs.d/elpa/verilog-mode/verilog-mode.el")
    :ensure t
    :pin gnu
    :config
    (autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
    (add-to-list 'auto-mode-alist '("\\.[ds]?vh?\\'" . verilog-mode)))
    (add-to-list 'auto-mode-alist '("\\.[ds]?va?h?\\'" . verilog-mode))
    (setq-default verilog-align-ifelse t
                  verilog-auto-delete-trailing-whitespace t
                  verilog-auto-inst-param-value t
                  verilog-auto-lineup 'all
                  verilog-auto-newline nil
                  verilog-auto-save-policy nil
                  verilog-auto-template-warn-unused t
                  verilog-auto-endcomments nil
                  verilog-highlight-grouping-keywords t
                  verilog-highlight-modules t
                  verilog-tab-to-comment t
                  verilog-indent-begin-after-if nil
                  verilog-indent-lists nil
                  verilog-case-indent 4
                  verilog-cexp-indent 0
                  verilog-indent-level 4
                  verilog-indent-level-behavioral 4
                  verilog-indent-level-declaration 4
                  verilog-indent-level-directive 4
                  verilog-indent-level-module 4))
#+END_SRC
#+END_SRC
*** COMMENT MATLAB
Mode for editing MATLAB m-files.
#+BEGIN_SRC emacs-lisp
@@ -1268,7 +1320,7 @@
  (use-package flycheck-rust
    :ensure t
    :config
    (add-hook 'flyckeck-mode-hook #'flycheck-rust-setup))
    (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
#+END_SRC
*** Go
**** Major mode
@@ -1298,9 +1350,8 @@
** Up to date org
Pull the latest org mode from the repository, rather than the org which comes with emacs.
#+BEGIN_SRC emacs-lisp
    (use-package org
      :ensure org-plus-contrib
      :pin org)
        (use-package org
          :ensure org-contrib)
#+END_SRC
** Small tweaks
@@ -1330,13 +1381,13 @@
               (visual-line-mode 1)))
#+END_SRC
** org-bullets
** Fancy org points
Use bullets of different colours and styles instead of the "\*\*\*" to denote indentation levels.
#+BEGIN_SRC emacs-lisp
  (use-package org-bullets
  (use-package org-superstar
    :ensure t
    :config
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
    (add-hook 'org-mode-hook (lambda () (org-superstar-mode 1))))
#+END_SRC
** Org Babel
@@ -1352,7 +1403,6 @@
                                                             (scheme . t)
                                                             (gnuplot . t)
                                                             (matlab . t)
                                                             (plantuml . t)
                                                             (fortran . t)
                                                             (java . t)
                                                             (plantuml . t)))