about summary refs log blame commit diff
path: root/emacs/.emacs.d/wpc/wpc-misc.el
blob: fd65dc21485c635e3cf86a5eac843b69fa7fbcb8 (plain) (tree)
1
2
3
4
5
6
7
8







                                                                              











                                                                                










                                                                               
                           

                     


                                                 
                                                                           
                                         

                           
                                     

                                
                    

                           
 


                                      
                                     
                                                
 
                            


                                        
 












                                                    


                                                                













                                  



                                                       


                                                 


                               


                                                                   





                                                                           


                                                                

                   
                    




                                                  



                                                    
 

                         







                                      
 




                                




                                                                           





























                                                
                                                





                                                         





                                                                          






                                   
                                     
 

                      
                                                   

                      



                       




























                                                                       
                     
         



                                            












                                                                     










                                           
 









                                                         









                                           
                                             


                                          
 



                                       















                                                                               



                                         


                         
                   
                         
;;; misc.el --- Hosting miscellaneous configuration -*- lexical-binding: t -*-
;; Author: William Carroll <wpcarro@gmail.com>

;;; Commentary:
;; This is the home of any configuration that couldn't find a better home.

;;; Code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dependencies
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'project)
(require 'f)
(require 'dash)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Configuration
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; I'm borrowing from the dot-time format (i.e. https://dotti.me) to encode the
;; timestamp. This displays the UTC time and an offset to show the number of
;; hours East or West of UTC my current timezone is using `current-time-zone'.
;;
;; Reminder to me:
;; LON: +00 (UTC) or +01 (BST)
;; NYC: -05
;; SF:  -07
(setq display-time-format
      (concat "%H·%M"
              (format "%0+3d" (/ (car (current-time-zone)) 3600))
              " %a %d %b"))
(display-time-mode 1)

;; Remove the boilerplate in the *scratch* buffer
(setq initial-scratch-message "")

;; disable custom variable entries from being written to ~/.emacs.d/init.el
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file 'noerror)

;; integrate Emacs with X11 clipboard
(setq select-enable-primary t)
(setq select-enable-clipboard t)
(general-def 'insert
  "s-v" #'clipboard-yank
  "C-S-v" #'clipboard-yank)

;; transparently edit compressed files
(auto-compression-mode t)

;; autowrap when over the fill-column
(setq-default auto-fill-function #'do-auto-fill)

;; link to Emacs source code
;; TODO: Update this link.
(setq find-function-C-source-directory
      "~/Dropbox/programming/emacs/src")

;; change emacs prompts from "yes or no" -> "y or n"
(fset 'yes-or-no-p 'y-or-n-p)

;; open photos in Emacs
(auto-image-file-mode 1)

;; disable line-wrapping
(setq-default truncate-lines 1)

;; shell file indentation
(setq sh-basic-offset 2)
(setq sh-indentation 2)

;; Emacs library that interfaces with my Linux password manager.
(use-package password-store)

(use-package vterm
  :config
  (general-define-key
   :keymaps '(vterm-mode-map)
   :states '(insert)
   "C-S-v" #'vterm-yank)
  (general-define-key
   :keymaps '(vterm-mode-map)
   :states '(normal)
   "K" #'evil-scroll-line-up
   "J" #'evil-scroll-line-down
   "C-b" #'evil-scroll-page-up
   "C-f" #'evil-scroll-page-down))

;; Use en Emacs buffer as a REST client.
;; For more information: http://emacsrocks.com/e15.html
(use-package restclient)

;; Run `package-lint' before publishing to MELPA.
(use-package package-lint)

;; Parser combinators in Elisp.
(use-package parsec)

;; disable company mode when editing markdown
;; TODO: move this out of wpc-misc.el and into a later file to call
;; `(disable company-mode)'
(use-package markdown-mode
  :config
  ;; TODO: Add assertion that pandoc is installed and it is accessible from
  ;; Emacs.
  (setq markdown-command "pandoc")
  (setq markdown-split-window-direction 'right)
  ;; (add-hook 'markdown-mode-hook #'markdown-live-preview-mode)
  )

(use-package alert)

(use-package refine)

;; Required by some google-emacs package commands.
(use-package deferred)

;; git integration
(use-package magit
  :config
  (setq magit-display-buffer-function
        #'magit-display-buffer-fullframe-status-v1))

(use-package magit-popup)

;; http
(use-package request)

;; perl-compatible regular expressions
(use-package pcre2el)

;; alternative to help
(use-package helpful)

;; Emacs integration with direnv
(use-package direnv
  :config
  (direnv-mode))

;; Superior Elisp library for working with dates and times.
;; TODO: Put this where my other installations for dash.el, s.el, a.el, and
;; other utility Elisp libraries are located.
(use-package ts)

;; persist history etc b/w Emacs sessions
(setq desktop-save 'if-exists)
(desktop-save-mode 1)
(setq desktop-globals-to-save
      (append '((extended-command-history . 30)
                (file-name-history        . 100)
                (grep-history             . 30)
                (compile-history          . 30)
                (minibuffer-history       . 50)
                (query-replace-history    . 60)
                (read-expression-history  . 60)
                (regexp-history           . 60)
                (regexp-search-ring       . 20)
                (search-ring              . 20)
                (shell-command-history    . 50)
                tags-file-name
                register-alist)))

;; config Emacs to use $PATH values
(use-package exec-path-from-shell
  :if (memq window-system '(mac ns))
  :config
  (exec-path-from-shell-initialize))

;; Emacs autosave, backup, interlocking files
(setq auto-save-default nil
      make-backup-files nil
      create-lockfiles nil)

;; ensure code wraps at 80 characters by default
(setq-default fill-column constants/fill-column)

(put 'narrow-to-region 'disabled nil)

;; trim whitespace on save
(add-hook 'before-save-hook #'delete-trailing-whitespace)

;; call `git secret hide` after saving ~/briefcase/secrets.json
(add-hook 'after-save-hook
          (lambda ()
            (when (f-equal? (buffer-file-name) "~/briefcase/secrets.json")
              (shell-command "git secret hide"))))

;; use tabs instead of spaces
(setq-default indent-tabs-mode nil)

;; automatically follow symlinks
(setq vc-follow-symlinks t)

;; fullscreen settings
(defvar ns-use-native-fullscreen nil)

(use-package yasnippet
  :config
  (setq yas-snippet-dirs '("~/.emacs.d/snippets/"))
  (yas-global-mode 1))

(use-package projectile
  :config
  (projectile-mode t))

(defun project-find-function--briefcase (dir)
  "Find the nearest default.nix file; otherwise, terminate at the .git
  directory."
  (let ((filenames (->> dir f-files (-map #'f-filename)))
        (dirnames (->> dir f-directories (-map #'f-dirname))))
    (if (or (-contains? filenames "default.nix")
            (-contains? dirnames ".git"))
        (cons 'monorepo dir)
      (if (f-parent dir)
          (project-find-function--briefcase (f-parent dir))
        nil))))

(cl-defmethod project-root ((project (head monorepo)))
  (cdr project))

(cl-defmethod project-roots ((project (head monorepo)))
  (list (cdr project)))

(cl-defmethod project-external-roots ((project (head monorepo)))
  (project-external-roots (cons 'vc (cdr project))))

(cl-defmethod project-ignores ((project (head monorepo)) dir)
  (project-ignores (cons 'vc (cdr project)) dir))

(cl-defmethod project-files ((project (head monorepo)) &optional dirs)
  (project-files (cons 'vc (cdr project)) dirs))

(setq project-find-functions (list #'project-find-function--briefcase))

(use-package deadgrep
  :config
  (general-define-key
   :keymaps 'deadgrep-mode-map
   :states 'normal
   "o" #'deadgrep-visit-result-other-window)
  (setq-default deadgrep--context '(0 . 3))
  (defun deadgrep/region ()
    "Run a ripgrep search on the active region."
    (interactive)
    (deadgrep (region/to-string)))
  (defun deadgrep/dwim ()
    "If a region is active, use that as the search, otherwise don't."
    (interactive)
    (with-current-buffer (current-buffer)
      (if (region-active-p)
          (setq deadgrep--additional-flags '("--multiline"))
          (deadgrep/region)
        (call-interactively #'deadgrep))))
  (advice-add
   'deadgrep--format-command
   :filter-return
   (lambda (cmd)
     (replace-regexp-in-string
      "^rg " "rg --hidden " cmd))))

;; TODO: Do I need this when I have swiper?
(use-package counsel)

(use-package counsel-projectile)

;; search Google, Stackoverflow from within Emacs
(use-package engine-mode
  :config
  (defengine google
    "http://www.google.com/search?ie=utf-8&oe=utf-8&q=%s"
    :keybinding "g")
  (defengine stack-overflow
    "https://stackoverflow.com/search?q=%s"
    :keybinding "s"))

;; EGlot (another LSP client)
(use-package eglot)

;; Microsoft's Debug Adapter Protocol (DAP)
(use-package dap-mode
  :after lsp-mode
  :config
  (dap-mode 1)
  (dap-ui-mode 1))

;; Microsoft's Language Server Protocol (LSP)
(use-package lsp-ui
  :config
  (add-hook 'lsp-mode-hook #'lsp-ui-mode))

(use-package company-lsp
  :config
  (push 'company-lsp company-backends))

;; Wilfred/suggest.el - Tool for discovering functions basesd on declaring your
;; desired inputs and outputs.
(use-package suggest)

;; Malabarba/paradox - Enhances the `list-packages' view.
(use-package paradox
  :config
  (paradox-enable))

;; TODO: Consider supporting a wpc-elisp.el package for Elisp tooling.
;; The following functions are quite useful for Elisp development:
;; - `emr-el-find-unused-definitions'
(use-package emr
  :config
  (define-key prog-mode-map (kbd "M-RET") #'emr-show-refactor-menu))

(defun wpc/frame-name ()
  "Return the name of the current frame."
  (frame-parameter nil 'name))

;; Start the Emacs server
(server-start)

(provide 'wpc-misc)
;;; wpc-misc.el ends here