* interface tweaks This section is configuring some global defaults i like. #+BEGIN_SRC emacs-lisp (setq inhibit-splash-screen t) ; Disable the splash screen ;; (when (version<= "26.0.50" emacs-version ) ;; (global-display-line-numbers-mode)); show line numbers; use this instead of linum if you can (global-visual-line-mode t) ; turn on word-wrap globally (menu-bar-mode -1) ; disable visual menu on emacs (tool-bar-mode -1) ; disable toolbar (setq case-fold-search t) ; ignore case when searching (fset 'yes-or-no-p 'y-or-n-p) ; make it easier to answer qs. (set-frame-font "Consolas 12") ; set default font (transient-mark-mode 1) ; Enable transient mark mode (highlights) (load-theme 'manoj-dark) ; loads my favorite default theme (global-hl-line-mode t) ; highlights the line you're on #+END_SRC #+RESULTS: : t * OS specific tweaks This helps with work-device configuration, as well as handling a specific windows edge-case. #+BEGIN_SRC emacs-lisp (when (eq system-type 'darwin) (setq mac-command-modifier 'meta) ;; Make emacs use a different default than the OS ;; only really useful on work computers, but there we go. (setq browse-url-browser-function #'browse-url-generic browse-url-generic-program "open" browse-url-generic-args '("-a" "Firefox"))) (if (eq system-type 'windows-nt) (message "i am windows and suck") ; deal with mac command key problems (exec-path-from-shell-copy-env "PATH")) ;; (if (string-equal "darwin" (symbol-name system-type)) ;; (setenv "PATH" (concat "/usr/local/bin:/usr/local/sbin:" (getenv "PATH")))) #+END_SRC #+RESULTS: : /opt/local/bin:/opt/local/sbin:/Users/jowj/Library/Python/3.6/bin:/usr/local/share/python:/usr/local/bin:/usr/local/lib/python3.7/site-packages:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin:/Users/jowj/Library/Python/3.6/bin:/usr/local/share/python:/Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_14:/Applications/Emacs.app/Contents/MacOS/libexec-x86_64-10_14 * custom functions, package independent hotkeys. #+BEGIN_SRC emacs-lisp ;; custom emacsland functions (defun find-user-init-file () "Edit the `user-init-file', in another window." (interactive) (find-file-other-window user-init-file)) (global-set-key (kbd "C-c J") 'find-user-init-file) ;; Custom frame management chords (global-set-key (kbd "C-x O") 'other-frame) (global-set-key (kbd "C-x T") 'make-frame-command) (global-set-key (kbd "C-x W") 'delete-frame) (global-set-key "\M-`" 'other-frame) ; mimic the way macosx switches #+END_SRC * smex #+BEGIN_SRC emacs-lisp (use-package smex :ensure t :config (progn (defadvice smex (around space-inserts-hyphen activate compile) (let ((ido-cannot-complete-command `(lambda () (interactive) (if (string= " " (this-command-keys)) (insert ?-) (funcall ,ido-cannot-complete-command))))) ad-do-it)) (global-set-key (kbd "M-x") 'smex) (global-set-key (kbd "M-X") 'smex-major-mode-commands) ;; This is your old M-x. (global-set-key (kbd "C-c C-c M-x") 'execute-extended-command))) #+END_SRC * org-mode #+BEGIN_SRC emacs-lisp (use-package org :ensure t :config (progn ;;Org mode configuration (require 'org) ; Enable Org mode (setq ispell-program-name "/usr/local/bin/ispell") ; set flyspell's spellchecker (add-hook 'org-mode-hook 'turn-on-flyspell) ; enable flyspell-mode in all org-mode enabled files (setq org-src-fontify-natively t org-src-window-setup 'current-window org-src-strip-leading-and-trailing-blank-lines t org-src-preserve-indentation t org-src-tab-acts-natively t x-selection-timeout 10 ;; this fixes a freeze when org-capture is called. lol. org-edit-src-content-indentation 0) (add-hook 'org-agenda-mode-hook (lambda () (visual-line-mode -1) (toggle-truncate-lines 1))) (org-babel-do-load-languages 'org-babel-load-languages '((python . t) (matlab . t))) (setq org-babel-python-command "/usr/local/bin/python3") ;; org-agenda configs (setq org-habit-show-habits-only-for-today nil) (setq org-agenda-repeating-timestamp-show-all nil) (setq org-deadline-warning-days 1) (setq org-global-properties '(("Effort_ALL". "0 0:10 0:30 1:00 2:00 3:00 4:00"))) (setq org-columns-default-format '(("%25ITEM %TODO %3PRIORITY %TAGS"))) ;;;; custom org mode hotkeys (global-set-key "\C-cl" 'org-store-link) (global-set-key "\C-ca" 'org-agenda) (global-set-key "\C-cc" 'org-capture) (global-set-key "\C-cb" 'org-iswitchb) ;;;; search across agenda files when refiling: (setq org-refile-targets '((nil :maxlevel . 9) (org-agenda-files :maxlevel . 9))) (setq org-outline-path-complete-in-steps nil) ; Refile in a single go (setq org-refile-use-outline-path t) ; Show full paths for refiling (setq org-agenda-files '("~/Nextcloud/Documents/org/")) ; add files to agenda: (setq org-directory "~/Nextcloud/Documents/org/") ; define generic org capture shit (setq org-default-notes-file (concat org-directory "/refile-beorg.org")))) ;; org-capture templates (setq org-capture-templates '(("c" "Context-include Todo" entry (file "~/Nextcloud/Documents/org/refile-beorg.org") "* TODO %?\n%U \n '%a'" :empty-lines 1 :prepend t) ("t" "Todo" entry (file "~/Nextcloud/Documents/org/refile-beorg.org") "* TODO %?\n%U" :empty-lines 1 :prepend t))) ;; Set up bullets (use-package org-bullets :ensure t :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) #+END_SRC #+RESULTS: : t * try #+BEGIN_SRC emacs-lisp (use-package try :ensure t) #+END_SRC * which-key #+BEGIN_SRC emacs-lisp (use-package which-key :ensure t :config (which-key-mode)) #+END_SRC * ace-window #+BEGIN_SRC emacs-lisp (use-package ace-window :ensure t :init (progn (global-set-key [remap other-window] 'ace-window))) #+END_SRC * outline-magic I don't remember what this does or why i have it. - an emacs story #+BEGIN_SRC emacs-lisp (use-package outline-magic :ensure t) #+END_SRC * multiple-cursors #+BEGIN_SRC emacs-lisp (use-package multiple-cursors :ensure t :config (progn (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines) (global-set-key (kbd "C->") 'mc/mark-next-like-this) (global-set-key (kbd "C-<") 'mc/mark-previous-like-this) (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this))) #+END_SRC * rust stuff I fucked around with rust like 4 times and that's it. - this configuration i stole from a website that I don't remember (sorry guy who wrote that) - it worked pretty well - Cargo was weird to get used to but eventually made sense. #+BEGIN_SRC emacs-lisp (use-package rust-mode :ensure t :config (progn (add-hook 'rust-mode-hook 'cargo-minor-mode) (add-hook 'flycheck-mode-hook #'flycheck-rust-setup) (add-hook 'rust-mode-hook (lambda () (local-set-key (kbd "C-c ") #'rust-format-buffer))) (setq racer-cmd "~/.cargo/bin/racer") ;; Rustup binaries PATH (setq racer-rust-src-path "~/gitshit/rust/src") ;; Rust source code PATH (add-hook 'rust-mode-hook #'racer-mode) (add-hook 'racer-mode-hook #'eldoc-mode) (add-hook 'racer-mode-hook #'company-mode))) (use-package flycheck-rust :ensure t) (use-package racer :ensure t) #+END_SRC * eyebrowse this is a mostly aspirational package; i don't do anything with it. - eventually i'd maybe like to - but running a ton of shit in emacs is almost counter productive #+BEGIN_SRC emacs-lisp (use-package eyebrowse :ensure t) #+END_SRC * helm I really use this for just the searching from emacs - this ties to the [[OS specific tweaks]] entry #+BEGIN_SRC emacs-lisp (use-package helm :ensure t :config (progn (defun helm-surfraw-duck (x) "Search duckduckgo in default browser" (interactive "sSEARCH:") (helm-surfraw x "duckduckgo" )) (global-set-key (kbd "C-c s") 'helm-surfraw-duck))) #+END_SRC * python stuff - pylint is required (pip install pylint, yada yada) - pep8 (pip install pep8) - don't use python-mode because JESUS CHRIST. - it throws everything off! - Jedi requires virtualenv to be installed virtualenvs in emacs fucking suck and i can't believe how bad these are. - pipenv seems pretty good, but has a depency on pyvenv which i cannot get to /work/. #+BEGIN_SRC elisp (use-package pylint :ensure t) (setq python-shell-interpreter "/usr/local/bin/python3" python-shell-interpreter-args "-i") (use-package py-autopep8 :ensure t :config (progn (add-hook 'python-mode-hook 'py-autopep8-enable-on-save))) (use-package jedi :ensure t :init (add-hook 'python-mode-hook 'jedi:setup) (add-hook 'python-mode-hook 'jedi:ac-setup)) (use-package pipenv :ensure t) (use-package pyvenv :ensure t) #+END_SRC #+RESULTS: * markdown-mode #+BEGIN_SRC emacs-lisp (use-package markdown-mode :ensure t) #+END_SRC * powershell #+BEGIN_SRC emacs-lisp (use-package powershell :ensure t) #+END_SRC * ein lets you run jupyter notebooks within emacs. - i've never used this feature once, but it seems cool. #+BEGIN_SRC emacs-lisp (use-package ein :ensure t) #+END_SRC * flycheck #+BEGIN_SRC emacs-lisp (use-package flycheck :ensure t :init (global-flycheck-mode t)) #+END_SRC #+RESULTS: * znc / erc config This is such a pain in the dick. Its really nice to be able to chat within emacs - but i think i regret not using weechat The bit about ~;(setf epa-pinentry-mode 'loopback)~ is important: - uncomment if you want to only use emacs to input/manage the gpg key - comment out if you want gpg to be handled through seahorse/gnome keyring. #+BEGIN_SRC emacs-lisp (when (eq system-type 'darwin) (setf epa-pinentry-mode 'loopback)) (use-package znc :ensure t :config (progn (custom-set-variables '(epg-gpg-program "/usr/local/bin/gpg")) (setq auth-sources `("~/Documents/projects/agares/applicationConfiguration/.emacs/jlj-secrets.gpg")) (require 'epa) ;; handle annoying gpg shit. (defun lookup-password (host user port) "Lookup encrypted password given HOST, USER and PORT for service." (require 'auth-source) (funcall (plist-get (car (auth-source-search :host host :user user :type 'netrc :port port)) :secret))) (setq znc-password(lookup-password "bouncer.awful.club" "blindidiotgod/OFTC" 5000)) ;; by default, erc alerts you on any activity. I only want to hear ;; about mentions of nick or keyword (custom-set-variables '(znc-servers `(("bouncer.awful.club" 5000 t ((freenode "blindidiotgod/freenode" ,znc-password) (OFTC "blindidiotgod/OFTC" ,znc-password)))))) (setq erc-current-nick-highlight-type 'all) (setq erc-keywords '("security")) (setq erc-track-exclude-types '("JOIN" "PART" "NICK" "MODE" "QUIT")) (setq erc-track-use-faces t) (setq erc-track-faces-priority-list '(erc-current-nick-face erc-keyword-face)) (setq erc-track-priority-faces-only 'all) (setq erc-hide-list '("PART" "QUIT" "JOIN")) (setq erc-join-buffer 'bury))) #+END_SRC #+RESULTS: : t * twittering-mode the only thing that isn't pretty much stock is - i rebound C-c C-o to open links, so it would mimic org-mode's layout. #+BEGIN_SRC emacs-lisp (use-package twittering-mode :ensure t :config (progn (setq twittering-icon-mode t) (setq twittering-reverse-mode t) (setq twittering-enable-unread-status-notifier t) (with-eval-after-load "twittering-mode" (define-key twittering-mode-map (kbd "C-c C-o") `twittering-view-user-page)))) #+END_SRC #+RESULTS: : t * pdf-tools #+BEGIN_SRC emacs-lisp (use-package pdf-tools :ensure t :config (pdf-tools-install)) (use-package org-pdfview :ensure t) #+END_SRC #+RESULTS: * magit #+BEGIN_SRC emacs-lisp (use-package magit :ensure t) #+END_SRC #+RESULTS: * desktop configuration #+BEGIN_SRC emacs-lisp (require 'desktop) (desktop-save-mode 1) (defun jlj-desktop-save () (interactive) ;; Don't call desktop-save-in-desktop-dir, as it prints a message. (if (eq (desktop-owner) (emacs-pid)) (desktop-save desktop-dirname))) (add-hook 'auto-save-hook 'jlj-desktop-save) #+END_SRC #+RESULTS: | jlj-desktop-save | * presentations The idea here is to use reveal.js and org-mode to present stuff - reveal.js is required - htmlize.el (for syntax highlighting) - obvs, ox-reveal.el package. You can either use a CDN to deliver the reveal.js, or you can download source. Both examples are given here: ~(setq org-reveal-root "file:///~/Documents/projects/agares/applicationConfiguration/.emacs/src/reveal.js-3.8.0"))~ ~(setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/"))~ #+BEGIN_SRC emacs-lisp (setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/") (setq org-reveal-mathjax t) (use-package ox-reveal :ensure t) #+END_SRC #+RESULTS: * web-mode This is for basic web development usage; - html - css I probably don't need it for much, but it should help when editing any of my own pages. #+BEGIN_SRC emacs-lisp (use-package web-mode :ensure t :config (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode)) (setq web-mode-engines-alist '(("django" . "\\.html\\'"))) (setq web-mode-ac-sources-alist '(("css" . (ac-source-css-property)) ("html" . (ac-source-words-in-buffer ac-source-abbrev)))) (setq web-mode-enable-auto-closing t) (setq web-mode-enable-auto-quoting t)) ; this fixes the quote problem I mentioned #+END_SRC #+RESULTS: : t * misc #+BEGIN_SRC elisp (setq indent-tabs-mode nil) ; always use spaces when indenting (setq require-final-newline t) (setq backup-directory-alist `(("." . "~/Nextcloud/Documents/org/.saves"))) (find-file "~/Nextcloud/Documents/org/personal.org") ;open primary org file on launch (electric-pair-mode 1) ; create paired brackets. #+END_SRC #+RESULTS: : t Iedit lets you "find all instances of this string" with C-; - its /great/ - same sorta niche as ~multiple-cursors~ #+BEGIN_SRC emacs-lisp (use-package iedit :ensure t) #+END_SRC #+RESULTS: why isn't this handled for me :( #+BEGIN_SRC emacs-lisp (server-start) #+END_SRC