Files
emacs/settings/general-settings.el

679 lines
30 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;; general-settings.el --- General settings -*- lexical-binding: t -*-
;;; Commentary:
;; Requirements:
;;; Code:
;; Change "yes or no" to "y or n"
(fset 'yes-or-no-p 'y-or-n-p)
;; default-frame-alist not empty
(mapc (lambda (item)
(add-to-list 'default-frame-alist item)
)
'(
;;(fullscreen . maximized) ;; restore saved geometry, see gui-settings.el my-frame-geometry-
(tool-bar-position . left)
;;(horizontal-scroll-bars . t) ;; see gui-settings
)
)
;; transparency
;;(set-frame-parameter (selected-frame) 'alpha '(<active> . <inactive>))
;;(set-frame-parameter (selected-frame) 'alpha <both>)
(set-frame-parameter (selected-frame) 'alpha '(90 . 90))
(add-to-list 'default-frame-alist '(alpha . (90 . 90)))
;; recentf stuff
(use-package recentf
:config
(setq
recentf-save-file (locate-user-emacs-file ".cache/recentf" "recentf")
recentf-max-saved-items 1000
recentf-max-menu-items 30
recentf-auto-cleanup 'never ;; disable before we start recentf! Set to never bc otherwise it tries to read also tramp (remote) files
)
(add-to-list 'recentf-exclude
(recentf-expand-file-name user-cache-directory))
;;(global-set-key "\C-x\ \C-r" 'recentf-open-files) ;; see completion-settings ivy counsel
;;(run-at-time nil (* 10 60) 'recentf-save-list)
(run-with-idle-timer (* 10 60) t 'recentf-save-list)
(recentf-mode)
)
;; by default backup files are saved in the current directory, ending with ~
;; instead stashes them all in
(let ((backup-dir (concat user-cache-directory "backups"))
(auto-saves-dir (concat user-cache-directory "auto-saves/")))
(dolist (dir (list backup-dir auto-saves-dir))
(when (not (file-directory-p dir))
(make-directory dir t)))
(setq backup-directory-alist `(("." . ,backup-dir)))
(setq backup-by-copying t)
(setq auto-save-file-name-transforms `((".*" ,auto-saves-dir t)))
(setq auto-save-list-file-prefix (concat auto-saves-dir ".saves-"))
(setq tramp-backup-directory-alist `((".*" . ,backup-dir)))
(setq tramp-auto-save-directory auto-saves-dir)
)
(setq-default delete-by-moving-to-trash t) ;; Delete files to trash
(if (fboundp 'save-place-mode)
(save-place-mode)
(setq save-place t)
)
;; Save point position between sessions
(setq save-place-file (concat user-cache-directory "places"))
;; minibuffer history, e.g. M-x with amex
(setq savehist-file (concat user-cache-directory "history"))
(savehist-mode)
;;; desktop
(require 'desktop)
;; save session
;;(desktop-save-mode 1)
(setq desktop-dirname user-cache-directory)
(setq history-length 500) ;; Since all lists will be truncated when saved, it is important to have a high default history length
(add-to-list 'desktop-path user-cache-directory)
(defun desktop-settings-setup ()
"Some settings setup for 'desktop-save-mode'."
(interactive)
;; At this point the desktop.el hook in after-init-hook was
;; executed, so (desktop-read) is avoided.
(when (not (eq (emacs-pid) (desktop-owner))) ; Check that emacs did not load a desktop yet
;; Here we activate the desktop mode
(desktop-save-mode 1)
;; Since all lists will be truncated when saved, it is important to have a high default history length
(setq history-length 250)
;; Set the location to save/load default desktop
(setq desktop-dirname user-cache-directory)
(add-to-list 'desktop-path user-cache-directory)
;; The default desktop is saved always
(setq desktop-save t)
;; The default desktop is loaded anyway if it is locked
(setq desktop-load-locked-desktop t)
;; Make sure that even if emacs or OS crashed, emacs
;; still have last opened files.
(add-hook 'find-file-hook
(lambda ()
(run-with-timer 5 nil
(lambda ()
;; Reset desktop modification time so the user is not bothered
(setq desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name))))
(desktop-save user-emacs-directory)))))
;; Read default desktop
(if (file-exists-p (concat desktop-dirname desktop-base-file-name))
(desktop-read desktop-dirname))
;; Add a hook when emacs is closed to we reset the desktop
;; modification time (in this way the user does not get a warning
;; message about desktop modifications)
(add-hook 'kill-emacs-hook
(lambda ()
;; Reset desktop modification time so the user is not bothered
(setq desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name))))))
)
)
;; (add-hook 'after-init-hook
;; 'desktop-settings-setup
;; (lambda ()
;; ;; No splash screen
;; (setq inhibit-startup-screen t)
;; ;; If the *scratch* buffer is the current one, then create a new
;; ;; empty untitled buffer to hide *scratch*
;; (if (string= (buffer-name) "*scratch*")
;; (new-empty-buffer))
;; )
;; t) ;; append this hook to the tail
;; auto revert buffer
(when (fboundp 'global-auto-revert-mode)
;; All the "reverting buffer foo" messages are _really_ distracting.
(setq auto-revert-verbose nil)
(global-auto-revert-mode 1)
;; just as the docs warn, this can really make Emacs sluggish.
(if running-on-windows
(if (fboundp 'lwarn)
(lwarn
'global-auto-revert-mode
:warning
"`global-auto-revert-mode' is turned on. It's nifty,
but it's REALLY SLOW when you have buffers that are visiting
remote files. And despite its documentation, it does NOT ignore
those files, if you're using windows, and the file name begins
with a drive letter and a colon.")
)
(setq global-auto-revert-non-file-buffers t)
)
)
(setq revert-without-query '(".*"))
(use-package uniquify
:defer t
:config
(setq uniquify-buffer-name-style 'forward) ;; forward: bar/mumble/name insead of post-forward-angle-brackets: name<bar/mumble>
)
;; overwrite selected text
(delete-selection-mode t)
;; always use spaces, not tabs, when indenting
(setq-default indent-tabs-mode nil)
;; width for tabs
(setq-default tab-width 2)
;; ignore case when searching
(setq case-fold-search t)
;; require final newlines in files when they are saved
(setq require-final-newline t)
;; don't show the startup screen
(setq inhibit-startup-screen t)
;; each line of text gets one line on the screen (i.e., text will run
;; off the right instead of wrapping around onto a new line)
(setq-default truncate-lines t)
;; truncate lines even in partial-width windows
;;(setq truncate-partial-width-windows t)
(use-package so-long
:config
;;(add-to-list 'so-long-target-modes 'mhtml-mode t)
(setq so-long-max-lines nil) ;; by default only 5 non-blank lines are tested
(setq so-long-threshold 500)
(setq so-long-action 'so-long-minor-mode) ;; so-long-mode
(global-so-long-mode 1))
;; display line numbers to the right of the window
;; (global-linum-mode t) ;; deactivated because the DocView showing pdf files becomes extremly slow when global-linum-mode is on.
;; show the current line and column numbers in the stats bar as well
(line-number-mode t)
(column-number-mode t)
;; highlight parentheses when the cursor is next to them
(use-package paren
:defer 0.1
:config
(show-paren-mode t))
;; emacs warning:
;; ad-handle-definition: `text-scale-increase' got redefined
;; these warnings are generated when functions are redefined with defadvice.
(setq ad-redefinition-action 'accept)
;; gravatars from magit use this to store their cache
(setq url-configuration-directory (concat user-cache-directory "url/"))
(setq bookmark-default-file (concat user-cache-directory "bookmarks"))
(use-package transient
:load-path (lambda() (concat user-emacs-directory "lisp/transient"))
:defer t
:config
(setq transient-levels-file (concat user-cache-directory "transient/levels.el"))
(setq transient-values-file (concat user-cache-directory "transient/values.el"))
(setq transient-history-file (concat user-cache-directory "transient/history.el")))
;;
;; keyboard
;;
;; https://github.com/syl20bnr/spacemacs/blob/c7a103a772d808101d7635ec10f292ab9202d9ee/layers/%2Bdistributions/spacemacs-base/keybindings.el
;; Make <escape> quit as much as possible
(define-key minibuffer-local-map (kbd "<escape>") 'keyboard-escape-quit)
(define-key minibuffer-local-ns-map (kbd "<escape>") 'keyboard-escape-quit)
(define-key minibuffer-local-completion-map (kbd "<escape>") 'keyboard-escape-quit)
(define-key minibuffer-local-must-match-map (kbd "<escape>") 'keyboard-escape-quit)
(define-key minibuffer-local-isearch-map (kbd "<escape>") 'keyboard-escape-quit)
;;
(global-set-key (kbd "C-r") 'query-replace-regexp) ;; isearch-backward
(global-set-key (kbd "C-x C-b") 'ibuffer) ;; list-buffers
;; applications
(global-set-key (kbd "M-m !") 'shell-command)
(global-set-key (kbd "M-m a c") 'calc-dispatch)
(global-set-key (kbd "M-m a P") 'proced)
;; buffers
(global-set-key (kbd "M-m b d") 'kill-this-buffer)
(global-set-key (kbd "M-m b e") 'erase-buffer)
(global-set-key (kbd "M-m b C-d") 'kill-matching-buffers)
(global-set-key (kbd "M-m b n") 'next-buffer)
(global-set-key (kbd "M-m b p") 'previous-buffer)
(global-set-key (kbd "M-m b R") 'revert-buffer)
(global-set-key (kbd "M-m b w") 'read-only-mode)
;; compile/comments
(global-set-key (kbd "M-m c C") 'compile)
(global-set-key (kbd "M-m c k") 'kill-compilation)
(global-set-key (kbd "M-m c r") 'recompile)
;; (with-eval-after-load 'compile
;; (define-key compilation-mode-map "r" 'recompile)
;; (define-key compilation-mode-map "g" nil)
;; )
;; errors
(global-set-key (kbd "M-m e n") 'next-error)
(global-set-key (kbd "M-m e p") 'previous-error)
;; files
(global-set-key (kbd "M-m f c") 'copy-file)
(global-set-key (kbd "M-m f D") 'delete-file)
(global-set-key (kbd "M-m f g") 'rgrep)
(global-set-key (kbd "M-m f l") 'find-file-literally)
(global-set-key (kbd "M-m f R") 'rename-file)
(global-set-key (kbd "M-m f s") 'save-buffer)
(global-set-key (kbd "M-m f v d") 'add-dir-local-variable)
(global-set-key (kbd "M-m f v f") 'add-file-local-variable)
(global-set-key (kbd "M-m f v p") 'add-file-local-variable-prop-line)
;; help
(global-set-key (kbd "M-m h d b") 'describe-bindings)
(global-set-key (kbd "M-m h d c") 'describe-char)
(global-set-key (kbd "M-m h d C") 'describe-coding-system)
(global-set-key (kbd "M-m h d C-c") 'describe-copying)
(global-set-key (kbd "M-m h d M-c") 'describe-categories)
(global-set-key (kbd "M-m h d f") 'describe-function)
(global-set-key (kbd "M-m h d F") 'describe-face)
(global-set-key (kbd "M-m h d C-f") 'describe-font)
(global-set-key (kbd "M-m h d M-f") 'describe-fontset)
(global-set-key (kbd "M-m h d k") 'describe-key)
(global-set-key (kbd "M-m h d K") 'describe-keymap)
(global-set-key (kbd "M-m h d m") 'describe-mode)
(global-set-key (kbd "M-m h d M") 'describe-minor-mode)
(global-set-key (kbd "M-m h d o") 'describe-symbol)
(global-set-key (kbd "M-m h d p") 'describe-package)
(global-set-key (kbd "M-m h d s") 'describe-syntax)
(global-set-key (kbd "M-m h d t") 'describe-theme)
(global-set-key (kbd "M-m h d v") 'describe-variable)
(global-set-key (kbd "M-m h n") 'view-emacs-news)
;; format
(global-set-key (kbd "M-m j o") 'open-line)
(global-set-key (kbd "M-m j =") 'indent-region)
(global-set-key (kbd "M-m j S") 'split-line)
;; navigation/jumping
(global-set-key (kbd "M-m j f") 'find-function)
(global-set-key (kbd "M-m j l") 'find-library)
(global-set-key (kbd "M-m j v") 'find-variable)
;; narrow & widen
(global-set-key (kbd "M-m n r") 'narrow-to-region)
(global-set-key (kbd "M-m n p") 'narrow-to-page)
(global-set-key (kbd "M-m n f") 'narrow-to-defun)
(global-set-key (kbd "M-m n w") 'widen)
;; quit
(global-set-key (kbd "M-m q s") 'save-buffers-kill-emacs)
(global-set-key (kbd "M-m q Q") 'kill-emacs)
;; toggles
(global-set-key (kbd "M-m t F") 'auto-fill-mode)
(global-set-key (kbd "M-m t h h") 'global-hl-line-mode)
(global-set-key (kbd "M-m t h s") 'font-lock-mode)
(global-set-key (kbd "M-m t l") 'toggle-truncate-lines)
(global-set-key (kbd "M-m t L") 'visual-line-mode)
(global-set-key (kbd "M-m t m t") 'display-time-mode)
(global-set-key (kbd "M-m t W") 'ace-window-display-mode)
(global-set-key (kbd "M-m T f") 'fringe-mode)
(global-set-key (kbd "M-m T F") 'toggle-frame-fullscreen)
(global-set-key (kbd "M-m T m") 'menu-bar-mode)
(global-set-key (kbd "M-m T M") 'toggle-frame-maximized)
(global-set-key (kbd "M-m T S") 'semantic-stickyfunc-mode)
(global-set-key (kbd "M-m T C-S") 'global-semantic-stickyfunc-mode)
(global-set-key (kbd "M-m T t") 'tool-bar-mode)
;; window
(global-set-key (kbd "M-m w d") 'delete-window)
(global-set-key (kbd "M-m w D") 'ace-delete-window)
(global-set-key (kbd "M-m w f") 'follow-mode)
(global-set-key (kbd "M-m w F") 'make-frame)
(global-set-key (kbd "M-m w h") 'windmove-left)
(global-set-key (kbd "M-m w j") 'windmove-down)
(global-set-key (kbd "M-m w k") 'windmove-up)
(global-set-key (kbd "M-m w l") 'windmove-right)
(global-set-key (kbd "M-m w m") 'maximize-window)
(global-set-key (kbd "M-m w M") 'ace-swap-window)
(global-set-key (kbd "M-m w n") 'next-window)
(global-set-key (kbd "M-m w o") 'other-frame)
(global-set-key (kbd "M-m w p") 'previous-window)
(global-set-key (kbd "M-m w s") 'split-window-below)
(with-eval-after-load 'winner-mode
(global-set-key (kbd "M-m w u") 'winner-undo)
(global-set-key (kbd "M-m w U") 'winner-redo))
(global-set-key (kbd "M-m w v") 'split-window-right)
(global-set-key (kbd "M-m w w") 'other-window)
(global-set-key (kbd "M-m w W") 'ace-window) ;; same as ace-selct-window
(global-set-key (kbd "M-m w -") 'split-window-below)
(global-set-key (kbd "M-m w /") 'split-window-right)
(global-set-key (kbd "M-m w =") 'balance-windows)
(global-set-key (kbd "M-m w <left>") 'windmove-left)
(global-set-key (kbd "M-m w <down>") 'windmove-down)
(global-set-key (kbd "M-m w <up>") 'windmove-up)
(global-set-key (kbd "M-m w <right>") 'windmove-right)
(global-set-key (kbd "M-m w TAB") 'other-window)
;; text
(global-set-key (kbd "M-m x a a") 'align)
(global-set-key (kbd "M-m x a c") 'align-current)
(global-set-key (kbd "M-m x c") 'count-words-region)
(global-set-key (kbd "M-m x d w") 'delete-trailing-whitespace)
(global-set-key (kbd "M-m x j c") 'set-justification-center)
(global-set-key (kbd "M-m x j f") 'set-justification-full)
(global-set-key (kbd "M-m x j l") 'set-justification-left)
(global-set-key (kbd "M-m x j n") 'set-justification-none)
(global-set-key (kbd "M-m x j r") 'set-justification-right)
(global-set-key (kbd "M-m x l s") 'sort-lines)
(global-set-key (kbd "M-m x t c") 'transpose-chars)
(global-set-key (kbd "M-m x t l") 'transpose-lines)
(global-set-key (kbd "M-m x t w") 'transpose-words)
(global-set-key (kbd "M-m x u") 'downcase-region)
(global-set-key (kbd "M-m x U") 'upcase-region)
(global-set-key (kbd "M-m x TAB") 'indent-rigidly)
;; Bind commands to move around windows
(global-set-key [(C-M-left)] 'windmove-left)
(global-set-key [(C-M-right)] 'windmove-right)
(global-set-key [(C-M-up)] 'windmove-up)
(global-set-key [(C-M-down)] 'windmove-down)
(defun toggle-window-split ()
"Toggle between horizontal and vertical split with two windows."
(interactive)
(if (> (length (window-list)) 2)
(error "Can't toggle with more than 2 windows!")
(let ((func (if (window-full-height-p)
#'split-window-vertically
#'split-window-horizontally)))
(delete-other-windows)
(funcall func)
(save-selected-window
(other-window 1)
(switch-to-buffer (other-buffer))))))
(global-set-key (kbd "C-x |") 'toggle-window-split)
;; move current line up and down
(defun move-line-up()
"Move up the current line."
(interactive)
(transpose-lines 1)
(forward-line -2)
(indent-according-to-mode))
(defun move-line-down()
"Move down the current line."
(interactive)
(forward-line 1)
(transpose-lines 1)
(forward-line -1)
(indent-according-to-mode))
(global-set-key [(M-up)] 'move-line-up)
(global-set-key [(M-down)] 'move-line-down)
;;
;; mouse
;;
;; Enable mouse support, https://stackoverflow.com/questions/5710334/how-can-i-get-mouse-selection-to-work-in-emacs-and-iterm2-on-mac
(unless (display-graphic-p)
(require 'mouse)
(xterm-mouse-mode t)
(global-set-key [mouse-4] (lambda () (interactive) (scroll-down 1)))
(global-set-key [mouse-5] (lambda () (interactive) (scroll-up 1)))
(defun track-mouse (e))
(setq mouse-sel-mode t))
(global-set-key (kbd "<mouse-8>") (lambda () (interactive) (previous-buffer)))
(global-set-key (kbd "<mouse-9>") (lambda () (interactive) (next-buffer)))
;;; Scrolling
;;(setq mouse-wheel-scroll-amount '(1)) ; Distance in pixel-resolution to scroll each mouse wheel event.
(setq mouse-wheel-progressive-speed nil) ; Progressive speed is too fast for me.
(setq mouse-wheel-tilt-scroll t) ; Turn on horizontal scrolling with mouse wheel
(setq mouse-wheel-flip-direction t) ; Swap direction of `wheel-right' and `wheel-left'
;; for scroll-all-mode add mouse wheel support
;; https://www.emacswiki.org/emacs/ScrollAllMode
(defun my-mwheel-scroll-all-function (func &optional arg)
(if (and scroll-all-mode arg)
(save-selected-window
(walk-windows
(lambda (win)
(select-window win)
(condition-case nil
(funcall func arg)
(error nil)))))
(funcall func arg)))
(defun my-mwheel-scroll-all-scroll-up (&optional arg)
(my-mwheel-scroll-all-function 'scroll-up arg))
(defun my-mwheel-scroll-all-scroll-down (&optional arg)
(my-mwheel-scroll-all-function 'scroll-down arg))
(setq mwheel-scroll-up-function 'my-mwheel-scroll-all-scroll-up)
(setq mwheel-scroll-down-function 'my-mwheel-scroll-all-scroll-down)
;; https://www.reddit.com/r/emacs/comments/8sw3r0/finally_scrolling_over_large_images_with_pixel/
;; Good speed and allow scrolling through large images (pixel-scroll).
;; Note: Scroll lags when point must be moved but increasing the number
;; of lines that point moves in pixel-scroll.el ruins large image
;; scrolling. So unfortunately I think we'll just have to live with
;; this.
(use-package pixel-scroll
:defer t
:config
(setq pixel-dead-time 0) ; Never go back to the old scrolling behaviour.
(setq pixel-resolution-fine-flag t) ; Scroll by number of pixels instead of lines (t = frame-char-height pixels).
;;(pixel-scroll-mode) ;; default off
)
;;
;; Menu
;;
;; Creating a major menu pane in the menu bar in the “File” menu before the “Save” entry.
;; Easy-Menu
;; https://www.gnu.org/software/emacs/manual/html_node/elisp/Easy-Menu.html
;; https://stackoverflow.com/questions/26638015/elisp-easy-menu-positioning#29396939
;; add menus to the global menu bar: map nil
(use-package easymenu
:config
(easy-menu-add-item nil '("File") ["Kill Emacs" kill-emacs :help "Run function `kill-emacs'"] "Quit")
(easy-menu-define my-menu nil "My Menu"
'("My"))
(easy-menu-define my-major-menu nil "My Major Menu"
'("Major Modes"
["Unknown" (progn ()) :style radio :selected major-mode :active nil
:label (concat "Current: " (prin1-to-string major-mode))]
["Deft" (progn (deft)) :style radio :selected (eq major-mode 'deft-mode) :help "deft"]
["Eshell [🅢e]" (progn (eshell-mode)) :style radio :selected (eq major-mode 'eshell-mode) :help "eshell-mode"]
["Magit" (progn (magit)) :style radio :selected (eq major-mode 'magit-status-mode) :help "magit"]
["Notmuch [🅝]" (progn (notmuch)) :style radio :selected (eq major-mode 'notmuch-mode) :help "notmuch"]
["mu4e [Ⓜ]" (progn (mu4e)) :style radio :selected (eq major-mode 'mu4e-mode) :help "mu4e"]
["Org Brain" (progn (call-interactively 'org-brain-visualize)) :style radio :selected (eq major-mode 'org-brain-visualize-mode) :help "org-brain-visualize"]
["Org Drill" (progn (org-drill)) :style radio :selected (eq major-mode 'org-drill-mode) :help "org-drill"]
["Powershell" (progn (powershell)) :style radio :selected (eq major-mode 'powershell-mode) :help "powershell"]
["Shell" (progn (shell)) :style radio :selected (eq major-mode 'shell-mode) :help "shell"]
["Treemacs" (progn (treemacs)) :style radio :selected (eq major-mode 'treemacs-mode) :help "treemacs"]
))
(easy-menu-define my-lang-menu nil "My Lang Menu"
'("Language Modes"
["Unknown" (progn ())
:style radio :selected major-mode :active nil
:label (concat "Current: " (prin1-to-string major-mode))]
["Batch script" (progn (bat-mode))
:style radio :selected (eq major-mode 'bat-mode) :help "bat-mode"]
["C" (progn (c-mode))
:style radio :selected (eq major-mode 'c-mode) :help "c-mode"]
["C++" (progn (c++-mode))
:style radio :selected (eq major-mode 'c++-mode) :help "c++-mode"]
["CSS [🅒SS]" (progn (css-mode))
:style radio :selected (eq major-mode 'css-mode) :help "css-mode"]
["Emacs-Lisp [🅛e]" (progn (emacs-lisp-mode))
:style radio :selected (eq major-mode 'emacs-lisp-mode) :help "emacs-lisp-mode"]
["Gnuplot" (progn (gnuplot-mode))
:style radio :selected (eq major-mode 'gnuplot-mode) :help "gnuplot-mode"]
["HTML" (progn (html-mode))
:style radio :selected (eq major-mode 'html-mode) :help "html-mode"]
["Java" (progn (java-mode))
:style radio :selected (eq major-mode 'java-mode) :help "java-mode"]
;; js2-mode better than js-mode
["Javascript" (progn (js2-mode))
:style radio :selected (eq major-mode 'js2-mode) :help "js2-mode"]
["LaTeX [🅛a]" (progn (latex-mode))
:style radio :selected (eq major-mode 'latex-mode) :help "latex-mode"]
["Ledger [🅛d]" (progn (ledger-mode))
:style radio :selected (eq major-mode 'ledger-mode) :help "ledger-mode"]
["Lisp Interaction [🅛i]" (progn (lisp-interaction-mode))
:style radio :selected (eq major-mode 'lisp-interaction-mode) :help "lisp-interaction-mode"]
["Markdown" (progn (markdown-mode))
:style radio :selected (eq major-mode 'markdown-mode) :help "markdown-mode"]
["Octave" (progn (octave-mode))
:style radio :selected (eq major-mode 'octave-mode) :help "octave-mode"]
["Org [🅞]" (progn (org-mode))
:style radio :selected (eq major-mode 'org-mode) :help "org-mode"]
;; cperl-mode offers much more features than perl-mode.
["Perl" (progn (cperl-mode))
:style radio :selected (eq major-mode 'cperl-mode) :help "cperl-mode"]
["PHP" (progn (php-mode))
:style radio :selected (eq major-mode 'php-mode) :help "php-mode"]
["PlantUML" (progn (plantuml-mode))
:style radio :selected (eq major-mode 'plantuml-mode) :help "plantuml-mode"]
["Powershell script" (progn (powershell-mode))
:style radio :selected (eq major-mode 'powershell-mode) :help "powershell-mode"]
["Python [🅟]" (progn (python-mode))
:style radio :selected (eq major-mode 'python-mode) :help "python-mode"]
["Python-Web (Poly)" (progn (poly-python-web-mode-map))
:style radio :selected (eq major-mode 'poly-python-web-mode-map) :help "poly-python-web-mode-map"]
["R (ESS)" (progn (ess-r-mode))
:style radio :selected (eq major-mode 'ess-r-mode) :help "ess-r-mode"]
["reStructuredText (ReST)" (progn (rst-mode))
:style radio :selected (eq major-mode 'rst-mode) :help "rst-mode"]
["Ruby" (progn (ruby-mode))
:style radio :selected (eq major-mode 'ruby-mode) :help "ruby-mode"]
;; shell-mode is to run shell inside Emacs, sh-mode for shell script editing, shell-script-mode is an alias for sh-mode.
["Shell script" (progn (sh-mode))
:style radio :selected (eq major-mode 'sh-mode) :help "sh-mode"]
["SQL" (progn (sql-mode))
:style radio :selected (eq major-mode 'sql-mode) :help "sql-mode"]
["Tcl" (progn (tcl-mode))
:style radio :selected (eq major-mode 'tcl-mode) :help "tcl-mode"]
["XML (nxml-mode)" (progn (nxml-mode))
:style radio :selected (eq major-mode 'nxml-mode) :help "nxml-mode"]
["XML (xml-mode)" (progn (xml-mode))
:style radio :selected (eq major-mode 'xml-mode) :help "xml-mode"]
))
(easy-menu-define my-minor-menu nil "My Minor Menu"
'("Minor Modes"
["Ace Window Display" ace-window-display-mode
:style toggle :selected ace-window-display-mode :help "ace-window-display-mode"]
["Company [Ⓒ]" company-mode
:style toggle :selected company-mode :help "company-mode"]
["Compilation Shell [Ⓒs]" compilation-shell-minor-mode
:style toggle :selected compilation-shell-minor-mode :help "compilation-shell-minor-mode"]
["Diff Highlighting" diff-hl-mode
:style toggle :selected diff-hl-mode :help "diff-hl-mode"]
["Display Fill Column Indicator" display-fill-column-indicator-mode
:style toggle :selected display-fill-column-indicator-mode :help "display-fill-column-indicator-mode"]
["Eldoc [Ⓔ]" eldoc-mode
:style toggle :selected eldoc-mode :help "eldoc-mode"]
["Emojify" emojify-mode
:style toggle :selected emojify-mode :help "emojify-mode"]
["Flycheck [𝓕]" flycheck-mode
:style toggle :selected flycheck-mode :help "flycheck-mode"] ;; flymake supports less languages
["Flyspell" flyspell-mode
:style toggle :selected flyspell-mode :help "flyspell-mode"] ;; uses ispell
["HideShow" hs-minor-mode
:style toggle :selected hs-minor-mode :help "hs-minor-mode"]
["Horizontal Scroll Bar" horizontal-scroll-bar-mode
:style toggle :selected horizontal-scroll-bar-mode :help "horizontal-scroll-bar-mode"]
;; ["Ido" ido-mode
;; :style toggle :selected ido-mode :help "ido-mode"]
["Ivy [Ⓘ]" ivy-mode
:style toggle :selected ivy-mode :help "ivy-mode"]
["Line Numbers" linum-mode
:style toggle :selected linum-mode :help "linum-mode"]
("Line Wrapping"
["Auto Fill Function [↵]" auto-fill-mode
:style toggle :selected auto-fill-function :help "auto-fill-mode"]
["Truncate Long Lines" toggle-truncate-lines ;; menu-bar--toggle-truncate-long-lines
:style toggle :selected (or truncate-lines
(truncated-partial-width-window-p))
:help "toggle-truncate-lines"]
["Virtual Auto Fill [Ⓥf]" virtual-auto-fill-mode
:style toggle :selected virtual-auto-fill-mode :help "virtual-auto-fill-mode"]
["Visual Line (Word Wrap) [↩]" visual-line-mode
:style toggle :selected visual-line-mode :help "visual-line-mode"]
)
("Org"
["Org Fancy Priorities [Ⓟ]" org-fancy-priorities-mode
:style toggle :selected org-sticky-header-mode :help "org-sticky-header-mode"]
["Org Num []" org-num-mode
:style toggle :selected org-num-mode :help "org-num-mode"]
["Org Sticky Header" org-sticky-header-mode
:style toggle :selected org-sticky-header-mode :help "org-sticky-header-mode"]
["Org Superstar" org-superstar-mode
:style toggle :selected org-superstar-mode :help "org-superstar-mode"]
["Org Table Sticky Header [Ⓣ]" org-table-sticky-header-mode
:style toggle :selected org-table-sticky-header-mode :help "org-table-sticky-header-mode"]
)
["Pixel Scroll" pixel-scroll-mode
:style toggle :selected pixel-scroll-mode :help "pixel-scroll-mode"]
["Rainbow" rainbow-mode
:style toggle :selected rainbow-mode :help "rainbow-mode"]
["Scroll-All" scroll-all-mode
:style toggle :selected scroll-all-mode :help "scroll-all-mode"]
["Sphinx Doc [Ⓢ]" sphinx-doc-mode
:style toggle :selected sphinx-doc-mode :help "sphinx-doc-mode"]
["YASnippet [Ⓨ]" yas-minor-mode
:style toggle :selected yas-minor-mode :help "yas-minor-mode"]
["Which Key [Ⓚ]" which-key-mode
:style toggle :selected which-key-mode :help "which-key-mode"]
["Whitespace [␣]" whitespace-mode
:style toggle :selected whitespace-mode :help "whitespace-mode"]
;; "--" ;; separator
;; ["--" 'ignore :visible (featurep 'bookmark+-lit)] ;; conditional separator
;; ["How Many..." how-many]
))
;; add menus explicitly (required by XEmacs), after easy-menu-define
(easy-menu-add my-major-menu nil)
(easy-menu-add my-lang-menu nil)
(easy-menu-add my-minor-menu nil)
(easy-menu-add-item nil () my-menu ;; add empty my menu to menu-bar
;; "Edit" ;; before Edit
)
(easy-menu-add-item nil '("My") my-major-menu) ;; add submenu to my menu
(easy-menu-add-item nil '("My") my-lang-menu)
(easy-menu-add-item nil '("My") my-minor-menu)
(easy-menu-add-item nil '("My") '("--"))
(easy-menu-define my-view-menu nil "My Views Menu"
'("Views"
["ELisp" my-view-elisp :help "my-view-elisp"]
["Gnuplot" my-view-gnuplot :help "my-view-gnuplot"]
["Org PDF" my-view-org-pdf :help "my-view-org-pdf"]
["Python" my-view-python :help "my-view-python"]
["Shell" my-view-shell :help "my-view-shell"]
))
(easy-menu-add my-view-menu nil)
(easy-menu-add-item nil '("My") my-view-menu)
(easy-menu-add-item nil '("My") '("--"))
(with-eval-after-load 'org
(easy-menu-define my-org-export-menu nil "My Org Export Menu"
'("Org Export" :visible (eq major-mode 'org-mode)
["HTML" my-org-export-html :help "my-org-export-html"]
["HTML async" my-org-export-html-async :help "my-org-export-html-async"]
["PDF (LaTeX)" my-org-export-pdf :help "my-org-export-pdf"]
["PDF (LaTeX) async" my-org-export-pdf-async :help "my-org-export-pdf-async"]
))
(easy-menu-add my-org-export-menu nil)
(easy-menu-add-item nil '("My") my-org-export-menu)
(easy-menu-add-item nil '("My") '["Org Link Description Update" my-org-link-description-update :visible (eq major-mode 'org-mode)])
)
(with-eval-after-load 'notmuch
(easy-menu-add-item nil '("My") '["Notmuch Execute Offlineimap" my-mail-exec-offlineimap
:visible (or (eq major-mode 'notmuch-hello-mode)
(eq major-mode 'notmuch-message-mode)
(eq major-mode 'notmuch-search-mode)
(eq major-mode 'notmuch-show-mode)
(eq major-mode 'notmuch-tree-mode))
:help "my-mail-exec-offlineimap"])
)
)
(provide 'general-settings)
;;; general-settings.el ends here