From 5324d5fcbf8e365dc774795ceeedf1cac9d0b4bb Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Wed, 22 Dec 2021 07:39:02 +0000
Subject: [PATCH] Added a more general git hook prompt and gerrit compatibality

---
 config.org |  415 ++++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 240 insertions(+), 175 deletions(-)

diff --git a/config.org b/config.org
index 222d992..faced63 100644
--- a/config.org
+++ b/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,31 +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.
 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) . lsp))
+             ;; 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)
+    (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
@@ -842,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
@@ -946,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
@@ -957,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
@@ -968,43 +1043,53 @@
       (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
-**** COMMENT Clang-format
+**** 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))
-    (add-hook 'c-mode-hook 'clang-format-on-save)
-    (add-hook 'c++-mode-hook 'clang-format-on-save))
+      (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
+**** COMMENT Company
 Add slime backend.
 #+BEGIN_SRC emacs-lisp
 (add-hook 'emacs-lisp-mode-hook 'company-mode)
@@ -1119,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
@@ -1139,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
@@ -1266,26 +1320,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
+**** Company
+#+BEGIN_SRC emacs-lisp
+  (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
@@ -1315,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
@@ -1337,7 +1403,6 @@
                                                              (scheme . t)
                                                              (gnuplot . t)
                                                              (matlab . t)
-                                                             (plantuml . t)
                                                              (fortran . t)
                                                              (java . t)
                                                              (plantuml . t)))

--
Gitblit v1.9.3