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

Joel Grunbaum
2021-12-22 ccdb5b9ec4af3879d2792f98782c91d2aae93fd4
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.
@@ -100,6 +100,7 @@
#+BEGIN_SRC emacs-lisp
  (use-package exwm
    :ensure t
    :defer t
    :config
    (require 'exwm-config)
    (exwm-config-default))
@@ -123,7 +124,14 @@
  (diminish 'flyspell-mode)
#+END_SRC
** Language Tool
Language tool is an open source grammar checker.
#+BEGIN_SRC emacs-lisp
  (use-package langtool
    :ensure t
    :init
    (setq langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*"))
#+END_SRC
** Switch-window
Helps to change windows easily when many are open at once.
#+BEGIN_SRC emacs-lisp
@@ -162,9 +170,9 @@
Helpful pdf viewer.
#+BEGIN_SRC emacs-lisp
  (use-package pdf-tools
   :ensure t
   :config
   (pdf-tools-install 1))
    :ensure t
    :config
    (pdf-tools-install 1))
#+END_SRC
** COMMENT Writegood-mode
@@ -384,12 +392,12 @@
** Pretty symbols
Why not? They make it look nice.
#+BEGIN_SRC emacs-lisp
  (when window-system
    (use-package pretty-mode
      :ensure t
      :diminish t
      :config
      (global-pretty-mode)))
  (use-package pretty-mode
    :ensure t
    :diminish t
    :if window-system
    :config
    (global-pretty-mode))
#+END_SRC
** COMMENT Find file other window
@@ -468,8 +476,7 @@
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-delimiters
    :ensure t
    :init
      (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
    :hook (prog-mode . rainbow-delimiters-mode))
#+END_SRC
** Following whitespace
@@ -611,16 +618,28 @@
#+END_SRC
** Coding system
Cause we all love UTF8
Cause we all love UTF8.
#+BEGIN_SRC emacs-lisp
  (set-terminal-coding-system 'utf-8)
  (set-keyboard-coding-system 'utf-8)
  (set-language-environment "UTF-8")
  (prefer-coding-system 'utf-8)
  (setq-default indent-tabs-mode t
            tab-width 4)
  (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
@@ -676,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
@@ -709,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
@@ -750,10 +782,11 @@
    :ensure t
    :diminish yas-minor-mode
    :config
    (use-package yasnippet-snippets
      :ensure t)
    (yas-reload-all)
    (yas-global-mode 1))
  (use-package yasnippet-snippets
    :ensure t
    :after yasnippet)
#+END_SRC
** Flycheck
@@ -774,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.
@@ -785,21 +817,34 @@
    :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
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 ((lsp-mode . lsp-enable-which-key-integration))
    :hook (((c-mode
             c++-mode
             tex-mode
             latex-mode
             TeX-mode
             LaTeX-mode
             rust-mode
             sh-mode
             verilog-mode
             go-mode) . lsp))
    :init
    (setq lsp-keymap-prefix "C-c l")
    :commands lsp
    :config
    (add-hook 'lsp-mode-hook 'lsp-enable-which-key-integration)
    (setq read-process-output-max (* 1024 1024))
    (setq lsp-completion-provider :capf)
    (setq lsp-keep-workspace-alive 'nil)
    (add-to-list 'exec-path "~/.cargo/bin"))
  (use-package lsp-ui
@@ -810,12 +855,14 @@
    :ensure t
    :commands helm-lsp-workspace-symbol)
#+END_SRC
** Version control
Settings for emacs' own version control system.
*** Enable version control on the mode line
#+BEGIN_SRC emacs-lisp
  (vc-mode)
#+END_SRC
** Magit
Emacs git client.
Pretty good and offers fairly decent features.
@@ -876,9 +923,10 @@
** CEDET
*** Semantic
Parser library for code, supports many other packages.
Allows emacs to be mode aware of what is being written.
Allows emacs to be more aware of what is being written.
#+BEGIN_SRC emacs-lisp
  (use-package semantic
    :hook (prog-mode . semantic-mode)
    :config
    (global-semanticdb-minor-mode 1)
    (global-semantic-idle-scheduler-mode 1)
@@ -923,25 +971,37 @@
** Language specific configs
*** C/C++
**** COMMENT yasnippet
Enable yasnippet for C/C++.
#+BEGIN_SRC emacs-lisp
(add-hook 'c++-mode-hook 'yas-minor-mode)
(add-hook 'c-mode-hook 'yas-minor-mode)
#+END_SRC
**** Flycheck clang
**** Flycheck
***** Flycheck clang
Add the clang backend for linting.
#+BEGIN_SRC emacs-lisp
(use-package flycheck-clang-analyzer
  :ensure t
  :config
  (with-eval-after-load 'flycheck
    (require 'flycheck-clang-analyzer)
     (flycheck-clang-analyzer-setup)))
  (use-package flycheck-clang-analyzer
    :ensure t
    :after flycheck
    :config
    (with-eval-after-load 'flycheck
      (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))))
  (add-hook 'c-mode-hook 'setup-flycheck-project-path)
  (add-hook 'c++-mode-hook 'setup-flycheck-project-path)
#+END_SRC
**** Company
**** COMMENT Company
Add header completion as well as Irony, which uses clang for suggestions.
#+BEGIN_SRC emacs-lisp
  (use-package company-c-headers
@@ -951,38 +1011,43 @@
      (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
    :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
**** LSP
Allow completion with LSP.
**** Clang-format
Automatically format buffer on save.
#+BEGIN_SRC emacs-lisp
(add-hook 'c-mode-hook 'lsp)
(add-hook 'cpp-mode-hook 'lsp)
  (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))
#+END_SRC
*** emacs-lisp
**** COMMENT yasnippet
Enable yasnippet.
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
#+END_SRC
**** COMMENT company
**** COMMENT Company
Add slime backend.
#+BEGIN_SRC emacs-lisp
(add-hook 'emacs-lisp-mode-hook 'company-mode)
@@ -1018,9 +1083,9 @@
  (use-package tex
    :ensure auctex
    :config
    (setq TeX-auto-save t)
    (setq TeX-parse-self t)
    (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
    (setq TeX-auto-save t
          TeX-parse-self t
          TeX-view-program-selection '((output-pdf "PDF Tools"))
          TeX-source-correlate-start-server t)
    (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))
#+END_SRC
@@ -1061,7 +1126,7 @@
  (defun get-texcount-latest()
    (if (not(file-directory-p "~/.texcount"))
        (make-directory "~/.texcount"))
    (url-copy-file "https://app.uio.no/ifi/texcount/download.php?file=texcount_3_1_1.zip" "~/.texcount/texcount.zip" 1)
    (url-copy-file "https://app.uio.no/ifi/texcount/download.php?file=texcount_3_2_0_41.zip" "~/.texcount/texcount.zip" 1)
    (shell-command "unzip -o ~/.texcount/texcount.zip -d ~/.texcount")
    (add-to-list 'exec-path "~/.texcount/texcount.pl"))
@@ -1090,14 +1155,6 @@
  (add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map (kbd "C-c c") 'texcount)))
#+END_SRC
**** LSP
Allow LSP completion
#+BEGIN_SRC emacs-lisp
  (add-hook 'tex-mode-hook 'lsp)
  (add-hook 'latex-mode-hook 'lsp)
  (add-hook 'TeX-mode-hook 'lsp)
  (add-hook 'LaTeX-mode-hook 'lsp)
#+END_SRC
*** PlantUML
Sets the PlantUML path for the mode to generate models.
#+BEGIN_SRC emacs-lisp
@@ -1105,10 +1162,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
@@ -1125,74 +1185,19 @@
      (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
    :hook (verilog-mode . lsp)
    :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)))
#+END_SRC
*** COMMENT MATLAB
@@ -1231,7 +1236,6 @@
#+BEGIN_SRC emacs-lisp
  (use-package rust-mode
    :ensure t
    :hook (rust-mode . lsp)
    :config
    ;; style guide suggests spaces not tabs
    (add-hook 'rust-mode-hook (lambda () (setq indent-tabs-mode nil)))
@@ -1254,32 +1258,38 @@
  (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
#+BEGIN_SRC emacs-lisp
  (use-package go-mode
    :ensure t
    :config
    (add-hook 'before-save-hook #'gofmt-before-save))
#+END_SRC
**** COMMENT Completion
Code completion with racer.
#+RESULTS:
: t
**** Flycheck
#+BEGIN_SRC emacs-lisp
  (use-package racer
  (use-package flycheck-golangci-lint
    :ensure t
    :hook ((rust-mode . racer-mode)
           (racer-mode . (eldoc-mode company-mode)))
    :init
    (setq racer-command "~/.cargo/bin/racer"))
    :config
    (add-hook 'flycheck-mode-hook #'flycheck-golangci-lint-setup))
#+END_SRC
*** Bash
**** LSP
Completion with LSP
**** Company
#+BEGIN_SRC emacs-lisp
(add-hook 'sh-mode-hook 'lsp)
  (use-package company-go
    :ensure t)
#+END_SRC
* Org mode
** 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
@@ -1309,13 +1319,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
@@ -1331,7 +1341,6 @@
                                                             (scheme . t)
                                                             (gnuplot . t)
                                                             (matlab . t)
                                                             (plantuml . t)
                                                             (fortran . t)
                                                             (java . t)
                                                             (plantuml . t)))
@@ -1363,6 +1372,7 @@
** Org export additions
*** Pandoc
Call pandoc on org buffer from org export.
Need to add ~#+OPTIONS: H:99~ to enable large level header exports.
#+BEGIN_SRC emacs-lisp
  (use-package ox-pandoc
    :ensure t)
@@ -1487,7 +1497,8 @@
Allow org features to be exported to HTML for site.
#+BEGIN_SRC emacs-lisp
  (use-package htmlize
    :ensure t)
    :ensure t
    :defer t)
#+END_SRC
* Journaling