From b4721bf6c5614022bfe3b72237694236813dd486 Mon Sep 17 00:00:00 2001 From: azzamsa Date: Sun, 3 Jun 2018 10:41:50 +0700 Subject: [PATCH 01/57] Show numbers for company completion candidates (#1172) --- modules/prelude-company.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/prelude-company.el b/modules/prelude-company.el index 722d6d9481..9492f4be82 100644 --- a/modules/prelude-company.el +++ b/modules/prelude-company.el @@ -36,6 +36,7 @@ (require 'company) (setq company-idle-delay 0.5) +(setq company-show-numbers t) (setq company-tooltip-limit 10) (setq company-minimum-prefix-length 2) ;; invert the navigation direction if the the completion popup-isearch-match From 211345c3d50577eb3a197738333ab2beff2342e5 Mon Sep 17 00:00:00 2001 From: LEE Dongjun Date: Tue, 26 Jun 2018 13:57:16 +0900 Subject: [PATCH 02/57] Add Typescript programming support (#1181) --- modules/prelude-ts.el | 60 +++++++++++++++++++++++++++++++++++++++ sample/prelude-modules.el | 1 + 2 files changed, 61 insertions(+) create mode 100644 modules/prelude-ts.el diff --git a/modules/prelude-ts.el b/modules/prelude-ts.el new file mode 100644 index 0000000000..c1e54b8ebc --- /dev/null +++ b/modules/prelude-ts.el @@ -0,0 +1,60 @@ +;;; prelude-ts.el --- Emacs Prelude: Typescript programming support. +;; +;; Copyright © 2011-2018 LEE Dongjun +;; +;; Author: LEE Dongjun +;; Version: 1.0.0 +;; Keywords: convenience typescript + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Some basic configuration for Typescript development. + +;;; License: + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 3 +;; of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +(require 'prelude-programming) +(prelude-require-packages '(tide)) + +(require 'typescript-mode) + +(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode)) + +(eval-after-load 'typescript-mode + '(progn + (defun prelude-ts-mode-defaults () + (interactive) + (tide-setup) + (flycheck-mode +1) + (setq flycheck-check-syntax-automatically '(save mode-enabled)) + (eldoc-mode +1) + (tide-hl-identifier-mode +1)) + + ;; formats the buffer before saving + (add-hook 'before-save-hook 'tide-format-before-save) + + (setq prelude-ts-mode-hook 'prelude-ts-mode-defaults) + + (add-hook 'typescript-mode-hook (lambda () (run-hooks 'prelude-ts-mode-hook))))) + +(provide 'prelude-ts) + +;;; prelude-ts.el ends here diff --git a/sample/prelude-modules.el b/sample/prelude-modules.el index 3797b48517..8e7a1320a1 100644 --- a/sample/prelude-modules.el +++ b/sample/prelude-modules.el @@ -34,6 +34,7 @@ (require 'prelude-scheme) (require 'prelude-shell) ;; (require 'prelude-scss) +;; (require 'prelude-ts) ;; (require 'prelude-web) ;; Emacs mode for web templates (require 'prelude-xml) ;; (require 'prelude-yaml) From c142100e631c11f264429d0ab3286d7f72900675 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Tue, 26 Jun 2018 08:31:25 +0300 Subject: [PATCH 03/57] Align company's tooltip annotations to the right --- modules/prelude-company.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/prelude-company.el b/modules/prelude-company.el index 9492f4be82..4a9ed97fa5 100644 --- a/modules/prelude-company.el +++ b/modules/prelude-company.el @@ -39,6 +39,7 @@ (setq company-show-numbers t) (setq company-tooltip-limit 10) (setq company-minimum-prefix-length 2) +(setq company-tooltip-align-annotations t) ;; invert the navigation direction if the the completion popup-isearch-match ;; is displayed on top (happens near the bottom of windows) (setq company-tooltip-flip-when-above t) From 79c2e6fb40039a77dc3589fd1634b878b1e54105 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Tue, 10 Jul 2018 08:53:18 +0300 Subject: [PATCH 04/57] Update a reference to projectile-global-mode --- core/prelude-editor.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/prelude-editor.el b/core/prelude-editor.el index 89b65aafcd..c53ba7e8a1 100644 --- a/core/prelude-editor.el +++ b/core/prelude-editor.el @@ -255,7 +255,7 @@ The body of the advice is in BODY." ;; projectile is a project management mode (require 'projectile) (setq projectile-cache-file (expand-file-name "projectile.cache" prelude-savefile-dir)) -(projectile-global-mode t) +(projectile-mode t) ;; avy allows us to effectively navigate to visible things (require 'avy) From c28686af80e74b2eb82f5fdbe6f69cec8b4de06e Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Tue, 10 Jul 2018 09:01:24 +0300 Subject: [PATCH 05/57] Require Emacs 25.1 --- README.md | 4 ++-- core/prelude-editor.el | 8 ++------ init.el | 4 ++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index fadaef8173..2eac378f2e 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ library to the mix. The final product offers an easy to use Emacs configuration for Emacs newcomers and lots of additional power for Emacs power users. -Prelude is compatible **ONLY with GNU Emacs 24.4+**. In general you're +Prelude is compatible **ONLY with GNU Emacs 25.1+**. In general you're advised to always run Prelude with the latest Emacs - currently -**25.2**. +**26.1**. You can support the development of Prelude via [Salt](https://bountysource.com/teams/prelude), diff --git a/core/prelude-editor.el b/core/prelude-editor.el index c53ba7e8a1..17819da768 100644 --- a/core/prelude-editor.el +++ b/core/prelude-editor.el @@ -110,10 +110,7 @@ ;; saveplace remembers your location in a file when saving files (setq save-place-file (expand-file-name "saveplace" prelude-savefile-dir)) ;; activate it for all buffers -(if (< emacs-major-version 25) - (progn (require 'saveplace) - (setq-default save-place t)) - (save-place-mode 1)) +(save-place-mode 1) ;; savehist keeps track of some history (require 'savehist) @@ -178,8 +175,7 @@ The body of the advice is in BODY." (add-hook 'mouse-leave-buffer-hook 'prelude-auto-save-command) -(when (version<= "24.4" emacs-version) - (add-hook 'focus-out-hook 'prelude-auto-save-command)) +(add-hook 'focus-out-hook 'prelude-auto-save-command) (defadvice set-buffer-major-mode (after set-major-mode activate compile) "Set buffer major mode according to `auto-mode-alist'." diff --git a/init.el b/init.el index 3b6a887432..cfc5b57ff8 100644 --- a/init.el +++ b/init.el @@ -45,8 +45,8 @@ (message "Prelude is powering up... Be patient, Master %s!" current-user) -(when (version< emacs-version "24.4") - (error "Prelude requires at least GNU Emacs 24.4, but you're running %s" emacs-version)) +(when (version< emacs-version "25.1") + (error "Prelude requires GNU Emacs 25.1 or newer, but you're running %s" emacs-version)) ;; Always load newest byte code (setq load-prefer-newer t) From d21e4bf9228dda9be2d4b7f3bb48b811d8f6cf57 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Tue, 10 Jul 2018 09:02:25 +0300 Subject: [PATCH 06/57] Mention my paypal.me link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2eac378f2e..b47d7244aa 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ advised to always run Prelude with the latest Emacs - currently **26.1**. You can support the development of Prelude via +[PayPal](https://www.paypal.me/bbatsov), [Salt](https://bountysource.com/teams/prelude), [Patreon](https://www.patreon.com/bbatsov) and [Liberapay](https://liberapay.com/bbatsov/donate). From 54110fa4345c634be0304d08814caa9bd9a1e7f1 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Tue, 17 Jul 2018 10:33:36 +0300 Subject: [PATCH 07/57] [Fix #1176] Remove smart-mode-line As mentioned in the issue - it's causing problems on Emacs 26.1. --- core/prelude-packages.el | 1 - core/prelude-ui.el | 6 ------ 2 files changed, 7 deletions(-) diff --git a/core/prelude-packages.el b/core/prelude-packages.el index 27488c095c..2cf6b91b46 100644 --- a/core/prelude-packages.el +++ b/core/prelude-packages.el @@ -80,7 +80,6 @@ magit move-text operate-on-number - smart-mode-line smartparens smartrep undo-tree diff --git a/core/prelude-ui.el b/core/prelude-ui.el index 6958f5d24d..fc57a2a18d 100644 --- a/core/prelude-ui.el +++ b/core/prelude-ui.el @@ -74,12 +74,6 @@ (when prelude-theme (load-theme prelude-theme t)) -(require 'smart-mode-line) -(setq sml/no-confirm-load-theme t) -;; delegate theming to the currently active theme -(setq sml/theme nil) -(add-hook 'after-init-hook #'sml/setup) - ;; show the cursor when moving after big movements in the window (require 'beacon) (beacon-mode +1) From dd5465752ef49de00747ed8eeca9c8a3bd674627 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Tue, 17 Jul 2018 10:39:18 +0300 Subject: [PATCH 08/57] Remove god-mode and grizzl --- core/prelude-packages.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/prelude-packages.el b/core/prelude-packages.el index 2cf6b91b46..fdf70c5615 100644 --- a/core/prelude-packages.el +++ b/core/prelude-packages.el @@ -71,8 +71,6 @@ git-timemachine gitconfig-mode gitignore-mode - god-mode - grizzl guru-mode hl-todo imenu-anywhere From 9590d491d894ad35aa9a112703fdbe46cc241435 Mon Sep 17 00:00:00 2001 From: Iain Beeston Date: Thu, 26 Jul 2018 15:10:28 +0100 Subject: [PATCH 09/57] Update readme to use the new projectile binding (#1183) In b90b950eead64b171d528098d186c19804739aa0 the default keybinding for projectile mode was changed from `C-c p` to `C-c C-p`. This updates the prelude readme to reflect that. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b47d7244aa..0ed46e9c51 100644 --- a/README.md +++ b/README.md @@ -381,13 +381,13 @@ It provides an easy way to navigate and switch projects. Take a look at its exte to get a feel for everything you can do with Projectile. Prelude adds an extra keymap prefix `s-p` (`s` stands for -`Super`) in addition to the standard one `C-c p`. By default on Windows keyboard +`Super`) in addition to the standard one `C-c C-p`. By default on Windows keyboard `Super` is mapped to the `Windows` key and on macOS keyboards `Super` is mapped to the `Command` key. If you ever forget any of Projectile's keybindings just do a: -C-c p C-h or s-p C-h +C-c C-p C-h or s-p C-h Alternatively you can just press s-p and wait for a moment for `which-key` to kick in and show you the available keybindings. From 2fc40319e594b6a7bb7f25f8d5316e77e8c5d061 Mon Sep 17 00:00:00 2001 From: John Eismeier Date: Tue, 31 Jul 2018 10:46:05 -0400 Subject: [PATCH 10/57] Propose small fix on typo --- utils/installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/installer.sh b/utils/installer.sh index 15f6e7ed11..ed3c4e3042 100755 --- a/utils/installer.sh +++ b/utils/installer.sh @@ -117,7 +117,7 @@ do shift 1 ;; *) - printf "Unkown option: $1\n" + printf "Unknown option: $1\n" shift 1 ;; esac From e180d64f39b5c16a5046f0af139f05bf7ed2c767 Mon Sep 17 00:00:00 2001 From: Iain Beeston Date: Wed, 8 Aug 2018 12:35:33 +0100 Subject: [PATCH 11/57] Revert "Update readme to use the new projectile binding (#1183)" This reverts commit 9590d491d894ad35aa9a112703fdbe46cc241435. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0ed46e9c51..b47d7244aa 100644 --- a/README.md +++ b/README.md @@ -381,13 +381,13 @@ It provides an easy way to navigate and switch projects. Take a look at its exte to get a feel for everything you can do with Projectile. Prelude adds an extra keymap prefix `s-p` (`s` stands for -`Super`) in addition to the standard one `C-c C-p`. By default on Windows keyboard +`Super`) in addition to the standard one `C-c p`. By default on Windows keyboard `Super` is mapped to the `Windows` key and on macOS keyboards `Super` is mapped to the `Command` key. If you ever forget any of Projectile's keybindings just do a: -C-c C-p C-h or s-p C-h +C-c p C-h or s-p C-h Alternatively you can just press s-p and wait for a moment for `which-key` to kick in and show you the available keybindings. From 73ae504161d634fd5c0e66d07c54261caf2f1e35 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 8 Aug 2018 15:32:52 +0300 Subject: [PATCH 12/57] Add back C-c p as a prefix for Projectile --- core/prelude-mode.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/prelude-mode.el b/core/prelude-mode.el index a94a763e4a..9a41d716f3 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -69,6 +69,7 @@ (define-key map (kbd "C-c i") 'imenu-anywhere) ;; extra prefix for projectile (define-key map (kbd "s-p") 'projectile-command-map) + (define-key map (kbd "C-c p") 'projectile-command-map) ;; make some use of the Super key (define-key map (kbd "s-g") 'god-local-mode) (define-key map (kbd "s-r") 'crux-recentf-ido-find-file) From a3729c13064606921ec3334cd1f0249973d982ae Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 8 Aug 2018 15:35:45 +0300 Subject: [PATCH 13/57] Kill some remnants for god-mode --- README.md | 1 - core/prelude-mode.el | 1 - modules/doc/prelude-cheatsheet.tex | 1 - 3 files changed, 3 deletions(-) diff --git a/README.md b/README.md index b47d7244aa..4589f47ab5 100644 --- a/README.md +++ b/README.md @@ -344,7 +344,6 @@ Keybinding | Description C-c . # | Convert integer at point to specified base. Default is 10. C-c . % | Replace integer at point with another specified integer. C-c . ' | Perform arithmetic operations on integer at point. User specifies the operator. -Super-g | Toggle between God mode and non-God mode Super-r | Recent files Super-j | Join lines Super-k | Kill whole line diff --git a/core/prelude-mode.el b/core/prelude-mode.el index 9a41d716f3..56dfe74024 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -71,7 +71,6 @@ (define-key map (kbd "s-p") 'projectile-command-map) (define-key map (kbd "C-c p") 'projectile-command-map) ;; make some use of the Super key - (define-key map (kbd "s-g") 'god-local-mode) (define-key map (kbd "s-r") 'crux-recentf-ido-find-file) (define-key map (kbd "s-j") 'crux-top-join-line) (define-key map (kbd "s-k") 'crux-kill-whole-line) diff --git a/modules/doc/prelude-cheatsheet.tex b/modules/doc/prelude-cheatsheet.tex index 300967c10b..75330c7a5e 100644 --- a/modules/doc/prelude-cheatsheet.tex +++ b/modules/doc/prelude-cheatsheet.tex @@ -117,7 +117,6 @@ \item[C-c S] crux-find-shell-init-file \item[C-c i] imenu-anywhere \item[s-p] projectile-command-map - \item[s-g] god-local-mode \item[s-r] crux-recentf-ido-find-file \item[s-j] crux-top-join-line \item[s-k] crux-kill-whole-line From aa54fd6dc901093104c3c7c14d42e57470c9a229 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Thu, 9 Aug 2018 08:25:07 +0300 Subject: [PATCH 14/57] Improve the mode menu a bit --- core/prelude-mode.el | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/core/prelude-mode.el b/core/prelude-mode.el index 56dfe74024..89f445d3b8 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -89,19 +89,28 @@ '("Prelude" ("Files" ["Open with..." crux-open-with] + ["Re-open as root" crux-reopen-as-root] ["Delete file and buffer" crux-delete-file-and-buffer] - ["Rename buffer and file" crux-rename-buffer-and-file]) + ["Rename buffer and file" crux-rename-buffer-and-file] + ["Find init file" crux-find-user-init-file] + ["Find custom file" crux-find-user-custom-file] + ["Find shell config file" crux-find-shell-init-file]) ("Buffers" ["Clean up buffer or region" crux-cleanup-buffer-or-region] ["Kill other buffers" crux-kill-other-buffers]) ("Editing" - ["Insert empty line" prelude-insert-empty-line] - ["Move line up" prelude-move-line-up] - ["Move line down" prelude-move-line-down] - ["Duplicate line or region" prelude-duplicate-current-line-or-region] + ["Go to beginning of line" crux-move-beginning-of-line] + ["Kill line" crux-smart-kill-line] + ["Kill whole line" crux-kill-whole-line] + ["Insert empty line below" crux-smart-open-line] + ["insert empty line above" crux-smart-open-line-above] + ["Move up" move-text-up] + ["Move down" move-text-down] + ["Duplicate line or region" crux-duplicate-current-line-or-region] ["Indent rigidly and copy to clipboard" crux-indent-rigidly-and-copy-to-clipboard] + ["Indent defun" crux-indent-defun] ["Insert date" crux-insert-date] ["Eval and replace" crux-eval-and-replace] ) From 0ce648b699821d3c1d889f4649577d04900460bf Mon Sep 17 00:00:00 2001 From: Hang Qian Date: Sat, 18 Aug 2018 02:57:22 -0700 Subject: [PATCH 15/57] Fix readme preload description (#1187) `prelude-require-package` has not be defined during preloading. This patch fixes readme description. Fixes #1161. --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4589f47ab5..a9ec0342c7 100644 --- a/README.md +++ b/README.md @@ -526,15 +526,16 @@ line: Or you can use another theme altogether by adding something in `personal/preload` like: ```lisp -(prelude-require-package 'solarized-theme) -(setq prelude-theme 'solarized-dark) +(setq prelude-theme 'tango) ``` -**Note** [Solarized](https://github.com/bbatsov/zenburn-emacs) is not -available by default - you'll have to install it from MELPA first, -therefore the need for `prelude-require-package`. Alternatively you -can manually install the package like this - `M-x package-install RET -solarized-theme`. +**Note** To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/zenburn-emacs), +you'll have to install it from MELPA first by `M-x package-install RET solarized-theme`. Then add + +``` lisp +(setq prelude-theme 'solarized-dark) +``` +in `personal/preload`. Finally, if you don't want any theme at all, you can add this to your `personal/preload`: From cecae9ca197cd083dec7eb88fa77255e890e509b Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 14 Sep 2018 09:50:00 +0300 Subject: [PATCH 16/57] Replace usages of eval-after-load with with-eval-after-load `with-eval-after-load` was introduced in Emacs 24.4 and its usage results in a cleaner code. `eval-after-load` is considered ill-behaved because it is a function, not a macro, and thus requires the code inside it to be quoted, which means that it cannot be byte-compiled. It also accepts only one form, so if you have more than one, you need to use `progn`. More details - https://stackoverflow.com/questions/21880139/what-is-with-eval-after-load-in-emacs-lisp --- init.el | 6 ++-- modules/prelude-clojure.el | 34 ++++++++++------------ modules/prelude-coffee.el | 39 ++++++++++++------------- modules/prelude-common-lisp.el | 15 +++++----- modules/prelude-css.el | 19 ++++++------ modules/prelude-emacs-lisp.el | 21 +++++++------- modules/prelude-erlang.el | 5 ++-- modules/prelude-go.el | 53 +++++++++++++++++----------------- modules/prelude-haskell.el | 23 +++++++-------- modules/prelude-js.el | 17 +++++------ modules/prelude-latex.el | 7 ++--- modules/prelude-ruby.el | 17 +++++------ modules/prelude-rust.el | 27 +++++++++-------- modules/prelude-ts.el | 31 ++++++++++---------- modules/prelude-web.el | 11 ++++--- 15 files changed, 155 insertions(+), 170 deletions(-) diff --git a/init.el b/init.el index cfc5b57ff8..87d94195a9 100644 --- a/init.el +++ b/init.el @@ -137,9 +137,9 @@ by Prelude.") ;; Patch security vulnerability in Emacs versions older than 25.3 (when (version< emacs-version "25.3") - (eval-after-load "enriched" - '(defun enriched-decode-display-prop (start end &optional param) - (list start end)))) + (with-eval-after-load "enriched" + (defun enriched-decode-display-prop (start end &optional param) + (list start end)))) (prelude-eval-after-init ;; greet the use with some useful tip diff --git a/modules/prelude-clojure.el b/modules/prelude-clojure.el index 06271af046..d813467697 100644 --- a/modules/prelude-clojure.el +++ b/modules/prelude-clojure.el @@ -35,31 +35,29 @@ (require 'prelude-lisp) (prelude-require-packages '(clojure-mode cider)) -(eval-after-load 'clojure-mode - '(progn - (defun prelude-clojure-mode-defaults () - (subword-mode +1) - (run-hooks 'prelude-lisp-coding-hook)) +(with-eval-after-load 'clojure-mode + (defun prelude-clojure-mode-defaults () + (subword-mode +1) + (run-hooks 'prelude-lisp-coding-hook)) - (setq prelude-clojure-mode-hook 'prelude-clojure-mode-defaults) + (setq prelude-clojure-mode-hook 'prelude-clojure-mode-defaults) - (add-hook 'clojure-mode-hook (lambda () - (run-hooks 'prelude-clojure-mode-hook))))) + (add-hook 'clojure-mode-hook (lambda () + (run-hooks 'prelude-clojure-mode-hook)))) -(eval-after-load 'cider - '(progn - (setq nrepl-log-messages t) +(with-eval-after-load 'cider + (setq nrepl-log-messages t) - (add-hook 'cider-mode-hook 'eldoc-mode) + (add-hook 'cider-mode-hook 'eldoc-mode) - (defun prelude-cider-repl-mode-defaults () - (subword-mode +1) - (run-hooks 'prelude-interactive-lisp-coding-hook)) + (defun prelude-cider-repl-mode-defaults () + (subword-mode +1) + (run-hooks 'prelude-interactive-lisp-coding-hook)) - (setq prelude-cider-repl-mode-hook 'prelude-cider-repl-mode-defaults) + (setq prelude-cider-repl-mode-hook 'prelude-cider-repl-mode-defaults) - (add-hook 'cider-repl-mode-hook (lambda () - (run-hooks 'prelude-cider-repl-mode-hook))))) + (add-hook 'cider-repl-mode-hook (lambda () + (run-hooks 'prelude-cider-repl-mode-hook)))) (provide 'prelude-clojure) diff --git a/modules/prelude-coffee.el b/modules/prelude-coffee.el index 2022bed280..3bf9784865 100644 --- a/modules/prelude-coffee.el +++ b/modules/prelude-coffee.el @@ -35,26 +35,25 @@ (require 'prelude-programming) (prelude-require-package 'coffee-mode) -(eval-after-load 'coffee-mode - '(progn - ;; CoffeeScript uses two spaces. - (setq coffee-tab-width 2) - - ;; remove the "Generated by CoffeeScript" header - (add-to-list 'coffee-args-compile "--no-header") - - (defun prelude-coffee-mode-defaults () - ;; Update the already compiled js on save - (and (buffer-file-name) - (file-exists-p (buffer-file-name)) - (file-exists-p (coffee-compiled-file-name (buffer-file-name))) - (coffee-cos-mode t)) - (subword-mode +1)) - - (setq prelude-coffee-mode-hook 'prelude-coffee-mode-defaults) - - (add-hook 'coffee-mode-hook (lambda () - (run-hooks 'prelude-coffee-mode-hook))))) +(with-eval-after-load 'coffee-mode + ;; CoffeeScript uses two spaces. + (setq coffee-tab-width 2) + + ;; remove the "Generated by CoffeeScript" header + (add-to-list 'coffee-args-compile "--no-header") + + (defun prelude-coffee-mode-defaults () + ;; Update the already compiled js on save + (and (buffer-file-name) + (file-exists-p (buffer-file-name)) + (file-exists-p (coffee-compiled-file-name (buffer-file-name))) + (coffee-cos-mode t)) + (subword-mode +1)) + + (setq prelude-coffee-mode-hook 'prelude-coffee-mode-defaults) + + (add-hook 'coffee-mode-hook (lambda () + (run-hooks 'prelude-coffee-mode-hook)))) (provide 'prelude-coffee) ;;; prelude-coffee.el ends here diff --git a/modules/prelude-common-lisp.el b/modules/prelude-common-lisp.el index ec63d6fa1c..f69b546495 100644 --- a/modules/prelude-common-lisp.el +++ b/modules/prelude-common-lisp.el @@ -71,14 +71,13 @@ (smartparens-strict-mode +1) (whitespace-mode -1))) -(eval-after-load "slime" - '(progn - (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol - slime-fuzzy-completion-in-place t - slime-enable-evaluate-in-emacs t - slime-autodoc-use-multiline-p t - slime-auto-start 'always) - (define-key slime-mode-map (kbd "C-c C-s") 'slime-selector))) +(with-eval-after-load "slime" + (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol + slime-fuzzy-completion-in-place t + slime-enable-evaluate-in-emacs t + slime-autodoc-use-multiline-p t + slime-auto-start 'always) + (define-key slime-mode-map (kbd "C-c C-s") 'slime-selector)) (provide 'prelude-common-lisp) diff --git a/modules/prelude-css.el b/modules/prelude-css.el index 10cab3b782..c77e0c6ceb 100644 --- a/modules/prelude-css.el +++ b/modules/prelude-css.el @@ -32,20 +32,19 @@ ;;; Code: -(eval-after-load 'css-mode - '(progn - (prelude-require-packages '(rainbow-mode)) +(with-eval-after-load 'css-mode + (prelude-require-packages '(rainbow-mode)) - (setq css-indent-offset 2) + (setq css-indent-offset 2) - (defun prelude-css-mode-defaults () - (rainbow-mode +1) - (run-hooks 'prelude-prog-mode-hook)) + (defun prelude-css-mode-defaults () + (rainbow-mode +1) + (run-hooks 'prelude-prog-mode-hook)) - (setq prelude-css-mode-hook 'prelude-css-mode-defaults) + (setq prelude-css-mode-hook 'prelude-css-mode-defaults) - (add-hook 'css-mode-hook (lambda () - (run-hooks 'prelude-css-mode-hook))))) + (add-hook 'css-mode-hook (lambda () + (run-hooks 'prelude-css-mode-hook)))) (provide 'prelude-css) ;;; prelude-css.el ends here diff --git a/modules/prelude-emacs-lisp.el b/modules/prelude-emacs-lisp.el index 6500268fd6..29764c4518 100644 --- a/modules/prelude-emacs-lisp.el +++ b/modules/prelude-emacs-lisp.el @@ -92,17 +92,16 @@ Start `ielm' if it's not already running." (add-hook 'ielm-mode-hook (lambda () (run-hooks 'prelude-ielm-mode-hook))) -(eval-after-load "elisp-slime-nav" - '(diminish 'elisp-slime-nav-mode)) -(eval-after-load "rainbow-mode" - '(diminish 'rainbow-mode)) -(eval-after-load "eldoc" - '(diminish 'eldoc-mode)) - -(eval-after-load "ielm" - '(progn - (define-key ielm-map (kbd "M-(") (prelude-wrap-with "(")) - (define-key ielm-map (kbd "M-\"") (prelude-wrap-with "\"")))) +(with-eval-after-load "elisp-slime-nav" + (diminish 'elisp-slime-nav-mode)) +(with-eval-after-load "rainbow-mode" + (diminish 'rainbow-mode)) +(with-eval-after-load "eldoc" + (diminish 'eldoc-mode)) + +(with-eval-after-load "ielm" + (define-key ielm-map (kbd "M-(") (prelude-wrap-with "(")) + (define-key ielm-map (kbd "M-\"") (prelude-wrap-with "\""))) ;; enable elisp-slime-nav-mode (dolist (hook '(emacs-lisp-mode-hook ielm-mode-hook)) diff --git a/modules/prelude-erlang.el b/modules/prelude-erlang.el index a392f0d787..bece1f82ec 100644 --- a/modules/prelude-erlang.el +++ b/modules/prelude-erlang.el @@ -44,9 +44,8 @@ (when (require 'erlang-start nil t) - (eval-after-load 'erlang-mode - '(progn - (flymake-mode))) + (with-eval-after-load 'erlang-mode + (flymake-mode)) (when (not (null wrangler-path)) (add-to-list 'load-path wrangler-path) diff --git a/modules/prelude-go.el b/modules/prelude-go.el index d71144574c..474db6501e 100644 --- a/modules/prelude-go.el +++ b/modules/prelude-go.el @@ -44,41 +44,40 @@ (define-key 'help-command (kbd "G") 'godoc) -(eval-after-load 'go-mode - '(progn - (defun prelude-go-mode-defaults () - ;; Add to default go-mode key bindings - (let ((map go-mode-map)) - (define-key map (kbd "C-c a") 'go-test-current-project) ;; current package, really - (define-key map (kbd "C-c m") 'go-test-current-file) - (define-key map (kbd "C-c .") 'go-test-current-test) - (define-key map (kbd "C-c b") 'go-run) - (define-key map (kbd "C-h f") 'godoc-at-point)) +(with-eval-after-load 'go-mode + (defun prelude-go-mode-defaults () + ;; Add to default go-mode key bindings + (let ((map go-mode-map)) + (define-key map (kbd "C-c a") 'go-test-current-project) ;; current package, really + (define-key map (kbd "C-c m") 'go-test-current-file) + (define-key map (kbd "C-c .") 'go-test-current-test) + (define-key map (kbd "C-c b") 'go-run) + (define-key map (kbd "C-h f") 'godoc-at-point)) - ;; Prefer goimports to gofmt if installed - (let ((goimports (executable-find "goimports"))) - (when goimports - (setq gofmt-command goimports))) + ;; Prefer goimports to gofmt if installed + (let ((goimports (executable-find "goimports"))) + (when goimports + (setq gofmt-command goimports))) - ;; gofmt on save - (add-hook 'before-save-hook 'gofmt-before-save nil t) + ;; gofmt on save + (add-hook 'before-save-hook 'gofmt-before-save nil t) - ;; stop whitespace being highlighted - (whitespace-toggle-options '(tabs)) + ;; stop whitespace being highlighted + (whitespace-toggle-options '(tabs)) - ;; Company mode settings - (set (make-local-variable 'company-backends) '(company-go)) + ;; Company mode settings + (set (make-local-variable 'company-backends) '(company-go)) - ;; El-doc for Go - (go-eldoc-setup) + ;; El-doc for Go + (go-eldoc-setup) - ;; CamelCase aware editing operations - (subword-mode +1)) + ;; CamelCase aware editing operations + (subword-mode +1)) - (setq prelude-go-mode-hook 'prelude-go-mode-defaults) + (setq prelude-go-mode-hook 'prelude-go-mode-defaults) - (add-hook 'go-mode-hook (lambda () - (run-hooks 'prelude-go-mode-hook))))) + (add-hook 'go-mode-hook (lambda () + (run-hooks 'prelude-go-mode-hook)))) (provide 'prelude-go) ;;; prelude-go.el ends here diff --git a/modules/prelude-haskell.el b/modules/prelude-haskell.el index d48a45808a..0e3cd390b6 100644 --- a/modules/prelude-haskell.el +++ b/modules/prelude-haskell.el @@ -35,18 +35,17 @@ (require 'prelude-programming) (prelude-require-packages '(haskell-mode)) -(eval-after-load 'haskell-mode - '(progn - (defun prelude-haskell-mode-defaults () - (subword-mode +1) - (eldoc-mode +1) - (haskell-indentation-mode +1) - (interactive-haskell-mode +1)) - - (setq prelude-haskell-mode-hook 'prelude-haskell-mode-defaults) - - (add-hook 'haskell-mode-hook (lambda () - (run-hooks 'prelude-haskell-mode-hook))))) +(with-eval-after-load 'haskell-mode + (defun prelude-haskell-mode-defaults () + (subword-mode +1) + (eldoc-mode +1) + (haskell-indentation-mode +1) + (interactive-haskell-mode +1)) + + (setq prelude-haskell-mode-hook 'prelude-haskell-mode-defaults) + + (add-hook 'haskell-mode-hook (lambda () + (run-hooks 'prelude-haskell-mode-hook)))) (provide 'prelude-haskell) diff --git a/modules/prelude-js.el b/modules/prelude-js.el index 9d4ea52557..6715ee42fc 100644 --- a/modules/prelude-js.el +++ b/modules/prelude-js.el @@ -41,17 +41,16 @@ (add-to-list 'auto-mode-alist '("\\.pac\\'" . js2-mode)) (add-to-list 'interpreter-mode-alist '("node" . js2-mode)) -(eval-after-load 'js2-mode - '(progn - (defun prelude-js-mode-defaults () - ;; electric-layout-mode doesn't play nice with smartparens - (setq-local electric-layout-rules '((?\; . after))) - (setq mode-name "JS2") - (js2-imenu-extras-mode +1)) +(with-eval-after-load 'js2-mode + (defun prelude-js-mode-defaults () + ;; electric-layout-mode doesn't play nice with smartparens + (setq-local electric-layout-rules '((?\; . after))) + (setq mode-name "JS2") + (js2-imenu-extras-mode +1)) - (setq prelude-js-mode-hook 'prelude-js-mode-defaults) + (setq prelude-js-mode-hook 'prelude-js-mode-defaults) - (add-hook 'js2-mode-hook (lambda () (run-hooks 'prelude-js-mode-hook))))) + (add-hook 'js2-mode-hook (lambda () (run-hooks 'prelude-js-mode-hook)))) (provide 'prelude-js) diff --git a/modules/prelude-latex.el b/modules/prelude-latex.el index 11acdce867..4312de9b26 100644 --- a/modules/prelude-latex.el +++ b/modules/prelude-latex.el @@ -37,10 +37,9 @@ ;; for case (require 'cl) -(eval-after-load "company" - '(progn - (prelude-require-packages '(company-auctex)) - (company-auctex-init))) +(with-eval-after-load "company" + (prelude-require-packages '(company-auctex)) + (company-auctex-init)) (defcustom prelude-latex-fast-math-entry 'LaTeX-math-mode "Method used for fast math symbol entry in LaTeX." diff --git a/modules/prelude-ruby.el b/modules/prelude-ruby.el index 6467fc2787..e19bc3550e 100644 --- a/modules/prelude-ruby.el +++ b/modules/prelude-ruby.el @@ -41,17 +41,16 @@ (define-key 'help-command (kbd "R") 'yari) -(eval-after-load 'ruby-mode - '(progn - (defun prelude-ruby-mode-defaults () - (inf-ruby-minor-mode +1) - ;; CamelCase aware editing operations - (subword-mode +1)) +(with-eval-after-load 'ruby-mode + (defun prelude-ruby-mode-defaults () + (inf-ruby-minor-mode +1) + ;; CamelCase aware editing operations + (subword-mode +1)) - (setq prelude-ruby-mode-hook 'prelude-ruby-mode-defaults) + (setq prelude-ruby-mode-hook 'prelude-ruby-mode-defaults) - (add-hook 'ruby-mode-hook (lambda () - (run-hooks 'prelude-ruby-mode-hook))))) + (add-hook 'ruby-mode-hook (lambda () + (run-hooks 'prelude-ruby-mode-hook)))) (provide 'prelude-ruby) ;;; prelude-ruby.el ends here diff --git a/modules/prelude-rust.el b/modules/prelude-rust.el index bb4c4a8451..536453c526 100644 --- a/modules/prelude-rust.el +++ b/modules/prelude-rust.el @@ -44,23 +44,22 @@ (setq rust-format-on-save t) -(eval-after-load 'rust-mode - '(progn - (add-hook 'rust-mode-hook 'racer-mode) - (add-hook 'racer-mode-hook 'eldoc-mode) - (add-hook 'rust-mode-hook 'cargo-minor-mode) - (add-hook 'rust-mode-hook 'flycheck-rust-setup) - (add-hook 'flycheck-mode-hook 'flycheck-rust-setup) +(with-eval-after-load 'rust-mode + (add-hook 'rust-mode-hook 'racer-mode) + (add-hook 'racer-mode-hook 'eldoc-mode) + (add-hook 'rust-mode-hook 'cargo-minor-mode) + (add-hook 'rust-mode-hook 'flycheck-rust-setup) + (add-hook 'flycheck-mode-hook 'flycheck-rust-setup) - (defun prelude-rust-mode-defaults () - (local-set-key (kbd "C-c C-d") 'racer-describe) - ;; CamelCase aware editing operations - (subword-mode +1)) + (defun prelude-rust-mode-defaults () + (local-set-key (kbd "C-c C-d") 'racer-describe) + ;; CamelCase aware editing operations + (subword-mode +1)) - (setq prelude-rust-mode-hook 'prelude-rust-mode-defaults) + (setq prelude-rust-mode-hook 'prelude-rust-mode-defaults) - (add-hook 'rust-mode-hook (lambda () - (run-hooks 'prelude-rust-mode-hook))))) + (add-hook 'rust-mode-hook (lambda () + (run-hooks 'prelude-rust-mode-hook)))) (provide 'prelude-rust) ;;; prelude-rust.el ends here diff --git a/modules/prelude-ts.el b/modules/prelude-ts.el index c1e54b8ebc..e8caf2a674 100644 --- a/modules/prelude-ts.el +++ b/modules/prelude-ts.el @@ -38,22 +38,21 @@ (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode)) -(eval-after-load 'typescript-mode - '(progn - (defun prelude-ts-mode-defaults () - (interactive) - (tide-setup) - (flycheck-mode +1) - (setq flycheck-check-syntax-automatically '(save mode-enabled)) - (eldoc-mode +1) - (tide-hl-identifier-mode +1)) - - ;; formats the buffer before saving - (add-hook 'before-save-hook 'tide-format-before-save) - - (setq prelude-ts-mode-hook 'prelude-ts-mode-defaults) - - (add-hook 'typescript-mode-hook (lambda () (run-hooks 'prelude-ts-mode-hook))))) +(with-eval-after-load 'typescript-mode + (defun prelude-ts-mode-defaults () + (interactive) + (tide-setup) + (flycheck-mode +1) + (setq flycheck-check-syntax-automatically '(save mode-enabled)) + (eldoc-mode +1) + (tide-hl-identifier-mode +1)) + + ;; formats the buffer before saving + (add-hook 'before-save-hook 'tide-format-before-save) + + (setq prelude-ts-mode-hook 'prelude-ts-mode-defaults) + + (add-hook 'typescript-mode-hook (lambda () (run-hooks 'prelude-ts-mode-hook)))) (provide 'prelude-ts) diff --git a/modules/prelude-web.el b/modules/prelude-web.el index b4ccf0af0d..64adb2c9f2 100644 --- a/modules/prelude-web.el +++ b/modules/prelude-web.el @@ -61,13 +61,12 @@ (sp-local-tag "=" "<%= " " %>") (sp-local-tag "#" "<%# " " %>")) -(eval-after-load 'web-mode - '(progn - (defun prelude-web-mode-defaults ()) - (setq prelude-web-mode-hook 'prelude-web-mode-defaults) +(with-eval-after-load 'web-mode + (defun prelude-web-mode-defaults ()) + (setq prelude-web-mode-hook 'prelude-web-mode-defaults) - (add-hook 'web-mode-hook (lambda () - (run-hooks 'prelude-web-mode-hook))))) + (add-hook 'web-mode-hook (lambda () + (run-hooks 'prelude-web-mode-hook)))) (provide 'prelude-web) ;;; prelude-web.el ends here From e9590101d851f4a8709fcf1a9393349ff9562f78 Mon Sep 17 00:00:00 2001 From: Chilling Hsu Date: Mon, 17 Sep 2018 22:46:02 +0800 Subject: [PATCH 17/57] Don't use an obsolete command --- core/prelude-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/prelude-mode.el b/core/prelude-mode.el index 89f445d3b8..78548ec4b6 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -52,7 +52,7 @@ (define-key map [(meta shift up)] 'move-text-up) (define-key map [(meta shift down)] 'move-text-down) (define-key map (kbd "C-c n") 'crux-cleanup-buffer-or-region) - (define-key map (kbd "C-c f") 'crux-recentf-ido-find-file) + (define-key map (kbd "C-c f") 'crux-recentf-find-file) (define-key map (kbd "C-M-z") 'crux-indent-defun) (define-key map (kbd "C-c u") 'crux-view-url) (define-key map (kbd "C-c e") 'crux-eval-and-replace) @@ -71,7 +71,7 @@ (define-key map (kbd "s-p") 'projectile-command-map) (define-key map (kbd "C-c p") 'projectile-command-map) ;; make some use of the Super key - (define-key map (kbd "s-r") 'crux-recentf-ido-find-file) + (define-key map (kbd "s-r") 'crux-recentf-find-file) (define-key map (kbd "s-j") 'crux-top-join-line) (define-key map (kbd "s-k") 'crux-kill-whole-line) (define-key map (kbd "s-m m") 'magit-status) From 598fdd8392204a4ec68984c6ddf28b5e3ff096a1 Mon Sep 17 00:00:00 2001 From: Geoff Shannon Date: Fri, 14 Sep 2018 02:23:39 -0700 Subject: [PATCH 18/57] Stop Rust source files from being made executable Rust has an unfortunate syntax for setting attributes on a module file: ```rust #![...] ``` Since this is typically put at the top of the file, that makes the shebang the first two characters, which makes the `after-save-hook` function `executable-make-buffer-file-executable-if-script-p` function change any such rust files executable. --- modules/prelude-rust.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/prelude-rust.el b/modules/prelude-rust.el index 536453c526..b8d5762c6b 100644 --- a/modules/prelude-rust.el +++ b/modules/prelude-rust.el @@ -53,6 +53,8 @@ (defun prelude-rust-mode-defaults () (local-set-key (kbd "C-c C-d") 'racer-describe) + ;; Prevent #! from chmodding rust files to be executable + (remove-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) ;; CamelCase aware editing operations (subword-mode +1)) From fef1988eac81f1bc486743d51a22187afba98a8b Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 28 Sep 2018 09:13:55 +0300 Subject: [PATCH 19/57] Clean up prelude-mode * Move the mode menu top-level, so it's easier to discover * Make prelude-mode a global mode and remove prelude-global-mode --- core/prelude-editor.el | 2 +- core/prelude-mode.el | 99 +++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 65 deletions(-) diff --git a/core/prelude-editor.el b/core/prelude-editor.el index 17819da768..95d3906a08 100644 --- a/core/prelude-editor.el +++ b/core/prelude-editor.el @@ -373,7 +373,7 @@ indent yanked text (with prefix arg don't indent)." (add-hook 'compilation-filter-hook #'prelude-colorize-compilation-buffer) ;; enable Prelude's keybindings -(prelude-global-mode t) +(prelude-mode t) ;; sensible undo (global-undo-tree-mode) diff --git a/core/prelude-mode.el b/core/prelude-mode.el index 78548ec4b6..5c4b3aa2ae 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -79,58 +79,43 @@ (define-key map (kbd "s-m f") 'magit-log-buffer-file) (define-key map (kbd "s-m b") 'magit-blame) (define-key map (kbd "s-o") 'crux-smart-open-line-above) - + (easy-menu-define prelude-mode-menu map + "Prelude's menu." + '("Prelude" + ("Files" + ["Open with..." crux-open-with] + ["Re-open as root" crux-reopen-as-root] + ["Delete file and buffer" crux-delete-file-and-buffer] + ["Rename buffer and file" crux-rename-buffer-and-file] + ["Find init file" crux-find-user-init-file] + ["Find custom file" crux-find-user-custom-file] + ["Find shell config file" crux-find-shell-init-file]) + ("Buffers" + ["Clean up buffer or region" crux-cleanup-buffer-or-region] + ["Kill other buffers" crux-kill-other-buffers]) + ("Editing" + ["Go to beginning of line" crux-move-beginning-of-line] + ["Kill line" crux-smart-kill-line] + ["Kill whole line" crux-kill-whole-line] + ["Insert empty line below" crux-smart-open-line] + ["insert empty line above" crux-smart-open-line-above] + ["Move up" move-text-up] + ["Move down" move-text-down] + ["Duplicate line or region" crux-duplicate-current-line-or-region] + ["Indent rigidly and copy to clipboard" crux-indent-rigidly-and-copy-to-clipboard] + ["Indent defun" crux-indent-defun] + ["Insert date" crux-insert-date] + ["Eval and replace" crux-eval-and-replace]) + ("Windows" + ["Swap windows" crux-swap-windows]) + ("General" + ["Visit term buffer" crux-visit-term-buffer] + ["Search in Google" prelude-google] + ["View URL" crux-view-url])) + "Search Files (Grep)...") map) "Keymap for Prelude mode.") -(defun prelude-mode-add-menu () - "Add a menu entry for `prelude-mode' under Tools." - (easy-menu-add-item nil '("Tools") - '("Prelude" - ("Files" - ["Open with..." crux-open-with] - ["Re-open as root" crux-reopen-as-root] - ["Delete file and buffer" crux-delete-file-and-buffer] - ["Rename buffer and file" crux-rename-buffer-and-file] - ["Find init file" crux-find-user-init-file] - ["Find custom file" crux-find-user-custom-file] - ["Find shell config file" crux-find-shell-init-file]) - - ("Buffers" - ["Clean up buffer or region" crux-cleanup-buffer-or-region] - ["Kill other buffers" crux-kill-other-buffers]) - - ("Editing" - ["Go to beginning of line" crux-move-beginning-of-line] - ["Kill line" crux-smart-kill-line] - ["Kill whole line" crux-kill-whole-line] - ["Insert empty line below" crux-smart-open-line] - ["insert empty line above" crux-smart-open-line-above] - ["Move up" move-text-up] - ["Move down" move-text-down] - ["Duplicate line or region" crux-duplicate-current-line-or-region] - ["Indent rigidly and copy to clipboard" crux-indent-rigidly-and-copy-to-clipboard] - ["Indent defun" crux-indent-defun] - ["Insert date" crux-insert-date] - ["Eval and replace" crux-eval-and-replace] - ) - - ("Windows" - ["Swap windows" crux-swap-windows]) - - ("General" - ["Visit term buffer" crux-visit-term-buffer] - ["Search in Google" prelude-google] - ["View URL" crux-view-url])) - "Search Files (Grep)...") - - (easy-menu-add-item nil '("Tools") '("--") "Search Files (Grep)...")) - -(defun prelude-mode-remove-menu () - "Remove `prelude-mode' menu entry." - (easy-menu-remove-item nil '("Tools") "Prelude") - (easy-menu-remove-item nil '("Tools") "--")) - ;; define minor mode (define-minor-mode prelude-mode "Minor mode to consolidate Emacs Prelude extensions. @@ -138,21 +123,7 @@ \\{prelude-mode-map}" :lighter " Pre" :keymap prelude-mode-map - (if prelude-mode - ;; on start - (prelude-mode-add-menu) - ;; on stop - (prelude-mode-remove-menu))) - -(define-globalized-minor-mode prelude-global-mode prelude-mode prelude-on) - -(defun prelude-on () - "Turn on `prelude-mode'." - (prelude-mode +1)) - -(defun prelude-off () - "Turn off `prelude-mode'." - (prelude-mode -1)) + :global t) (provide 'prelude-mode) ;;; prelude-mode.el ends here From e7b42d1e5c8ef37390faabfc5706cd4b04aff425 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 28 Sep 2018 16:57:17 +0300 Subject: [PATCH 20/57] Replace Prelude's auto-save functionality with super-save Prelude's auto-save logic was extracted in the super-save packaged and polished a bit there. --- core/prelude-editor.el | 29 ++--------------------------- core/prelude-packages.el | 1 + 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/core/prelude-editor.el b/core/prelude-editor.el index 95d3906a08..bc003160b5 100644 --- a/core/prelude-editor.el +++ b/core/prelude-editor.el @@ -149,33 +149,8 @@ ;; automatically save buffers associated with files on buffer switch ;; and on windows switch -(defun prelude-auto-save-command () - "Save the current buffer if `prelude-auto-save' is not nil." - (when (and prelude-auto-save - buffer-file-name - (buffer-modified-p (current-buffer)) - (file-writable-p buffer-file-name)) - (save-buffer))) - -(defmacro advise-commands (advice-name commands class &rest body) - "Apply advice named ADVICE-NAME to multiple COMMANDS. - -The body of the advice is in BODY." - `(progn - ,@(mapcar (lambda (command) - `(defadvice ,command (,class ,(intern (concat (symbol-name command) "-" advice-name)) activate) - ,@body)) - commands))) - -;; advise all window switching functions -(advise-commands "auto-save" - (switch-to-buffer other-window windmove-up windmove-down windmove-left windmove-right) - before - (prelude-auto-save-command)) - -(add-hook 'mouse-leave-buffer-hook 'prelude-auto-save-command) - -(add-hook 'focus-out-hook 'prelude-auto-save-command) +(require 'super-save) +(super-save-mode +1) (defadvice set-buffer-major-mode (after set-major-mode activate compile) "Set buffer major mode according to `auto-mode-alist'." diff --git a/core/prelude-packages.el b/core/prelude-packages.el index fdf70c5615..da493703e5 100644 --- a/core/prelude-packages.el +++ b/core/prelude-packages.el @@ -80,6 +80,7 @@ operate-on-number smartparens smartrep + super-save undo-tree volatile-highlights which-key From c139f01f9bd0d5f7cf0247a8b4ccbd253c635be8 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 28 Sep 2018 17:34:53 +0300 Subject: [PATCH 21/57] [Fix #1193] Fix Prelude's menu definition --- core/prelude-mode.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/prelude-mode.el b/core/prelude-mode.el index 5c4b3aa2ae..719269ad15 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -111,8 +111,7 @@ ("General" ["Visit term buffer" crux-visit-term-buffer] ["Search in Google" prelude-google] - ["View URL" crux-view-url])) - "Search Files (Grep)...") + ["View URL" crux-view-url]))) map) "Keymap for Prelude mode.") From 6811b60486b8e3e0337361b1cac8a048abdc153d Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 28 Sep 2018 18:41:39 +0300 Subject: [PATCH 22/57] [Fix #1194] Restore the advise-commands macro I didn't notice that it had other usages in the code when I deleted it in the commit introducing super-save. --- core/prelude-editor.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/prelude-editor.el b/core/prelude-editor.el index bc003160b5..b685d1056e 100644 --- a/core/prelude-editor.el +++ b/core/prelude-editor.el @@ -290,6 +290,16 @@ (if (<= (- end beg) prelude-yank-indent-threshold) (indent-region beg end nil))) +(defmacro advise-commands (advice-name commands class &rest body) + "Apply advice named ADVICE-NAME to multiple COMMANDS. + +The body of the advice is in BODY." + `(progn + ,@(mapcar (lambda (command) + `(defadvice ,command (,class ,(intern (concat (symbol-name command) "-" advice-name)) activate) + ,@body)) + commands))) + (advise-commands "indent" (yank yank-pop) after "If current mode is one of `prelude-yank-indent-modes', indent yanked text (with prefix arg don't indent)." From e14ec16e993027c895b429f028a943235b8e8b13 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 29 Sep 2018 11:27:37 +0300 Subject: [PATCH 23/57] [Fix #771] Don't auto-start SLIME in Common Lisp source files --- modules/prelude-common-lisp.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/prelude-common-lisp.el b/modules/prelude-common-lisp.el index f69b546495..af0812cfae 100644 --- a/modules/prelude-common-lisp.el +++ b/modules/prelude-common-lisp.el @@ -75,8 +75,7 @@ (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol slime-fuzzy-completion-in-place t slime-enable-evaluate-in-emacs t - slime-autodoc-use-multiline-p t - slime-auto-start 'always) + slime-autodoc-use-multiline-p t) (define-key slime-mode-map (kbd "C-c C-s") 'slime-selector)) (provide 'prelude-common-lisp) From fc908101cc3517e536b623f222c107dc7e35cb5b Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 29 Sep 2018 11:28:58 +0300 Subject: [PATCH 24/57] Fix some indentation --- modules/prelude-common-lisp.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/prelude-common-lisp.el b/modules/prelude-common-lisp.el index af0812cfae..66b949a591 100644 --- a/modules/prelude-common-lisp.el +++ b/modules/prelude-common-lisp.el @@ -73,9 +73,9 @@ (with-eval-after-load "slime" (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol - slime-fuzzy-completion-in-place t - slime-enable-evaluate-in-emacs t - slime-autodoc-use-multiline-p t) + slime-fuzzy-completion-in-place t + slime-enable-evaluate-in-emacs t + slime-autodoc-use-multiline-p t) (define-key slime-mode-map (kbd "C-c C-s") 'slime-selector)) (provide 'prelude-common-lisp) From 78ba4bebe26b4d8645f8385af1f7f03108e0dd55 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 29 Sep 2018 11:31:50 +0300 Subject: [PATCH 25/57] Clean up a bit the Common Lisp module --- modules/prelude-common-lisp.el | 56 ++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/modules/prelude-common-lisp.el b/modules/prelude-common-lisp.el index 66b949a591..187bb3dae3 100644 --- a/modules/prelude-common-lisp.el +++ b/modules/prelude-common-lisp.el @@ -42,40 +42,42 @@ ;; Open files with .cl extension in lisp-mode (add-to-list 'auto-mode-alist '("\\.cl\\'" . lisp-mode)) -;; a list of alternative Common Lisp implementations that can be -;; used with SLIME. Note that their presence render -;; inferior-lisp-program useless. This variable holds a list of -;; programs and if you invoke SLIME with a negative prefix -;; argument, M-- M-x slime, you can select a program from that list. -(setq slime-lisp-implementations - '((ccl ("ccl")) - (clisp ("clisp" "-q")) - (cmucl ("cmucl" "-quiet")) - (sbcl ("sbcl" "--noinform") :coding-system utf-8-unix))) - -;; select the default value from slime-lisp-implementations -(if (and (eq system-type 'darwin) - (executable-find "ccl")) - ;; default to Clozure CL on macOS - (setq slime-default-lisp 'ccl) - ;; default to SBCL on Linux and Windows - (setq slime-default-lisp 'sbcl)) - -;; Add fancy slime contribs -(setq slime-contribs '(slime-fancy slime-cl-indent)) - (add-hook 'lisp-mode-hook (lambda () (run-hooks 'prelude-lisp-coding-hook))) -;; rainbow-delimeters messes up colors in slime-repl, and doesn't seem to work -;; anyway, so we won't use prelude-lisp-coding-defaults. -(add-hook 'slime-repl-mode-hook (lambda () - (smartparens-strict-mode +1) - (whitespace-mode -1))) (with-eval-after-load "slime" + ;; a list of alternative Common Lisp implementations that can be + ;; used with SLIME. Note that their presence render + ;; inferior-lisp-program useless. This variable holds a list of + ;; programs and if you invoke SLIME with a negative prefix + ;; argument, M-- M-x slime, you can select a program from that list. + (setq slime-lisp-implementations + '((ccl ("ccl")) + (clisp ("clisp" "-q")) + (cmucl ("cmucl" "-quiet")) + (sbcl ("sbcl" "--noinform") :coding-system utf-8-unix))) + + ;; select the default value from slime-lisp-implementations + (if (and (eq system-type 'darwin) + (executable-find "ccl")) + ;; default to Clozure CL on macOS + (setq slime-default-lisp 'ccl) + ;; default to SBCL on Linux and Windows + (setq slime-default-lisp 'sbcl)) + + ;; Add fancy slime contribs + (setq slime-contribs '(slime-fancy slime-cl-indent)) + (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol slime-fuzzy-completion-in-place t slime-enable-evaluate-in-emacs t slime-autodoc-use-multiline-p t) + + ;; rainbow-delimeters messes up colors in slime-repl, and doesn't seem to work + ;; anyway, so we won't use prelude-lisp-coding-defaults. + (add-hook 'slime-repl-mode-hook (lambda () + (smartparens-strict-mode +1) + (whitespace-mode -1))) + (define-key slime-mode-map (kbd "C-c C-s") 'slime-selector)) (provide 'prelude-common-lisp) From 10956aca3b0e4f985b14e75246221430d4eac862 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 29 Sep 2018 11:41:23 +0300 Subject: [PATCH 26/57] Teach super-save about ace-window --- core/prelude-editor.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/prelude-editor.el b/core/prelude-editor.el index b685d1056e..d443a785e7 100644 --- a/core/prelude-editor.el +++ b/core/prelude-editor.el @@ -150,6 +150,8 @@ ;; automatically save buffers associated with files on buffer switch ;; and on windows switch (require 'super-save) +;; add integration with ace-window +(add-to-list 'super-save-triggers 'ace-window) (super-save-mode +1) (defadvice set-buffer-major-mode (after set-major-mode activate compile) From dc002425a20852fd8783ede078f34e51dbc61c29 Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Mon, 1 Oct 2018 13:05:20 +1300 Subject: [PATCH 27/57] Note that emacs-mac already remaps Command to Meta --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9ec0342c7..64e049fe1b 100644 --- a/README.md +++ b/README.md @@ -366,7 +366,7 @@ If you want to swap them add this to your personal config: (setq mac-option-modifier 'super) ``` -You can also temporarily swap them with `C-c w` (`M-x prelude-swap-meta-and-super`). +You can also temporarily swap them with `C-c w` (`M-x prelude-swap-meta-and-super`). Note that some emacs distributions (like [emacs-mac](https://bitbucket.org/mituharu/emacs-mac.git) come with `Command` [set](https://bitbucket.org/mituharu/emacs-mac/src/7fdbfba85d543f01b81e997e2b03788c35cb3bfa/src/macterm.c?at=master&fileviewer=file-view-default#macterm.c-6147:6169) to `Meta`. **Note**: I'd highly recommend to all macOS users to consider [remapping Return to From d5c1d2bc3ed42fec4f92c962cc58346b291121d3 Mon Sep 17 00:00:00 2001 From: Jean Rigotti Date: Wed, 17 Oct 2018 11:23:27 +0200 Subject: [PATCH 28/57] Fix solarized url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 64e049fe1b..28eff1749f 100644 --- a/README.md +++ b/README.md @@ -529,7 +529,7 @@ Or you can use another theme altogether by adding something in `personal/preload (setq prelude-theme 'tango) ``` -**Note** To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/zenburn-emacs), +**Note** To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/solarized-emacs), you'll have to install it from MELPA first by `M-x package-install RET solarized-theme`. Then add ``` lisp From 2e6721afc4c17cea957c83041dd0688be3fbb6d2 Mon Sep 17 00:00:00 2001 From: Hitesh Jasani Date: Thu, 18 Oct 2018 12:01:00 -0400 Subject: [PATCH 29/57] [Fix #596] Improve personal config instructions (#1202) --- README.md | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 28eff1749f..7c3cc1d448 100644 --- a/README.md +++ b/README.md @@ -359,7 +359,7 @@ For subsequent operations, only the appropriate operations (i.e. `+`, `-`, `*`, Prelude does not mess by default with the standard mapping of `Command` (to `Super`) and `Option` (to `Meta`). -If you want to swap them add this to your personal config: +If you want to swap them add this to your [personal config](#personalizing): ```lisp (setq mac-command-modifier 'meta) @@ -516,8 +516,8 @@ for the eyes, that's why I took that "controversial" decision to replace it. You can, of course, easily go back to the default (or select another theme entirely). -To disable Zenburn just put in your personal config the following -line: +To disable Zenburn just put in your [personal config](#personalizing) +the following line: ```lisp (disable-theme 'zenburn) @@ -546,6 +546,31 @@ Finally, if you don't want any theme at all, you can add this to your ### Personalizing +All files you create under the `personal/` directory are yours for +personalization. There is no single special personal config file -- +any files you create in the `personal/` directory will be loaded in +lexicographical order. The overall loading precedence is: + +1. `personal/preload/*` +2. `core/` +3. `prelude-modules.el` +4. `personal/*` + +#### Personalization Example + +Suppose you want to configure go-mode to autoformat on each save. You +can create a file in `personal/`, let's call this one +`config-go-mode.el` and add the following to it. + +``` emacs-lisp +(add-hook 'go-mode-hook + (lambda () + (add-hook 'before-save-hook 'gofmt-before-save) + (setq tab-width 2))) +``` + +#### Tips + **Fork** (instead of cloning) the official Prelude repo and add your own touch to it. You're advised to **avoid changing stuff outside of the personal folder** to avoid having to deal with git merge conflicts @@ -655,14 +680,14 @@ way to use Emacs is by using it the way it was intended to be used (as far as navigation is concerned at least). If you'd like to be take this a step further and disable the arrow key navigation -completely put this in your personal config: +completely put this in your [personal config](#personalizing): ```lisp (setq guru-warn-only nil) ``` To disable `guru-mode` completely add the following snippet to your -personal Emacs config: +[personal config](#personalizing): ```lisp (setq prelude-guru nil) @@ -672,7 +697,7 @@ personal Emacs config: Prelude overrides `C-a` to behave as described [here](http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/). If -you don't like that simply add this to your personal config: +you don't like that simply add this to your [personal config](#personalizing): ```lisp (global-set-key [remap move-beginning-of-line] From d798ba4dc707c004d3b4f94e58656aa7b74e2e82 Mon Sep 17 00:00:00 2001 From: Stanislav Arnaudov Date: Tue, 23 Oct 2018 00:19:31 +0200 Subject: [PATCH 30/57] [Fix #1171] Add gnu/linux specific module and exec-path-from-shell support on linux (#1203) --- core/prelude-linux.el | 43 +++++++++++++++++++++++++++++++++++++++++++ init.el | 4 ++++ 2 files changed, 47 insertions(+) create mode 100644 core/prelude-linux.el diff --git a/core/prelude-linux.el b/core/prelude-linux.el new file mode 100644 index 0000000000..938863109b --- /dev/null +++ b/core/prelude-linux.el @@ -0,0 +1,43 @@ +;;; prelude-linux.el --- Emacs Prelude: linux specific settings. +;; +;; Copyright © 2011-2018 Bozhidar Batsov +;; +;; Author: Stanislav Arnaudov +;; URL: https://github.com/bbatsov/prelude +;; Version: 1.0.0 +;; Keywords: convenience + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Some Linux specific stuff. + +;;; License: + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 3 +;; of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +;; On Linux Emacs doesn't use the shell PATH if it's not started from +;; the shell. Let's fix that: +(prelude-require-packages '(exec-path-from-shell)) + +(require 'exec-path-from-shell) +(exec-path-from-shell-initialize) + +(provide 'prelude-linux) +;;; prelude-linux.el ends here diff --git a/init.el b/init.el index 87d94195a9..94a6bb5e48 100644 --- a/init.el +++ b/init.el @@ -117,6 +117,10 @@ by Prelude.") (when (eq system-type 'darwin) (require 'prelude-macos)) +;; Linux specific settings +(when (eq system-type 'gnu/linux) + (require 'prelude-linux)) + (message "Loading Prelude's modules...") ;; the modules From 454fade72487f4e47de04a13c127a6a968469380 Mon Sep 17 00:00:00 2001 From: Andrei Beliankou Date: Tue, 20 Nov 2018 22:39:57 +0100 Subject: [PATCH 31/57] Move `prelude-modules.el` under `personal` directory Prelude modules are required by the definition file `prelude-modules.el`. This file should be part of personal configuration. Therefore: - implemented loading of `personal/prelude-modules.el` in favour of loading `prelude-modules.el`; - added a check for presence of both old and new files; - adjusted documentation; - adjusted the installer. Closes #1206. --- .gitignore | 1 - README.md | 11 ++++++----- init.el | 26 ++++++++++++++++++++------ utils/installer.sh | 4 ++-- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index d3f86eacb1..ccabbed1be 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ custom.el places .smex-items savefile/ -/prelude-modules.el projectile-bookmarks.eld session* .cask diff --git a/README.md b/README.md index 7c3cc1d448..e5fa8b298e 100644 --- a/README.md +++ b/README.md @@ -104,8 +104,9 @@ Note that the installer will back up any existing `.emacs` file or you're doing a manual install make sure you don't have a `.emacs` file or back up your existing `.emacs.d` directory manually. -Don't forget to adjust your `prelude-modules.el` file once the installation is done. -By default most of the modules that ship with Prelude are not loaded. +Don't forget to adjust your `prelude-modules.el` file in your personal directory +once the installation is done. By default most of the modules +that ship with Prelude are not loaded. ## Installing Emacs @@ -222,8 +223,8 @@ By default most of the modules that ship with Prelude are not loaded. For more i You'll need to adjust your `prelude-modules.el` file once the installation is done. If you are doing a manual install then you first need to copy the `prelude-modules.el` available in the sample -directory to the root of `path/to/prelude/installation` and then -adjust that one. +directory to the `personal` directory under `path/to/prelude/installation` +and then adjust that one. After you've uncommented a module you should either restart Emacs or evaluate the module `require` expression with C-x C-e. @@ -553,7 +554,7 @@ lexicographical order. The overall loading precedence is: 1. `personal/preload/*` 2. `core/` -3. `prelude-modules.el` +3. `personal/prelude-modules.el` (or deprecated `prelude-modules.el`) 4. `personal/*` #### Personalization Example diff --git a/init.el b/init.el index 94a6bb5e48..0e8638f169 100644 --- a/init.el +++ b/init.el @@ -69,8 +69,13 @@ by Prelude.") "This directory houses packages that are not yet available in ELPA (or MELPA).") (defvar prelude-savefile-dir (expand-file-name "savefile" prelude-dir) "This folder stores all the automatically generated save/history-files.") -(defvar prelude-modules-file (expand-file-name "prelude-modules.el" prelude-dir) - "This files contains a list of modules that will be loaded by Prelude.") +(defvar prelude-modules-file (expand-file-name "prelude-modules.el" prelude-personal-dir) + "This file contains a list of modules that will be loaded by Prelude.") +(defvar prelude-deprecated-modules-file + (expand-file-name "prelude-modules.el" prelude-dir) + (format "This file may contain a list of Prelude modules. + +This is DEPRECATED, use %s instead." prelude-modules-file)) (unless (file-exists-p prelude-savefile-dir) (make-directory prelude-savefile-dir)) @@ -125,9 +130,18 @@ by Prelude.") ;; the modules (if (file-exists-p prelude-modules-file) - (load prelude-modules-file) - (message "Missing modules file %s" prelude-modules-file) - (message "You can get started by copying the bundled example file from sample/prelude-modules.el")) + (progn + (load prelude-modules-file) + (if (file-exists-p prelude-deprecated-modules-file) + (message "Loading new modules configuration, ignoring DEPRECATED prelude-module.el"))) + (if (file-exists-p prelude-deprecated-modules-file) + (progn + (load prelude-deprecated-modules-file) + (message (format "The use of %s is DEPRECATED! Use %s instead!" + prelude-deprecated-modules-file + prelude-modules-file))) + (message "Missing modules file %s" prelude-modules-file) + (message "You can get started by copying the bundled example file from sample/prelude-modules.el"))) ;; config changes made through the customize UI will be stored here (setq custom-file (expand-file-name "custom.el" prelude-personal-dir)) @@ -135,7 +149,7 @@ by Prelude.") ;; load the personal settings (this includes `custom-file') (when (file-exists-p prelude-personal-dir) (message "Loading personal configuration files in %s..." prelude-personal-dir) - (mapc 'load (directory-files prelude-personal-dir 't "^[^#\.].*el$"))) + (mapc 'load (directory-files prelude-personal-dir 't "^[^#\.].*el$|^prelude-modules\.el$"))) (message "Prelude is ready to do thy bidding, Master %s!" current-user) diff --git a/utils/installer.sh b/utils/installer.sh index ed3c4e3042..df4c73430a 100755 --- a/utils/installer.sh +++ b/utils/installer.sh @@ -202,7 +202,7 @@ then make_prelude_dirs # Reinstate files that weren't replaced tar --skip-old-files -xf "$PRELUDE_INSTALL_DIR_ORIG.pre-prelude.tar" "$PRELUDE_INSTALL_DIR" > /dev/null 2>&1 - [ -n "$PRELUDE_INTO" ] && cp "$PRELUDE_INSTALL_DIR/sample/prelude-modules.el" "$PRELUDE_INSTALL_DIR" + [ -n "$PRELUDE_INTO" ] && cp "$PRELUDE_INSTALL_DIR/sample/prelude-modules.el" "$PRELUDE_INSTALL_DIR/personal" elif [ -e "$PRELUDE_INSTALL_DIR" ] then # File exist but not a regular file or directory @@ -215,7 +215,7 @@ else # Nothing yet so just install prelude install_prelude make_prelude_dirs - cp "$PRELUDE_INSTALL_DIR/sample/prelude-modules.el" "$PRELUDE_INSTALL_DIR" + cp "$PRELUDE_INSTALL_DIR/sample/prelude-modules.el" "$PRELUDE_INSTALL_DIR/personal" fi if [ -z "$PRELUDE_SKIP_BC" ]; From 3a11f84bf5e745dacefd0afa8fbfba4a5c866dd5 Mon Sep 17 00:00:00 2001 From: Ben Alex Date: Sun, 18 Nov 2018 14:34:50 +1100 Subject: [PATCH 32/57] Rust Language Server (RLS) support --- modules/prelude-lsp.el | 63 +++++++++++++++++++++++++++++++++++++++ modules/prelude-rust.el | 27 ++++++++++++----- sample/prelude-modules.el | 1 + 3 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 modules/prelude-lsp.el diff --git a/modules/prelude-lsp.el b/modules/prelude-lsp.el new file mode 100644 index 0000000000..ff84c5367d --- /dev/null +++ b/modules/prelude-lsp.el @@ -0,0 +1,63 @@ +;;; prelude-lsp.el --- lsp-mode setup +;; +;; Copyright © 2011-2018 Bozhidar Batsov +;; +;; Author: Bozhidar Batsov, Ben Alex +;; URL: https://github.com/bbatsov/prelude +;; Version: 1.0.0 +;; Keywords: convenience + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; lsp-mode config. + +;;; License: + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 3 +;; of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +(prelude-require-packages '(company-lsp + lsp-mode + lsp-ui)) + +(require 'lsp-ui) +(require 'company-lsp) +(require 'lsp-imenu) + +(push 'company-lsp company-backends) +(add-hook 'lsp-mode-hook 'lsp-ui-mode) +(add-hook 'lsp-after-open-hook 'lsp-enable-imenu) + +(define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) +(define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) +(define-key lsp-ui-mode-map (kbd "C-c C-l .") 'lsp-ui-peek-find-definitions) +(define-key lsp-ui-mode-map (kbd "C-c C-l ?") 'lsp-ui-peek-find-references) +(define-key lsp-ui-mode-map (kbd "C-c C-l r") 'lsp-rename) +(define-key lsp-ui-mode-map (kbd "C-c C-l x") 'lsp-restart-workspace) +(define-key lsp-ui-mode-map (kbd "C-c C-l w") 'lsp-ui-peek-find-workspace-symbol) +(define-key lsp-ui-mode-map (kbd "C-c C-l i") 'lsp-ui-peek-find-implementation) +(define-key lsp-ui-mode-map (kbd "C-c C-l d") 'lsp-describe-thing-at-point) + +(setq lsp-ui-sideline-enable t) +(setq lsp-ui-doc-enable t) +(setq lsp-ui-peek-enable t) +(setq lsp-ui-peek-always-show t) + +(provide 'prelude-lsp) +;;; prelude-lsp.el ends here diff --git a/modules/prelude-rust.el b/modules/prelude-rust.el index b8d5762c6b..b2d27db58b 100644 --- a/modules/prelude-rust.el +++ b/modules/prelude-rust.el @@ -1,6 +1,6 @@ ;;; prelude-rust.el --- Emacs Prelude: Rust programming support. ;; -;; Authors: Doug MacEachern, Manoel Vilela +;; Authors: Doug MacEachern, Manoel Vilela, Ben Alex ;; Version: 1.0.1 ;; Keywords: convenience rust @@ -36,23 +36,34 @@ ;; * cargo (Rust Package Manager) ;; * racer (Rust Completion Tool) ;; * rustfmt (Rust Tool for formatting code) +;; * rls (Rust Language Server, if the prelude-lsp feature is enabled) (prelude-require-packages '(rust-mode - racer - flycheck-rust cargo)) +(if (featurep 'prelude-lsp) + (prelude-require-package 'lsp-rust) + (prelude-require-packages '(racer + flycheck-rust))) + (setq rust-format-on-save t) +(setq lsp-rust-rls-command '("rustup" "run" "stable" "rls")) (with-eval-after-load 'rust-mode - (add-hook 'rust-mode-hook 'racer-mode) - (add-hook 'racer-mode-hook 'eldoc-mode) (add-hook 'rust-mode-hook 'cargo-minor-mode) - (add-hook 'rust-mode-hook 'flycheck-rust-setup) - (add-hook 'flycheck-mode-hook 'flycheck-rust-setup) + + (if (featurep 'prelude-lsp) + (progn (require 'lsp-rust) + (add-hook 'rust-mode-hook #'lsp-rust-enable)) + (add-hook 'rust-mode-hook 'racer-mode) + (add-hook 'racer-mode-hook 'eldoc-mode) + (add-hook 'rust-mode-hook 'flycheck-rust-setup) + (add-hook 'flycheck-mode-hook 'flycheck-rust-setup)) (defun prelude-rust-mode-defaults () - (local-set-key (kbd "C-c C-d") 'racer-describe) + (unless (featurep 'prelude-lsp) + (local-set-key (kbd "C-c C-d") 'racer-describe)) + ;; Prevent #! from chmodding rust files to be executable (remove-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) ;; CamelCase aware editing operations diff --git a/sample/prelude-modules.el b/sample/prelude-modules.el index 8e7a1320a1..806c116b5d 100644 --- a/sample/prelude-modules.el +++ b/sample/prelude-modules.el @@ -24,6 +24,7 @@ (require 'prelude-js) ;; (require 'prelude-latex) (require 'prelude-lisp) +(require 'prelude-lsp) ;; (require 'prelude-ocaml) (require 'prelude-org) ;; Org-mode helps you keep TODO lists, notes and more (require 'prelude-perl) From bb152ad383ad6556d4cac1128f4f0d8fb32d7baf Mon Sep 17 00:00:00 2001 From: Andrei Beliankou Date: Thu, 22 Nov 2018 16:53:52 +0100 Subject: [PATCH 33/57] [Fix #1208] Correct RegExp collisions while loading personal config. --- init.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/init.el b/init.el index 0e8638f169..a9d0788a6d 100644 --- a/init.el +++ b/init.el @@ -149,7 +149,9 @@ This is DEPRECATED, use %s instead." prelude-modules-file)) ;; load the personal settings (this includes `custom-file') (when (file-exists-p prelude-personal-dir) (message "Loading personal configuration files in %s..." prelude-personal-dir) - (mapc 'load (directory-files prelude-personal-dir 't "^[^#\.].*el$|^prelude-modules\.el$"))) + (mapc 'load (delete + prelude-modules-file + (directory-files prelude-personal-dir 't "^[^#\.].*\\.el$")))) (message "Prelude is ready to do thy bidding, Master %s!" current-user) From 9e410f5c6462a0da7a3a94a7d7898a2a3374ac82 Mon Sep 17 00:00:00 2001 From: Josh Comer Date: Sat, 15 Dec 2018 20:22:43 -0400 Subject: [PATCH 34/57] Update lsp-mode for package changes --- modules/prelude-lsp.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/prelude-lsp.el b/modules/prelude-lsp.el index ff84c5367d..be40e16b09 100644 --- a/modules/prelude-lsp.el +++ b/modules/prelude-lsp.el @@ -38,11 +38,11 @@ (require 'lsp-ui) (require 'company-lsp) -(require 'lsp-imenu) +(require 'lsp-ui-imenu) (push 'company-lsp company-backends) (add-hook 'lsp-mode-hook 'lsp-ui-mode) -(add-hook 'lsp-after-open-hook 'lsp-enable-imenu) +(add-hook 'lsp-after-open-hook 'lsp-ui-enable-imenu) (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) From 63c697c2f4ca3cc8b8329f70a3b6ed474db312d5 Mon Sep 17 00:00:00 2001 From: Josh Comer Date: Tue, 1 Jan 2019 07:30:20 -0400 Subject: [PATCH 35/57] Fix rust LSP * Removed lsp-rust (RLS is built into lsp-mode now) * Fixed setting up flycheck mode in rust mode * Fixed LSP initialization due to deprecation * LSP-mode now self configures company and ui-mode --- modules/prelude-lsp.el | 5 ----- modules/prelude-rust.el | 18 +++++++----------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/modules/prelude-lsp.el b/modules/prelude-lsp.el index be40e16b09..6c9b72312e 100644 --- a/modules/prelude-lsp.el +++ b/modules/prelude-lsp.el @@ -37,13 +37,8 @@ lsp-ui)) (require 'lsp-ui) -(require 'company-lsp) (require 'lsp-ui-imenu) -(push 'company-lsp company-backends) -(add-hook 'lsp-mode-hook 'lsp-ui-mode) -(add-hook 'lsp-after-open-hook 'lsp-ui-enable-imenu) - (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) (define-key lsp-ui-mode-map (kbd "C-c C-l .") 'lsp-ui-peek-find-definitions) diff --git a/modules/prelude-rust.el b/modules/prelude-rust.el index b2d27db58b..c72a73640d 100644 --- a/modules/prelude-rust.el +++ b/modules/prelude-rust.el @@ -39,26 +39,22 @@ ;; * rls (Rust Language Server, if the prelude-lsp feature is enabled) (prelude-require-packages '(rust-mode - cargo)) + cargo + flycheck-rust)) -(if (featurep 'prelude-lsp) - (prelude-require-package 'lsp-rust) - (prelude-require-packages '(racer - flycheck-rust))) +(unless (featurep 'prelude-lsp) + (prelude-require-packages '(racer))) (setq rust-format-on-save t) -(setq lsp-rust-rls-command '("rustup" "run" "stable" "rls")) (with-eval-after-load 'rust-mode (add-hook 'rust-mode-hook 'cargo-minor-mode) + (add-hook 'flycheck-mode-hook 'flycheck-rust-setup) (if (featurep 'prelude-lsp) - (progn (require 'lsp-rust) - (add-hook 'rust-mode-hook #'lsp-rust-enable)) + (add-hook 'rust-mode-hook 'lsp) (add-hook 'rust-mode-hook 'racer-mode) - (add-hook 'racer-mode-hook 'eldoc-mode) - (add-hook 'rust-mode-hook 'flycheck-rust-setup) - (add-hook 'flycheck-mode-hook 'flycheck-rust-setup)) + (add-hook 'racer-mode-hook 'eldoc-mode)) (defun prelude-rust-mode-defaults () (unless (featurep 'prelude-lsp) From 4490d51798892e6d0087a53398f3eb03f04111ad Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 14:31:52 +0200 Subject: [PATCH 36/57] Restructure the README into a manual --- README.md | 669 ------------------ {modules/doc => doc}/cheatsheet.png | Bin doc/configuration.md | 125 ++++ doc/contributing.md | 58 ++ doc/css/extra.css | 15 + doc/faq.md | 3 + doc/index.md | 18 + doc/installation.md | 122 ++++ .../doc/prelude-erc.md => doc/modules/erc.md | 22 +- modules/doc/README.md => doc/modules/index.md | 6 +- .../modules/python.md | 2 +- {modules/doc => doc}/prelude-cheatsheet.pdf | Bin {modules/doc => doc}/prelude-cheatsheet.tex | 0 doc/support.md | 33 + doc/troubleshooting.md | 103 +++ doc/usage.md | 275 +++++++ mkdocs.yml | 22 + 17 files changed, 789 insertions(+), 684 deletions(-) rename {modules/doc => doc}/cheatsheet.png (100%) create mode 100644 doc/configuration.md create mode 100644 doc/contributing.md create mode 100644 doc/css/extra.css create mode 100644 doc/faq.md create mode 100644 doc/index.md create mode 100644 doc/installation.md rename modules/doc/prelude-erc.md => doc/modules/erc.md (80%) rename modules/doc/README.md => doc/modules/index.md (83%) rename modules/doc/prelude-python.md => doc/modules/python.md (96%) rename {modules/doc => doc}/prelude-cheatsheet.pdf (100%) rename {modules/doc => doc}/prelude-cheatsheet.tex (100%) create mode 100644 doc/support.md create mode 100644 doc/troubleshooting.md create mode 100644 doc/usage.md create mode 100644 mkdocs.yml diff --git a/README.md b/README.md index e5fa8b298e..92e5365d1b 100644 --- a/README.md +++ b/README.md @@ -25,52 +25,6 @@ You can support the development of Prelude via [![Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/bbatsov/donate) [![Patreon](https://img.shields.io/badge/patreon-donate-orange.svg)](https://www.patreon.com/bbatsov) -**Table of Contents** - -- [Fast Forward](#fast-forward) -- [Installing Emacs](#installing-emacs) -- [Installation](#installation) - - [Automated](#automated) - - [Via Curl](#via-curl) - - [Via Wget](#via-wget) - - [Manual](#manual) -- [Updating Prelude](#updating-prelude) - - [Manual update](#manual-update) - - [Update all bundled packages](#update-all-bundled-packages) - - [Update Prelude's code](#update-preludes-code) - - [Restart Prelude](#restart-prelude) - - [Automatic update](#automatic-update) -- [Enabling additional modules](#enabling-additional-modules) -- [Running](#running) -- [Getting to know Prelude](#getting-to-know-prelude) - - [Keymap](#keymap) - - [Global](#global) - - [Prelude Mode](#prelude-mode) - - [macOS modifier keys](#macos-modifier-keys) - - [Projectile](#projectile) - - [Helm](#helm) - - [Key-chords](#key-chords) - - [Disabling key-chords](#disabling-key-chords) - - [Cheatsheet](#cheatsheet) -- [Automatic package installation](#automatic-package-installation) - - [Color Themes](#color-themes) - - [Personalizing](#personalizing) - - [Disabling whitespace-mode](#disabling-whitespace-mode) - - [Disable flyspell-mode](#disable-flyspell-mode) -- [Caveats & Pitfalls](#caveats--pitfalls) - - [Updating bundled packages](#updating-bundled-packages) - - [Problems with flyspell-mode](#problems-with-flyspell-mode) - - [Ugly colors in the terminal Emacs version](#ugly-colors-in-the-terminal-emacs-version) - - [MELPA error on initial startup](#melpa-error-on-initial-startup) - - [Warnings on arrow navigation in editor buffers](#warnings-on-arrow-navigation-in-editor-buffers) - - [Customized C-a behavior](#customized-c-a-behavior) - - [Poor ido matching performance on large datasets](#poor-ido-matching-performance-on-large-datasets) - - [Windows compatibility](#windows-compatibility) -- [Known issues](#known-issues) -- [Support](#support) -- [Contributors](#contributors) -- [Bugs & Improvements](#bugs--improvements) - ## Fast Forward Assuming you're using an Unix-like OS (`*BSD`, `GNU/Linux`, `macOS`, `Solaris`, @@ -108,629 +62,6 @@ Don't forget to adjust your `prelude-modules.el` file in your personal directory once the installation is done. By default most of the modules that ship with Prelude are not loaded. -## Installing Emacs - -Obviously to use the Emacs Prelude you have to install Emacs -first. Have a look at -the -[WikEmacs articles on installing Emacs](http://wikemacs.org/index.php/Installing_Emacs). - -## Installation - -### Automated - -You can install **Emacs Prelude** via the command line with either `curl` or -`wget`. Naturally `git` is also required. - -#### Via Curl - -If you're using `curl` type the following command: - -```bash -curl -L https://github.com/bbatsov/prelude/raw/master/utils/installer.sh | sh -``` - -#### Via Wget - -If you're using `wget` type: - -```bash -wget --no-check-certificate https://github.com/bbatsov/prelude/raw/master/utils/installer.sh -O - | sh -``` - -### Manual - -Make sure you do not have any `~/.emacs` file present. - -```bash -git clone git://github.com/bbatsov/prelude.git path/to/local/repo -ln -s path/to/local/repo ~/.emacs.d -cd ~/.emacs.d -``` - -If you are using Windows, you should check what Emacs thinks the `~` directory is by running Emacs and typing `C-x d ~/`, and then adjust the command appropriately. - -## Updating Prelude - -### Manual update - -The update procedure is fairly straightforward and consists of 3 steps: - -#### Update all bundled packages - -Just run M-x package-list-packages RET U x. - -#### Update Prelude's code - -```bash -cd path/to/prelude/installation -git pull -``` - -The `path/to/prelude/installation` is usually `~/.emacs.d` (at least -on Unix systems). - -#### Restart Prelude - -It's generally a good idea to stop Emacs after you do the update. The -next time Prelude starts it will install any new dependencies (if -there are such). - -### Automatic update - -Simply run M-x prelude-update from Emacs itself and restart Emacs afterwards. - -## Pinning packages - -By default, Prelude will install packages from the melpa and gnu package -repositories. Occasionally package integration can break when upgrading packages. -This can be avoided by pinning packages to stable versions in other repositories. -To do so, copy `prelude-pinned-packages.el` from the sample directory to -Prelude's root directory and adjust the [variables](https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Installation.html) -inside accordingly. - -## Enabling additional modules - -By default most of the modules that ship with Prelude are not loaded. For more information on the functionality provided by these modules visit the [docs](modules/doc/README.md). - -```lisp -;;; Uncomment the modules you'd like to use and restart Prelude afterwards - -(require 'prelude-c) -;; (require 'prelude-clojure) -;; (require 'prelude-coffee) -;; (require 'prelude-common-lisp) -;; (require 'prelude-css) -(require 'prelude-emacs-lisp) -(require 'prelude-erc) -;; (require 'prelude-erlang) -;; (require 'prelude-elixir) -;; (require 'prelude-haskell) -(require 'prelude-js) -;; (require 'prelude-latex) -(require 'prelude-lisp) -(require 'prelude-org) -(require 'prelude-perl) -;; (require 'prelude-python) -;; (require 'prelude-ruby) -;; (require 'prelude-scala) -(require 'prelude-scheme) -;; (require 'prelude-scss) -;; (require 'prelude-web) -(require 'prelude-xml) -``` - -You'll need to adjust your `prelude-modules.el` file once the -installation is done. If you are doing a manual install then you first -need to copy the `prelude-modules.el` available in the sample -directory to the `personal` directory under `path/to/prelude/installation` -and then adjust that one. - -After you've uncommented a module you should either restart Emacs or evaluate the module -`require` expression with C-x C-e. - -## Running - -Nothing fancy here. Just start Emacs as usual. Personally I run Emacs -in daemon mode: - -```bash -emacs --daemon -``` - -Afterwards I connect to the server with either a terminal or a GUI -client like this: - -```bash -emacsclient -t -emacsclient -c -``` - -You'd probably do well to put a few aliases in your `.zshrc` (or -`.bashrc`): - -```bash -alias e='emacsclient -t' -alias ec='emacsclient -c' -alias vim='emacsclient -t' -alias vi='emacsclient -t' -``` - -The last two aliases are helpful if you're used to editing files from -the command line using `vi(m)`. - -You can also open a file with the cursor positioned directly on a specific line: - -```bash -emacsclient somefile:1234 -``` - -This will open file 'somefile' and set cursor on line 1234. - -## Getting to know Prelude - -Certainly the best way to understand how Prelude enhances the default -Emacs experience is to peruse Prelude's source code (which is -obviously written in Emacs Lisp). Understanding the code is not -necessary of course. Prelude includes a `prelude-mode` minor Emacs mode -which collects some of the additional functionality added by -Prelude. It also adds an additional keymap that binds many of those -extensions to keybindings. - -### Keymap - -#### Global - -Keybinding | Description --------------------|------------------------------------------------------------ -C-x \\ | `align-regexp` -C-+ | Increase font size(`text-scale-increase`). -C-- | Decrease font size(`text-scale-decrease`). -C-x O | Go back to previous window (the inverse of `other-window` (`C-x o`)). -C-^ | Join two lines into one(`crux-top-join-line`). -C-x p | Start `proced` (manage processes from Emacs; works only in Linux). -C-x m | Start `eshell`. -C-x M-m | Start your default shell. -C-x C-m | Alias for `M-x`. -M-X | Like `M-x` but limited to commands that are relevant to the active major mode. -C-h A | Run `apropos` (search in all Emacs symbols). -C-h C-m | Display key bindings of current major mode and descriptions of every binding. -M-/ | Run `hippie-expand` (a replacement for the default `dabbrev-expand`). -C-x C-b | Open `ibuffer` (a replacement for the default `buffer-list`). -F11 | Make the window full screen. -F12 | Toggle the Emacs menu bar. -C-x g | Open Magit's status buffer. -C-x M-g | Open Magit's popup of popups. -M-Z | Zap up to char. -C-= | Run `expand-region` (incremental text selection). -C-a | Run `crux-move-beginning-of-line`. Read [this](http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/) for details. - -#### Prelude Mode - -Keybinding | Description --------------------|------------------------------------------------------------ -C-c o | Open the currently visited file with an external program. -C-c i | Search for a symbol, only for buffers that contain code -C-c g | Search in Google for the thing under point (or an interactive query). -C-c G | Search in GitHub for the thing under point (or an interactive query). -C-c y | Search in YouTube for the thing under point (or an interactive query). -C-c U | Search in Duckduckgo for the thing under point (or an interactive query). -C-S-RET or Super-o | Insert an empty line above the current line and indent it properly. -S-RET or M-o | Insert an empty line and indent it properly (as in most IDEs). -C-S-up or M-S-up | Move the current line or region up. -C-S-down or M-S-down| Move the current line or region down. -C-c n | Fix indentation in buffer and strip whitespace. -C-c f | Open recently visited file. -C-M-\\ | Indent region (if selected) or the entire buffer. -C-c u | Open a new buffer containing the contents of URL. -C-c e | Eval a bit of Emacs Lisp code and replace it with its result. -C-c s | Swap two active windows. -C-c D | Delete current file and buffer. -C-c d | Duplicate the current line (or region). -C-c M-d | Duplicate and comment the current line (or region). -C-c r | Rename the current buffer and its visiting file if any. -C-c t | Open a terminal emulator (`ansi-term`). -C-c k | Kill all open buffers except the one you're currently in. -C-c TAB | Indent and copy region to clipboard -C-c I | Open user's init file. -C-c S | Open shell's init file. -C-c . + | Increment integer at point. Default is +1. -C-c . - | Decrement integer at point. Default is -1. -C-c . * | Multiply integer at point. Default is *2. -C-c . / | Divide integer at point. Default is /2. -C-c . \\ | Modulo integer at point. Default is modulo 2. -C-c . ^ | Power to the integer at point. Default is ^2. -C-c . < | Left-shift integer at point. Default is 1 position to the left. -C-c . > | Right-shift integer at point. Default is 1 position to the right. -C-c . # | Convert integer at point to specified base. Default is 10. -C-c . % | Replace integer at point with another specified integer. -C-c . ' | Perform arithmetic operations on integer at point. User specifies the operator. -Super-r | Recent files -Super-j | Join lines -Super-k | Kill whole line -Super-m m | Magit status -Super-m l | Magit log -Super-m f | Magit file log -Super-m b | Magit blame mode - -**Note**: For various arithmetic operations, the prefix `C-c .` only needs to be pressed once for the first operation. -For subsequent operations, only the appropriate operations (i.e. `+`, `-`, `*`, `/`... needs to be pressed). - -#### macOS modifier keys - -Prelude does not mess by default with the standard mapping of `Command` (to `Super`) and `Option` (to `Meta`). - -If you want to swap them add this to your [personal config](#personalizing): - -```lisp -(setq mac-command-modifier 'meta) -(setq mac-option-modifier 'super) -``` - -You can also temporarily swap them with `C-c w` (`M-x prelude-swap-meta-and-super`). Note that some emacs distributions (like [emacs-mac](https://bitbucket.org/mituharu/emacs-mac.git) come with `Command` [set](https://bitbucket.org/mituharu/emacs-mac/src/7fdbfba85d543f01b81e997e2b03788c35cb3bfa/src/macterm.c?at=master&fileviewer=file-view-default#macterm.c-6147:6169) to `Meta`. - -**Note**: I'd highly recommend to all macOS users to consider -[remapping Return to -Control](http://emacsredux.com/blog/2013/11/12/a-crazy-productivity-boost-remap-return-to-control/) -instead. That's an epic productivity boost and it's not as crazy as it sounds! - -#### Projectile - -[Projectile](https://github.com/bbatsov/projectile) is one of the essential packages bundled with Prelude. -It provides an easy way to navigate and switch projects. Take a look at its extensive documentation -to get a feel for everything you can do with Projectile. - -Prelude adds an extra keymap prefix `s-p` (`s` stands for -`Super`) in addition to the standard one `C-c p`. By default on Windows keyboard -`Super` is mapped to the `Windows` key and on macOS keyboards `Super` is mapped -to the `Command` key. - -If you ever forget any of Projectile's keybindings just do a: - -C-c p C-h or s-p C-h - -Alternatively you can just press s-p and wait for a moment -for `which-key` to kick in and show you the available keybindings. - -#### Helm - -Helm is setup according to this guide: [A Package in a league of its own: Helm](http://tuhdo.github.io/helm-intro.html). - -You can learn Helm usage and key bindings following the guide. C-c h is Prelude's default prefix key for Helm. -If you don't remember any key binding, append C-h after C-c h for a list of key bindings in Helm. - -If you love Helm and want to use Helm globally with enhanced `helm-find-files`, `helm-buffer-lists`..., you will have to also add `(require 'prelude-helm-everywhere)`. -When `prelude-helm-everywhere` is activated, Helm enables these global key bindings: - -Key binding | Description --------------------|---------------------------------------------- -M-x | Run [helm-M-x](http://tuhdo.github.io/helm-intro.html#sec-3), an interactive version of M-x. -M-y | Run [helm-show-kill-ring](http://tuhdo.github.io/helm-intro.html#sec-4), shows the content of `kill-ring`. -C-x b | Run [helm-mini](http://tuhdo.github.io/helm-intro.html#sec-5), an interactive version of `C-x b` with more features. -C-x C-f | Run [helm-find-files](http://tuhdo.github.io/helm-intro.html#sec-6), an interactive version of `find-file` with more features. -C-h f | Run [helm-apropos](http://tuhdo.github.io/helm-intro.html#sec-13), an interactive version of `apropos-command`. -C-h r | Run [helm-info-emacs](http://tuhdo.github.io/helm-intro.html#sec-14), an interactive version of `info-emacs-manual`. -C-h C-l | Run `helm-locate-library` that can search for locations of any file loaded into Emacs. - -This key binding is activated in `shell-mode`: - -Key Binding | Description --------------------|---------------------------------------------- -C-c C-l | Run `helm-comint-input-ring` that shows `shell` history using Helm interface. - -This key bindings is activated in `eshell-mode`: - -Key Binding | Description --------------------|---------------------------------------------- -C-c C-l | Run `helm-eshell-history` that shows `eshell` history using Helm interface. - -If you prefer Ido in everywhere, you should not add `prelude-helm-everywhere`, so you can use Helm along with Ido and Prelude's default commands. - -You can always reactivate Helm with `(prelude-global-helm-global-mode-on)`. - -**NOTICE**: In `helm-M-x`, you have to pass prefix argument *AFTER* you run `helm-M-x`, -because your prefix argument will be displayed in the modeline when in `helm-M-x` -buffer. Passing prefix argument **BEFORE** =helm-M-x= **has no effect**. - - -#### Key-chords - -**Key-chords are available only when the `prelude-key-chord` module has been enabled.** - -Keybinding | Description --------------------|---------------------------------------------- -jj | Jump to the beginning of a word(`avy-goto-word-1`) -jk | Jump to a character(`avy-goto-char`) -jl | Jump to the beginning of a line(`avy-goto-line`) -JJ | Jump back to previous buffer(`crux-switch-to-previous-buffer`) -uu | View edits as a tree(`undo-tree-visualize`) -xx | Executed extended command(`execute-extended-command`) -yy | Browse the kill ring(`browse-kill-ring`) - -##### Disabling key-chords - -In some cases you may not want to have a key-chord that is defined by prelude, -in which case you can disable the binding in your `personal.el` file by setting -its command to `nil`. For example, to disable the `jj` key-chord add the -following line: - -```lisp -(key-chord-define-global "jj" nil) -``` - -If you're an `evil-mode` user you'll probably do well to disable `key-chord-mode` altogether: - -```lisp -(key-chord-mode -1) -``` - -#### vim emulation - -If you want to use vim keybindings inside of Emacs enable the `prelude-evil` module which provides -support for `evil-mode`. - -### Cheatsheet - -Use `C-h k ` (`` are the ones listed on the left) or `C-h f ` (`` are the ones listed on the right) to see the detailed explanation. - -![cheatsheet](/modules/doc/cheatsheet.png) - -#### PDF generation - -Install [LaTeX](https://www.latex-project.org/get/) - -``` bash -cd modules/doc -pdflatex prelude-cheatsheet.tex -``` - -#### PNG generation - -Install [Poppler](https://poppler.freedesktop.org/) - -``` bash -cd modules/doc -pdftocairo -png -singlefile prelude-cheatsheet.pdf cheatsheet -``` - -## Automatic package installation - -The default Prelude installation comes with a bare minimum of -functionality. It will however install add-ons for various programming -languages and frameworks on demand. For instance - if you try to open -a `.clj` file `clojure-mode`, `cider` and Prelude's enhanced Lisp -configuration will be installed automatically for you. - -You can, of course, install anything you wish manually as well. - -### Color Themes - -Emacs provides a dozen of -built-in themes you can use out-of-the-box by invoking the `M-x -load-theme` command. - -[Zenburn](https://github.com/bbatsov/zenburn-emacs) is the default -color theme in Prelude, but you can change it at your discretion. Why -Zenburn? I (and lots of hackers around the world) find it pretty neat -for some reason. Personally I find the default theme pretty tiresome -for the eyes, that's why I took that "controversial" decision to -replace it. You can, of course, easily go back to the default (or -select another theme entirely). - -To disable Zenburn just put in your [personal config](#personalizing) -the following line: - -```lisp -(disable-theme 'zenburn) -``` - -Or you can use another theme altogether by adding something in `personal/preload` like: - -```lisp -(setq prelude-theme 'tango) -``` - -**Note** To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/solarized-emacs), -you'll have to install it from MELPA first by `M-x package-install RET solarized-theme`. Then add - -``` lisp -(setq prelude-theme 'solarized-dark) -``` -in `personal/preload`. - -Finally, if you don't want any theme at all, you can add this to your -`personal/preload`: - -```lisp -(setq prelude-theme nil) -``` - -### Personalizing - -All files you create under the `personal/` directory are yours for -personalization. There is no single special personal config file -- -any files you create in the `personal/` directory will be loaded in -lexicographical order. The overall loading precedence is: - -1. `personal/preload/*` -2. `core/` -3. `personal/prelude-modules.el` (or deprecated `prelude-modules.el`) -4. `personal/*` - -#### Personalization Example - -Suppose you want to configure go-mode to autoformat on each save. You -can create a file in `personal/`, let's call this one -`config-go-mode.el` and add the following to it. - -``` emacs-lisp -(add-hook 'go-mode-hook - (lambda () - (add-hook 'before-save-hook 'gofmt-before-save) - (setq tab-width 2))) -``` - -#### Tips - -**Fork** (instead of cloning) the official Prelude repo and add your -own touch to it. You're advised to **avoid changing stuff outside of -the personal folder** to avoid having to deal with git merge conflicts -in the future. - -If you'd like to add some auto installation of packages in your -personal config use the following code: - -```lisp -(prelude-require-packages '(some-package some-other-package)) -``` - -If you require just a single package you can also use: - -```lisp -(prelude-require-package 'some-package) -``` - -#### Preloading personal config - -Sometimes you might want to load code before Prelude has started loading. Prelude will automatically preload all -Emacs Lisp files in your `personal/preload` directory. Note that at this point you can't using anything from -Prelude, except a few variables like `prelude-dir`, etc (since nothing is yet loaded). - -#### Disabling whitespace-mode - -Although `whitespace-mode` is awesome, some people might find it too -intrusive. You can disable it in your -personal config with the following bit of code: - -```lisp -(setq prelude-whitespace nil) -``` - -If you like `whitespace-mode`, but prefer it to not automatically -cleanup your file on save, you can disable that behavior by setting -`prelude-clean-whitespace-on-save` to `nil` in your config file with: - -```lisp -(setq prelude-clean-whitespace-on-save nil) -``` - -The `prelude-clean-whitespace-on-save` setting can also be set on a -per-file or directory basis by using a file variable or a -`.dir-locals.el` file. - - -#### Disable flyspell-mode - -If you're not fond of spellchecking on the fly: - -```lisp -(setq prelude-flyspell nil) -``` - -## Caveats & Pitfalls - -### Updating bundled packages - -Generally it's a good idea to do a package update before running -updating Prelude, since the latest Prelude code might depend on newer -versions of the bundled packages than you would currently have -installed. - -If you're doing manual Prelude updates you should always do a package update first. - -`M-x package-list-packages RET U x` - -That's not necessary if you're using `M-x prelude-update`, since it -will automatically update the installed packages. - -### Problems with flyspell-mode - -Prelude makes heavy use of the flyspell-mode package for spell -checking of various things. The proper operation of flyspell depends -on the presence of the `aspell` program and an `en` dictionary on your -system. You can install `aspell` and the dictionary on macOS with -`homebrew` like this: - -```bash -brew install aspell --with-lang=en -``` - -On Linux distros - just use your distro's package manager. - -### Ugly colors in the terminal Emacs version - -If your Emacs looks considerably uglier in a terminal (compared to the -GUI version) try adding this to your `.bashrc` or `.zshrc`: - -```bash -export TERM=xterm-256color -``` - -Source the `.bashrc` file and start Emacs again. - -### MELPA error on initial startup - -If you get some http connection error related to the MELPA repo -just do a manual `M-x package-refresh-contents` and restart Emacs -afterwards. - -### Warnings on arrow navigation in editor buffers - -This is not a bug - it's a feature! I firmly believe that the one true -way to use Emacs is by using it the way it was intended to be used (as -far as navigation is concerned at least). - -If you'd like to be take this a step further and disable the arrow key navigation -completely put this in your [personal config](#personalizing): - -```lisp -(setq guru-warn-only nil) -``` - -To disable `guru-mode` completely add the following snippet to your -[personal config](#personalizing): - -```lisp -(setq prelude-guru nil) -``` - -### Customized C-a behavior - -Prelude overrides `C-a` to behave as described -[here](http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/). If -you don't like that simply add this to your [personal config](#personalizing): - -```lisp -(global-set-key [remap move-beginning-of-line] - 'move-beginning-of-line) -``` - -### Poor ido matching performance on large datasets - -Prelude's `ido` module swaps the default `ido` flex matching with the -more powerful [ido-flx](https://github.com/lewang/flx). - -The sorting algorithm `flx` uses is more complex, but yields better results. - -On slower machines, it may be necessary to lower `flx-ido-threshold` to -ensure a smooth experience. - -```lisp -(setq flx-ido-threshold 1000) -``` - -You can always disable the improved sorting algorithm all together like this: - -```lisp -(flx-ido-mode -1) -``` - -### Windows compatibility - -While everything in Prelude should work fine in Windows, I test it only -with GNU/Linux & macOS, so there might be Windows-specific problems from time to -time. This situation will probably improve over time. - ## Known issues Check out the project's diff --git a/modules/doc/cheatsheet.png b/doc/cheatsheet.png similarity index 100% rename from modules/doc/cheatsheet.png rename to doc/cheatsheet.png diff --git a/doc/configuration.md b/doc/configuration.md new file mode 100644 index 0000000000..c0f23a3f5d --- /dev/null +++ b/doc/configuration.md @@ -0,0 +1,125 @@ +# Configuration + +## Color Themes + +Emacs provides a dozen of +built-in themes you can use out-of-the-box by invoking the `M-x +load-theme` command. + +[Zenburn](https://github.com/bbatsov/zenburn-emacs) is the default +color theme in Prelude, but you can change it at your discretion. Why +Zenburn? I (and lots of hackers around the world) find it pretty neat +for some reason. Personally I find the default theme pretty tiresome +for the eyes, that's why I took that "controversial" decision to +replace it. You can, of course, easily go back to the default (or +select another theme entirely). + +To disable Zenburn just put in your personal config the following +line: + +```lisp +(disable-theme 'zenburn) +``` + +Or you can use another theme altogether by adding something in `personal/preload` like: + +```lisp +(setq prelude-theme 'tango) +``` + +**Note** To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/zenburn-emacs), +you'll have to install it from MELPA first by `M-x package-install RET solarized-theme`. Then add + +``` lisp +(setq prelude-theme 'solarized-dark) +``` +in `personal/preload`. + +Finally, if you don't want any theme at all, you can add this to your +`personal/preload`: + +```lisp +(setq prelude-theme nil) +``` + +## Personalizing + +All files you create under the `personal/` directory are yours for +personalization. There is no single special personal config file -- +any files you create in the `personal/` directory will be loaded in +lexicographical order. The overall loading precedence is: + +1. `personal/preload/*` +2. `core/` +3. `prelude-modules.el` +4. `personal/*` + +#### Personalization Example + +Suppose you want to configure `go-mode` to autoformat on each save. You +can create a file in `personal/`, let's call this one +`config-go-mode.el` and add the following to it. + +``` emacs-lisp +(add-hook 'go-mode-hook + (lambda () + (add-hook 'before-save-hook 'gofmt-before-save) + (setq tab-width 2))) +``` + +#### Tips + +**Fork** (instead of cloning) the official Prelude repo and add your +own touch to it. You're advised to **avoid changing stuff outside of +the personal folder** to avoid having to deal with git merge conflicts +in the future. + +If you'd like to add some auto installation of packages in your +personal config use the following code: + +```lisp +(prelude-require-packages '(some-package some-other-package)) +``` + +If you require just a single package you can also use: + +```lisp +(prelude-require-package 'some-package) +``` + +### Preloading personal config + +Sometimes you might want to load code before Prelude has started loading. Prelude will automatically preload all +Emacs Lisp files in your `personal/preload` directory. Note that at this point you can't using anything from +Prelude, except a few variables like `prelude-dir`, etc (since nothing is yet loaded). + +### Disabling whitespace-mode + +Although `whitespace-mode` is awesome, some people might find it too +intrusive. You can disable it in your +personal config with the following bit of code: + +```lisp +(setq prelude-whitespace nil) +``` + +If you like `whitespace-mode`, but prefer it to not automatically +cleanup your file on save, you can disable that behavior by setting +`prelude-clean-whitespace-on-save` to `nil` in your config file with: + +```lisp +(setq prelude-clean-whitespace-on-save nil) +``` + +The `prelude-clean-whitespace-on-save` setting can also be set on a +per-file or directory basis by using a file variable or a +`.dir-locals.el` file. + + +### Disable flyspell-mode + +If you're not fond of spellchecking on the fly: + +```lisp +(setq prelude-flyspell nil) +``` diff --git a/doc/contributing.md b/doc/contributing.md new file mode 100644 index 0000000000..1b2297686b --- /dev/null +++ b/doc/contributing.md @@ -0,0 +1,58 @@ +## Issues + +Report issues and suggest features and improvements on the +[GitHub issue tracker](https://github.com/bbatsov/prelude/issues). Don't ask +questions on the issue tracker - use the [support channels](support.md) instead. + +If you want to file a bug, please provide all the necessary info listed in +our issue reporting template (it's loaded automatically when you create a +new GitHub issue). + +## Patches + +Patches in any form are always welcome! GitHub pull requests are even better! :-) + +Before submitting a patch or a pull request make sure that your patch +is in line with the [contribution +guidelines](https://github.com/bbatsov/prelude/blob/master/CONTRIBUTING.md). + +## Documentation + +Good documentation is just as important as good code. + +Consider improving and extending the +this manual and the +[community wiki](https://github.com/bbatsov/prelude/wiki). + +### Working on the Manual + +The manual is generated from the markdown files in the +[doc](https://github.com/bbatsov/prelude/tree/master/doc) folder of Prelude's +GitHub repo and is published to [Read the Docs](readthedocs.org). The +[MkDocs](http://www.mkdocs.org/) tool is used to convert the markdown sources to +HTML. + +To make changes to the manual you simply have to change the files under +`doc`. The manual will be regenerated automatically when changes to those files +are merged in `master` (or the latest stable branch). + +You can install `MkDocs` locally and use the command `mkdocs serve` to see the +result of changes you make to the manual locally: + +```sh +$ cd path/to/prelude/repo +$ mkdocs serve +``` + +If you want to make changes to the manual's page structure you'll have to edit +[mkdocs.yml](https://github.com/bbatsov/prelude/blob/master/mkdocs.yml). + +## Donations + +You can support the development of Prelude via + [Salt](https://salt.bountysource.com/teams/prelude), + [Patreon](https://www.patreon.com/bbatsov) and + [Liberapay](https://liberapay.com/bbatsov/donate). + +[![Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/bbatsov/donate) +[![Patreon](https://img.shields.io/badge/patreon-donate-orange.svg)](https://www.patreon.com/bbatsov) diff --git a/doc/css/extra.css b/doc/css/extra.css new file mode 100644 index 0000000000..a124709450 --- /dev/null +++ b/doc/css/extra.css @@ -0,0 +1,15 @@ +/* By default kbd doesn't stand out very much. Let's fix this! */ +kbd { + padding: 3px 5px; + border: solid 1px #ccc; + background-color: #fcfcfc; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; + display: inline-block; +} + +/* The default font-size for code blocks is 75% which makes code +hard to read. */ +code { + font-size: 90%; +} diff --git a/doc/faq.md b/doc/faq.md new file mode 100644 index 0000000000..fe3a223931 --- /dev/null +++ b/doc/faq.md @@ -0,0 +1,3 @@ +# Frequently Asked Questions + +Coming soon... diff --git a/doc/index.md b/doc/index.md new file mode 100644 index 0000000000..bead8a7358 --- /dev/null +++ b/doc/index.md @@ -0,0 +1,18 @@ +# Emacs Prelude + +Prelude is an Emacs distribution that aims to enhance the default +Emacs experience. Prelude alters a lot of the default settings, +bundles a plethora of additional packages and adds its own core +library to the mix. The final product offers an easy to use Emacs +configuration for Emacs newcomers and lots of additional power for +Emacs power users. + +Prelude is compatible **ONLY with GNU Emacs 25.1+**. In general you're +advised to always run Prelude with the latest Emacs - currently +**26.1**. + +You can support the development of Prelude via +[PayPal](https://www.paypal.me/bbatsov), +[Salt](https://bountysource.com/teams/prelude), +[Patreon](https://www.patreon.com/bbatsov) and +[Liberapay](https://liberapay.com/bbatsov/donate). diff --git a/doc/installation.md b/doc/installation.md new file mode 100644 index 0000000000..0e74d67761 --- /dev/null +++ b/doc/installation.md @@ -0,0 +1,122 @@ +# Installation + +## Installing Emacs + +Obviously to use the Emacs Prelude you have to install Emacs +first. Have a look at +the +[WikEmacs articles on installing Emacs](http://wikemacs.org/index.php/Installing_Emacs). + +## Installation + +### Automated + +You can install **Emacs Prelude** via the command line with either `curl` or +`wget`. Naturally `git` is also required. + +#### Via Curl + +If you're using `curl` type the following command: + +```bash +curl -L https://github.com/bbatsov/prelude/raw/master/utils/installer.sh | sh +``` + +#### Via Wget + +If you're using `wget` type: + +```bash +wget --no-check-certificate https://github.com/bbatsov/prelude/raw/master/utils/installer.sh -O - | sh +``` + +### Manual + +Make sure you do not have any `~/.emacs` file present. + +```bash +git clone git://github.com/bbatsov/prelude.git path/to/local/repo +ln -s path/to/local/repo ~/.emacs.d +cd ~/.emacs.d +``` + +If you are using Windows, you should check what Emacs thinks the `~` directory is by running Emacs and typing `C-x d ~/`, and then adjust the command appropriately. + +## Updating Prelude + +### Manual update + +The update procedure is fairly straightforward and consists of 3 steps: + +#### Update all bundled packages + +Just run M-x package-list-packages RET U x. + +#### Update Prelude's code + +```bash +cd path/to/prelude/installation +git pull +``` + +The `path/to/prelude/installation` is usually `~/.emacs.d` (at least +on Unix systems). + +#### Restart Prelude + +It's generally a good idea to stop Emacs after you do the update. The +next time Prelude starts it will install any new dependencies (if +there are such). + +### Automatic update + +Simply run M-x prelude-update from Emacs itself and restart Emacs afterwards. + +## Pinning packages + +By default, Prelude will install packages from the melpa and gnu package +repositories. Occasionally package integration can break when upgrading packages. +This can be avoided by pinning packages to stable versions in other repositories. +To do so, copy `prelude-pinned-packages.el` from the sample directory to +Prelude's root directory and adjust the [variables](https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Installation.html) +inside accordingly. + +## Enabling additional modules + +By default most of the modules that ship with Prelude are not loaded. For more information on the functionality provided by these modules visit the [docs](modules/index.md). + +```lisp +;;; Uncomment the modules you'd like to use and restart Prelude afterwards + +(require 'prelude-c) +;; (require 'prelude-clojure) +;; (require 'prelude-coffee) +;; (require 'prelude-common-lisp) +;; (require 'prelude-css) +(require 'prelude-emacs-lisp) +(require 'prelude-erc) +;; (require 'prelude-erlang) +;; (require 'prelude-elixir) +;; (require 'prelude-haskell) +(require 'prelude-js) +;; (require 'prelude-latex) +(require 'prelude-lisp) +(require 'prelude-org) +(require 'prelude-perl) +;; (require 'prelude-python) +;; (require 'prelude-ruby) +;; (require 'prelude-scala) +(require 'prelude-scheme) +;; (require 'prelude-scss) +;; (require 'prelude-web) +(require 'prelude-xml) +``` + +You'll need to adjust your `prelude-modules.el` file once the +installation is done. If you are doing a manual install then you first +need to copy the `prelude-modules.el` available in the sample +directory to the root of `path/to/prelude/installation` and then +adjust that one. + +After you've uncommented a module you should either restart Emacs or evaluate the module +`require` expression with C-x C-e. diff --git a/modules/doc/prelude-erc.md b/doc/modules/erc.md similarity index 80% rename from modules/doc/prelude-erc.md rename to doc/modules/erc.md index 5f61069bfb..a9608ad097 100644 --- a/modules/doc/prelude-erc.md +++ b/doc/modules/erc.md @@ -1,4 +1,4 @@ -# Prelude ERC Quickstart +# Prelude ERC ## Customizing Server list @@ -6,11 +6,11 @@ If you want to join a list of servers on `M-x start-irc`, other than the default list, please redefine the variable `my-fav-irc` as follows in your personal config -``` emacs-lisp -(setq my-fav-irc '("irc.freenode.net" +``` emacs-lisp +(setq my-fav-irc '("irc.freenode.net" "irc.oftc.net" - "irc.mozilla.org" - "irc.gnome.org")) + "irc.mozilla.org" + "irc.gnome.org")) ``` ## Customizing Last Quit Message @@ -19,8 +19,8 @@ If you want to customize your IRC Last Quit Message from *Asta la vista* to something more funkier, please redefine `bye-irc-message` as follows -``` emacs-lisp -(setq bye-erc-message "adios") +``` emacs-lisp +(setq bye-erc-message "adios") ``` ## Reading NickServ passwords from auth-source plugin @@ -28,8 +28,8 @@ follows If you want to automatically authenticate while logging into IRC servers set the `erc-prompt-for-password` to nil as follows -``` emacs-lisp -(setq erc-prompt-for-password nil) +``` emacs-lisp +(setq erc-prompt-for-password nil) ``` Now you can set password in plaintext in .authinfo file in the netRC @@ -45,6 +45,6 @@ to group all the ERC buffers into one perspective called `IRC` when `start-irc` is called. To enable this set the `prelude-new-irc-persp` variable to true as follows -``` emacs-lisp -(setq prelude-new-irc-persp t) +``` emacs-lisp +(setq prelude-new-irc-persp t) ``` diff --git a/modules/doc/README.md b/doc/modules/index.md similarity index 83% rename from modules/doc/README.md rename to doc/modules/index.md index 36422c8767..c3a03d4b8b 100644 --- a/modules/doc/README.md +++ b/doc/modules/index.md @@ -1,4 +1,4 @@ -# Emacs Prelude Modules +# Modules Prelude provides extra functionality through modules. Some modules may require extra steps to enable all functionality. These steps and the @@ -11,7 +11,7 @@ following links. - Common-Lisp - CSS - Emacs-Lisp -- [ERC](prelude-erc.md) +- [ERC](erc.md) - Erlang - Elixir - Haskell @@ -21,7 +21,7 @@ following links. - Markdown - Org - Perl -- [Python](prelude-python.md) +- [Python](python.md) - Ruby - Scala - Scheme diff --git a/modules/doc/prelude-python.md b/doc/modules/python.md similarity index 96% rename from modules/doc/prelude-python.md rename to doc/modules/python.md index 8de3ff66b5..565723462b 100644 --- a/modules/doc/prelude-python.md +++ b/doc/modules/python.md @@ -1,4 +1,4 @@ -# Prelude Python Quickstart +# Prelude Python ## Python Mode diff --git a/modules/doc/prelude-cheatsheet.pdf b/doc/prelude-cheatsheet.pdf similarity index 100% rename from modules/doc/prelude-cheatsheet.pdf rename to doc/prelude-cheatsheet.pdf diff --git a/modules/doc/prelude-cheatsheet.tex b/doc/prelude-cheatsheet.tex similarity index 100% rename from modules/doc/prelude-cheatsheet.tex rename to doc/prelude-cheatsheet.tex diff --git a/doc/support.md b/doc/support.md new file mode 100644 index 0000000000..594857f7bb --- /dev/null +++ b/doc/support.md @@ -0,0 +1,33 @@ +# Support + +Prelude currently has several official & unofficial support channels. + +For questions, suggestions and support refer to one of them. Please, don't +use the support channels to report issues, as this makes them harder to track. + +## Gitter + +Most internal discussions about the development of Prelude happen on its +[gitter channel](https://gitter.im/bbatsov/prelude). You can often find +Prelude's maintainers there and get some interesting news from the project's +kitchen. + +## Mailing List + +The [official mailing list](https://groups.google.com/forum/#!forum/emacs-prelude) is +hosted at Google Groups. It's a low-traffic list, so don't be too hesitant to subscribe. + +## Freenode + +If you're into IRC you can visit the `#prelude` channel on Freenode. +It's not actively +monitored by the Prelude maintainers themselves, but still you can get support +from other Prelude users there. + +## Stackoverflow + +We're also encouraging users to ask Prelude-related questions on StackOverflow. + +When doing so you should use the +[Prelude](http://stackoverflow.com/questions/tagged/prelude) tag (ideally combined +with the tag `emacs`). diff --git a/doc/troubleshooting.md b/doc/troubleshooting.md new file mode 100644 index 0000000000..277c5133a7 --- /dev/null +++ b/doc/troubleshooting.md @@ -0,0 +1,103 @@ +# Troubleshooting + +## Updating bundled packages + +Generally it's a good idea to do a package update before running +updating Prelude, since the latest Prelude code might depend on newer +versions of the bundled packages than you would currently have +installed. + +If you're doing manual Prelude updates you should always do a package update first. + +`M-x package-list-packages RET U x` + +That's not necessary if you're using `M-x prelude-update`, since it +will automatically update the installed packages. + +## Problems with flyspell-mode + +Prelude makes heavy use of the flyspell-mode package for spell +checking of various things. The proper operation of flyspell depends +on the presence of the `aspell` program and an `en` dictionary on your +system. You can install `aspell` and the dictionary on macOS with +`homebrew` like this: + +```bash +brew install aspell --with-lang=en +``` + +On Linux distros - just use your distro's package manager. + +## Ugly colors in the terminal Emacs version + +If your Emacs looks considerably uglier in a terminal (compared to the +GUI version) try adding this to your `.bashrc` or `.zshrc`: + +```bash +export TERM=xterm-256color +``` + +Source the `.bashrc` file and start Emacs again. + +## MELPA error on initial startup + +If you get some http connection error related to the MELPA repo +just do a manual `M-x package-refresh-contents` and restart Emacs +afterwards. + +## Warnings on arrow navigation in editor buffers + +This is not a bug - it's a feature! I firmly believe that the one true +way to use Emacs is by using it the way it was intended to be used (as +far as navigation is concerned at least). + +If you'd like to be take this a step further and disable the arrow key navigation +completely put this in your personal config: + +```lisp +(setq guru-warn-only nil) +``` + +To disable `guru-mode` completely add the following snippet to your +personal Emacs config: + +```lisp +(setq prelude-guru nil) +``` + +## Customized C-a behavior + +Prelude overrides `C-a` to behave as described +[here](http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/). If +you don't like that simply add this to your personal config: + +```lisp +(global-set-key [remap move-beginning-of-line] + 'move-beginning-of-line) +``` + +## Poor ido matching performance on large datasets + +Prelude's `ido` module swaps the default `ido` flex matching with the +more powerful [ido-flx](https://github.com/lewang/flx). + +The sorting algorithm `flx` uses is more complex, but yields better results. + +On slower machines, it may be necessary to lower `flx-ido-threshold` to +ensure a smooth experience. + +```lisp +(setq flx-ido-threshold 1000) +``` + +You can always disable the improved sorting algorithm all together like this: + +```lisp +(flx-ido-mode -1) +``` + +## Windows compatibility + +While everything in Prelude should work fine in Windows, I test it only +with GNU/Linux & macOS, so there might be Windows-specific problems from time to +time. This situation will probably improve over time. diff --git a/doc/usage.md b/doc/usage.md new file mode 100644 index 0000000000..dd01af05dd --- /dev/null +++ b/doc/usage.md @@ -0,0 +1,275 @@ +# Usage + +## Running + +Nothing fancy here. Just start Emacs as usual. Personally I run Emacs +in daemon mode: + +```bash +emacs --daemon +``` + +Afterwards I connect to the server with either a terminal or a GUI +client like this: + +```bash +emacsclient -t +emacsclient -c +``` + +You'd probably do well to put a few aliases in your `.zshrc` (or +`.bashrc`): + +```bash +alias e='emacsclient -t' +alias ec='emacsclient -c' +alias vim='emacsclient -t' +alias vi='emacsclient -t' +``` + +The last two aliases are helpful if you're used to editing files from +the command line using `vi(m)`. + +You can also open a file with the cursor positioned directly on a specific line: + +```bash +emacsclient somefile:1234 +``` + +This will open file 'somefile' and set cursor on line 1234. + +## Getting to know Prelude + +Certainly the best way to understand how Prelude enhances the default +Emacs experience is to peruse Prelude's source code (which is +obviously written in Emacs Lisp). Understanding the code is not +necessary of course. Prelude includes a `prelude-mode` minor Emacs mode +which collects some of the additional functionality added by +Prelude. It also adds an additional keymap that binds many of those +extensions to keybindings. + +### Keymap + +#### Global + +Keybinding | Description +-------------------|------------------------------------------------------------ +C-x \\ | `align-regexp` +C-+ | Increase font size(`text-scale-increase`). +C-- | Decrease font size(`text-scale-decrease`). +C-x O | Go back to previous window (the inverse of `other-window` (`C-x o`)). +C-^ | Join two lines into one(`crux-top-join-line`). +C-x p | Start `proced` (manage processes from Emacs; works only in Linux). +C-x m | Start `eshell`. +C-x M-m | Start your default shell. +C-x C-m | Alias for `M-x`. +M-X | Like `M-x` but limited to commands that are relevant to the active major mode. +C-h A | Run `apropos` (search in all Emacs symbols). +C-h C-m | Display key bindings of current major mode and descriptions of every binding. +M-/ | Run `hippie-expand` (a replacement for the default `dabbrev-expand`). +C-x C-b | Open `ibuffer` (a replacement for the default `buffer-list`). +F11 | Make the window full screen. +F12 | Toggle the Emacs menu bar. +C-x g | Open Magit's status buffer. +C-x M-g | Open Magit's popup of popups. +M-Z | Zap up to char. +C-= | Run `expand-region` (incremental text selection). +C-a | Run `crux-move-beginning-of-line`. Read [this](http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/) for details. + +#### Prelude Mode + +Keybinding | Description +-------------------|------------------------------------------------------------ +C-c o | Open the currently visited file with an external program. +C-c i | Search for a symbol, only for buffers that contain code +C-c g | Search in Google for the thing under point (or an interactive query). +C-c G | Search in GitHub for the thing under point (or an interactive query). +C-c y | Search in YouTube for the thing under point (or an interactive query). +C-c U | Search in Duckduckgo for the thing under point (or an interactive query). +C-S-RET or Super-o | Insert an empty line above the current line and indent it properly. +S-RET or M-o | Insert an empty line and indent it properly (as in most IDEs). +C-S-up or M-S-up | Move the current line or region up. +C-S-down or M-S-down| Move the current line or region down. +C-c n | Fix indentation in buffer and strip whitespace. +C-c f | Open recently visited file. +C-M-\\ | Indent region (if selected) or the entire buffer. +C-c u | Open a new buffer containing the contents of URL. +C-c e | Eval a bit of Emacs Lisp code and replace it with its result. +C-c s | Swap two active windows. +C-c D | Delete current file and buffer. +C-c d | Duplicate the current line (or region). +C-c M-d | Duplicate and comment the current line (or region). +C-c r | Rename the current buffer and its visiting file if any. +C-c t | Open a terminal emulator (`ansi-term`). +C-c k | Kill all open buffers except the one you're currently in. +C-c TAB | Indent and copy region to clipboard +C-c I | Open user's init file. +C-c S | Open shell's init file. +C-c . + | Increment integer at point. Default is +1. +C-c . - | Decrement integer at point. Default is -1. +C-c . * | Multiply integer at point. Default is *2. +C-c . / | Divide integer at point. Default is /2. +C-c . \\ | Modulo integer at point. Default is modulo 2. +C-c . ^ | Power to the integer at point. Default is ^2. +C-c . < | Left-shift integer at point. Default is 1 position to the left. +C-c . > | Right-shift integer at point. Default is 1 position to the right. +C-c . # | Convert integer at point to specified base. Default is 10. +C-c . % | Replace integer at point with another specified integer. +C-c . ' | Perform arithmetic operations on integer at point. User specifies the operator. +Super-r | Recent files +Super-j | Join lines +Super-k | Kill whole line +Super-m m | Magit status +Super-m l | Magit log +Super-m f | Magit file log +Super-m b | Magit blame mode + +**Note**: For various arithmetic operations, the prefix `C-c .` only needs to be pressed once for the first operation. +For subsequent operations, only the appropriate operations (i.e. `+`, `-`, `*`, `/`... needs to be pressed). + +#### macOS modifier keys + +Prelude does not mess by default with the standard mapping of `Command` (to `Super`) and `Option` (to `Meta`). + +If you want to swap them add this to your personal config: + +```lisp +(setq mac-command-modifier 'meta) +(setq mac-option-modifier 'super) +``` + +You can also temporarily swap them with `C-c w` (`M-x prelude-swap-meta-and-super`). + +**Note**: I'd highly recommend to all macOS users to consider +[remapping Return to +Control](http://emacsredux.com/blog/2013/11/12/a-crazy-productivity-boost-remap-return-to-control/) +instead. That's an epic productivity boost and it's not as crazy as it sounds! + +#### Projectile + +[Projectile](https://github.com/bbatsov/projectile) is one of the essential packages bundled with Prelude. +It provides an easy way to navigate and switch projects. Take a look at its extensive documentation +to get a feel for everything you can do with Projectile. + +Prelude adds an extra keymap prefix `s-p` (`s` stands for +`Super`) in addition to the standard one `C-c p`. By default on Windows keyboard +`Super` is mapped to the `Windows` key and on macOS keyboards `Super` is mapped +to the `Command` key. + +If you ever forget any of Projectile's keybindings just do a: + +C-c p C-h or s-p C-h + +Alternatively you can just press s-p and wait for a moment +for `which-key` to kick in and show you the available keybindings. + +#### Helm + +Helm is setup according to this guide: [A Package in a league of its own: Helm](http://tuhdo.github.io/helm-intro.html). + +You can learn Helm usage and key bindings following the guide. C-c h is Prelude's default prefix key for Helm. +If you don't remember any key binding, append C-h after C-c h for a list of key bindings in Helm. + +If you love Helm and want to use Helm globally with enhanced `helm-find-files`, `helm-buffer-lists`..., you will have to also add `(require 'prelude-helm-everywhere)`. +When `prelude-helm-everywhere` is activated, Helm enables these global key bindings: + +Key binding | Description +-------------------|---------------------------------------------- +M-x | Run [helm-M-x](http://tuhdo.github.io/helm-intro.html#sec-3), an interactive version of M-x. +M-y | Run [helm-show-kill-ring](http://tuhdo.github.io/helm-intro.html#sec-4), shows the content of `kill-ring`. +C-x b | Run [helm-mini](http://tuhdo.github.io/helm-intro.html#sec-5), an interactive version of `C-x b` with more features. +C-x C-f | Run [helm-find-files](http://tuhdo.github.io/helm-intro.html#sec-6), an interactive version of `find-file` with more features. +C-h f | Run [helm-apropos](http://tuhdo.github.io/helm-intro.html#sec-13), an interactive version of `apropos-command`. +C-h r | Run [helm-info-emacs](http://tuhdo.github.io/helm-intro.html#sec-14), an interactive version of `info-emacs-manual`. +C-h C-l | Run `helm-locate-library` that can search for locations of any file loaded into Emacs. + +This key binding is activated in `shell-mode`: + +Key Binding | Description +-------------------|---------------------------------------------- +C-c C-l | Run `helm-comint-input-ring` that shows `shell` history using Helm interface. + +This key bindings is activated in `eshell-mode`: + +Key Binding | Description +-------------------|---------------------------------------------- +C-c C-l | Run `helm-eshell-history` that shows `eshell` history using Helm interface. + +If you prefer Ido in everywhere, you should not add `prelude-helm-everywhere`, so you can use Helm along with Ido and Prelude's default commands. + +You can always reactivate Helm with `(prelude-global-helm-global-mode-on)`. + +**NOTICE**: In `helm-M-x`, you have to pass prefix argument *AFTER* you run `helm-M-x`, +because your prefix argument will be displayed in the modeline when in `helm-M-x` +buffer. Passing prefix argument **BEFORE** =helm-M-x= **has no effect**. + + +#### Key-chords + +**Key-chords are available only when the `prelude-key-chord` module has been enabled.** + +Keybinding | Description +-------------------|---------------------------------------------- +jj | Jump to the beginning of a word(`avy-goto-word-1`) +jk | Jump to a character(`avy-goto-char`) +jl | Jump to the beginning of a line(`avy-goto-line`) +JJ | Jump back to previous buffer(`crux-switch-to-previous-buffer`) +uu | View edits as a tree(`undo-tree-visualize`) +xx | Executed extended command(`execute-extended-command`) +yy | Browse the kill ring(`browse-kill-ring`) + +##### Disabling key-chords + +In some cases you may not want to have a key-chord that is defined by prelude, +in which case you can disable the binding in your `personal.el` file by setting +its command to `nil`. For example, to disable the `jj` key-chord add the +following line: + +```lisp +(key-chord-define-global "jj" nil) +``` + +If you're an `evil-mode` user you'll probably do well to disable `key-chord-mode` altogether: + +```lisp +(key-chord-mode -1) +``` + +#### vim emulation + +If you want to use vim keybindings inside of Emacs enable the `prelude-evil` module which provides +support for `evil-mode`. + +### Cheatsheet + +Use `C-h k ` (`` are the ones listed on the left) or `C-h f ` (`` are the ones listed on the right) to see the detailed explanation. + +![cheatsheet](cheatsheet.png) + +#### PDF generation + +Install [LaTeX](https://www.latex-project.org/get/) + +``` bash +cd modules/doc +pdflatex prelude-cheatsheet.tex +``` + +#### PNG generation + +Install [Poppler](https://poppler.freedesktop.org/) + +``` bash +cd modules/doc +pdftocairo -png -singlefile prelude-cheatsheet.pdf cheatsheet +``` + +## Automatic package installation + +The default Prelude installation comes with a bare minimum of +functionality. It will however install add-ons for various programming +languages and frameworks on demand. For instance - if you try to open +a `.clj` file `clojure-mode`, `cider` and Prelude's enhanced Lisp +configuration will be installed automatically for you. + +You can, of course, install anything you wish manually as well. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000000..52e3af7e90 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,22 @@ +site_name: "Prelude: A sleek, modern, simple and powerful Emacs experience for everyone" +repo_url: https://github.com/bbatsov/prelude +copyright: "Copyright (C) 2019 Bozhidar Batsov and Prelude contributors" +docs_dir: doc +pages: +- Home: index.md +- Installation: installation.md +- Usage: usage.md +- Configuration: configuration.md +- Modules: + - Overview: modules/index.md + - ERC: modules/erc.md + - Python: modules/python.md +- FAQ: faq.md +- Troubleshooting: troubleshooting.md +- Contributing: contributing.md +- Support: support.md +extra_css: + - css/extra.css +markdown_extensions: + - admonition +theme: readthedocs From 960d9aca6041b4c3d2a896ce7c22d7af8678a4f4 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 15:06:45 +0200 Subject: [PATCH 37/57] Mention the new manual in the README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 92e5365d1b..ca0ef810ec 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,10 @@ Don't forget to adjust your `prelude-modules.el` file in your personal directory once the installation is done. By default most of the modules that ship with Prelude are not loaded. +## User Manual + +Check out our [user manual](https://prelude.emacsredux.com) for more information. + ## Known issues Check out the project's From f859cf0fe8af648b5fdb5657806fad377103474a Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 15:16:17 +0200 Subject: [PATCH 38/57] Fix a bad merge --- doc/configuration.md | 8 +++++--- doc/usage.md | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/doc/configuration.md b/doc/configuration.md index c0f23a3f5d..d9f034662b 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -27,8 +27,10 @@ Or you can use another theme altogether by adding something in `personal/preload (setq prelude-theme 'tango) ``` -**Note** To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/zenburn-emacs), -you'll have to install it from MELPA first by `M-x package-install RET solarized-theme`. Then add +!!! Note + + To use a non-built-in theme, like [Solarized](https://github.com/bbatsov/solarized-emacs), + you'll have to install it from MELPA first by `M-x package-install RET solarized-theme`. Then add ``` lisp (setq prelude-theme 'solarized-dark) @@ -51,7 +53,7 @@ lexicographical order. The overall loading precedence is: 1. `personal/preload/*` 2. `core/` -3. `prelude-modules.el` +3. `personal/prelude-modules.el` (or deprecated `prelude-modules.el`) 4. `personal/*` #### Personalization Example diff --git a/doc/usage.md b/doc/usage.md index dd01af05dd..f4b19fe1cc 100644 --- a/doc/usage.md +++ b/doc/usage.md @@ -140,10 +140,18 @@ If you want to swap them add this to your personal config: You can also temporarily swap them with `C-c w` (`M-x prelude-swap-meta-and-super`). -**Note**: I'd highly recommend to all macOS users to consider -[remapping Return to -Control](http://emacsredux.com/blog/2013/11/12/a-crazy-productivity-boost-remap-return-to-control/) -instead. That's an epic productivity boost and it's not as crazy as it sounds! +!!! Tip + + [The Emacs Mac port](https://bitbucket.org/mituharu/emacs-mac.git) comes + with `Command` + [set](https://bitbucket.org/mituharu/emacs-mac/src/7fdbfba85d543f01b81e997e2b03788c35cb3bfa/src/macterm.c?at=master&fileviewer=file-view-default#macterm.c-6147:6169) + to `Meta`. + +!!! Tip + + I'd highly recommend to all macOS users to consider + [remapping Return to Control](http://emacsredux.com/blog/2013/11/12/a-crazy-productivity-boost-remap-return-to-control/) + instead. That's an epic productivity boost and it's not as crazy as it sounds! #### Projectile From 242a7e429d229febad57bb8b1adb5d9bde34260c Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 15:27:04 +0200 Subject: [PATCH 39/57] Tweak some wording --- doc/modules/index.md | 50 +++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/doc/modules/index.md b/doc/modules/index.md index c3a03d4b8b..d05effe05c 100644 --- a/doc/modules/index.md +++ b/doc/modules/index.md @@ -1,29 +1,35 @@ # Modules +!!! Note + + Most modules are not currently documented. Helping out with their + documentation is a great way to contribute to the project! + Prelude provides extra functionality through modules. Some modules may require extra steps to enable all functionality. These steps and the functionality provided by these modules are documented on the following links. -- C -- Clojure -- Coffee -- Common-Lisp -- CSS -- Emacs-Lisp -- [ERC](erc.md) -- Erlang -- Elixir -- Haskell -- JS -- Latex -- Lisp -- Markdown -- Org -- Perl -- [Python](python.md) -- Ruby -- Scala -- Scheme -- Scss -- Web +- C/C++ +- Clojure +- CoffeeScript +- Common Lisp +- CSS +- Emacs-Lisp +- [ERC](erc.md) +- Erlang +- Elixir +- Haskell +- JavaScript +- LaTeX +- Lisp Base +- Markdown +- Org Mode +- Perl +- [Python](python.md) +- Ruby +- Rust +- Scala +- Scheme +- SCSS +- Web From a48c55294f992765f877bff03fb48fd78c760986 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 15:30:23 +0200 Subject: [PATCH 40/57] Describe modules --- doc/modules/index.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/doc/modules/index.md b/doc/modules/index.md index d05effe05c..aca91874c3 100644 --- a/doc/modules/index.md +++ b/doc/modules/index.md @@ -10,6 +10,45 @@ require extra steps to enable all functionality. These steps and the functionality provided by these modules are documented on the following links. +## What's a module? + +Prelude modules are plain old Elisp libraries - there's absolutely nothing magical about them. +Most of them simply install a few package and provide some sensible baseline configuration for them. +Here's a real example. + +``` emacs-lisp +;;; prelude-ruby.el --- Emacs Prelude: A nice setup for Ruby (and Rails) devs. +;; +;;; Code: + +(require 'prelude-programming) + +(prelude-require-packages '(inf-ruby yari)) + +;; We never want to edit Rubinius bytecode +(add-to-list 'completion-ignored-extensions ".rbc") + +(define-key 'help-command (kbd "R") 'yari) + +(with-eval-after-load 'ruby-mode + (defun prelude-ruby-mode-defaults () + (inf-ruby-minor-mode +1) + ;; CamelCase aware editing operations + (subword-mode +1)) + + (setq prelude-ruby-mode-hook 'prelude-ruby-mode-defaults) + + (add-hook 'ruby-mode-hook (lambda () + (run-hooks 'prelude-ruby-mode-hook)))) + +(provide 'prelude-ruby) +;;; prelude-ruby.el ends here +``` + +To use a module you simple have to require it. No new concepts. No magic. + +## List of Modules + - C/C++ - Clojure - CoffeeScript From 1751d21524fab3d62226fa0793fea71547ba5793 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 18:59:56 +0200 Subject: [PATCH 41/57] Extend the overview --- doc/index.md | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/doc/index.md b/doc/index.md index bead8a7358..2e483ed109 100644 --- a/doc/index.md +++ b/doc/index.md @@ -7,12 +7,38 @@ library to the mix. The final product offers an easy to use Emacs configuration for Emacs newcomers and lots of additional power for Emacs power users. -Prelude is compatible **ONLY with GNU Emacs 25.1+**. In general you're -advised to always run Prelude with the latest Emacs - currently -**26.1**. +!!! Important + + Prelude is compatible **ONLY with GNU Emacs 25.1+**. In general you're + advised to always run Prelude with the latest Emacs - currently **26.1**. You can support the development of Prelude via [PayPal](https://www.paypal.me/bbatsov), [Salt](https://bountysource.com/teams/prelude), [Patreon](https://www.patreon.com/bbatsov) and [Liberapay](https://liberapay.com/bbatsov/donate). + +## Philosophy + +Prelude's philosophy is quite simple: + +* simple +* easy to understand and extend +* stable +* a foundation for you to build upon, as opposed to some end-user product + +This means that it intentionally doesn't pack all the bells and whistles that it could. +Prelude aims to enhance the classic Emacs experience without deviating a lot from it - e.g. +it would never enable something like `evil-mode` (vim keybindings) by default and so on. + +All the third-party packages that it bundles are carefully vetted and are known to be of +good quality and to have reliable maintainers. That generally means that Prelude's unlikely +to immediate adopt some shiny new package, that has established tried and true alternatives. + +## Features + +* Improved UX, that's still in line with Emacs traditions +* Sane defaults of baseline Emacs functionality +* A curated set of 3rd party packages to enhance the base functionality +* Simple modular architecture +* Easy customization From 04c85dae1d5daf6a504c55e80b8ecb1ad18ccad5 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 16 Jan 2019 19:04:56 +0200 Subject: [PATCH 42/57] Tweak some markup --- doc/usage.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/doc/usage.md b/doc/usage.md index f4b19fe1cc..7ef30bfbf3 100644 --- a/doc/usage.md +++ b/doc/usage.md @@ -36,7 +36,7 @@ You can also open a file with the cursor positioned directly on a specific line: emacsclient somefile:1234 ``` -This will open file 'somefile' and set cursor on line 1234. +This will open file `somefile` and set cursor on line 1234. ## Getting to know Prelude @@ -124,8 +124,10 @@ Keybinding | Description Super-m f | Magit file log Super-m b | Magit blame mode -**Note**: For various arithmetic operations, the prefix `C-c .` only needs to be pressed once for the first operation. -For subsequent operations, only the appropriate operations (i.e. `+`, `-`, `*`, `/`... needs to be pressed). +!!! Note + + For various arithmetic operations, the prefix `C-c .` only needs to be pressed once for the first operation. + For subsequent operations, only the appropriate operations (i.e. `+`, `-`, `*`, `/`... needs to be pressed). #### macOS modifier keys @@ -207,14 +209,18 @@ If you prefer Ido in everywhere, you should not add `prelude-helm-everywhere`, s You can always reactivate Helm with `(prelude-global-helm-global-mode-on)`. -**NOTICE**: In `helm-M-x`, you have to pass prefix argument *AFTER* you run `helm-M-x`, -because your prefix argument will be displayed in the modeline when in `helm-M-x` -buffer. Passing prefix argument **BEFORE** =helm-M-x= **has no effect**. +!!! Note + + In `helm-M-x`, you have to pass prefix argument *AFTER* you run `helm-M-x`, + because your prefix argument will be displayed in the modeline when in `helm-M-x` + buffer. Passing prefix argument **BEFORE** =helm-M-x= **has no effect**. #### Key-chords -**Key-chords are available only when the `prelude-key-chord` module has been enabled.** +!!! Note + + Key-chords are available only when the `prelude-key-chord` module has been enabled. Keybinding | Description -------------------|---------------------------------------------- From 1ec67804787b43153f3aaaf9feed3fa9d1d5fa06 Mon Sep 17 00:00:00 2001 From: weiyang Date: Wed, 23 Jan 2019 18:34:25 +0800 Subject: [PATCH 43/57] Fix the link of 'prelude-cheatsheet.pdf' Signed-off-by: weiyang --- prelude-cheatsheet.pdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prelude-cheatsheet.pdf b/prelude-cheatsheet.pdf index 9109970727..f5c1113bd2 120000 --- a/prelude-cheatsheet.pdf +++ b/prelude-cheatsheet.pdf @@ -1 +1 @@ -modules/doc/prelude-cheatsheet.pdf \ No newline at end of file +doc/prelude-cheatsheet.pdf \ No newline at end of file From 113b08b0506da9e8c957c8e42eec5bd6591675b3 Mon Sep 17 00:00:00 2001 From: azzamsa Date: Tue, 9 Apr 2019 07:42:11 +0700 Subject: [PATCH 44/57] Update installation instruction link for OCaml module --- modules/prelude-ocaml.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/prelude-ocaml.el b/modules/prelude-ocaml.el index d8f48dfe24..9c64b67397 100644 --- a/modules/prelude-ocaml.el +++ b/modules/prelude-ocaml.el @@ -28,7 +28,7 @@ ;; The minimum required setup for using Prelude's OCaml setup would be ;; to install OPAM, and then, minimally `opam install core utop'. A ;; good getting started guide is available at -;; https://github.com/realworldocaml/book/wiki/Installation-Instructions +;; https://dev.realworldocaml.org/install.html ;;; License: From 3203dc865699772e1673fb03a11afe8843472964 Mon Sep 17 00:00:00 2001 From: Henrik Thuesen Date: Tue, 30 Apr 2019 21:48:43 +0200 Subject: [PATCH 45/57] Replace the use of `magit-log-popup' with `magit-log' (#1231) This is also mentioned in bbatsov/prelude#1226 and originates from magit/magit#3695. --- modules/prelude-evil.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/prelude-evil.el b/modules/prelude-evil.el index 31304c6433..f970475ff9 100644 --- a/modules/prelude-evil.el +++ b/modules/prelude-evil.el @@ -114,10 +114,10 @@ (evil-add-hjkl-bindings magit-commit-mode-map 'emacs) (evil-add-hjkl-bindings magit-branch-manager-mode-map 'emacs "K" 'magit-discard - "L" 'magit-log-popup) + "L" 'magit-log) (evil-add-hjkl-bindings magit-status-mode-map 'emacs "K" 'magit-discard - "l" 'magit-log-popup + "l" 'magit-log "h" 'magit-diff-toggle-refine-hunk) (setq evil-shift-width 2) From caa30a4123639daa3991afb172cc26971e956c88 Mon Sep 17 00:00:00 2001 From: azzamsa Date: Sat, 4 May 2019 13:37:58 +0700 Subject: [PATCH 46/57] Replace usage of `magit-dispatch-popup` with `magit-dispatch` `magit-dispatch-popup` is an obsolete command (as of Magit 2.91.0) --- core/prelude-global-keybindings.el | 2 +- doc/prelude-cheatsheet.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/prelude-global-keybindings.el b/core/prelude-global-keybindings.el index a456cbb876..146781cd1b 100644 --- a/core/prelude-global-keybindings.el +++ b/core/prelude-global-keybindings.el @@ -103,7 +103,7 @@ (global-set-key (kbd "") 'menu-bar-mode) (global-set-key (kbd "C-x g") 'magit-status) -(global-set-key (kbd "C-x M-g") 'magit-dispatch-popup) +(global-set-key (kbd "C-x M-g") 'magit-dispatch) (global-set-key (kbd "C-=") 'er/expand-region) diff --git a/doc/prelude-cheatsheet.tex b/doc/prelude-cheatsheet.tex index 75330c7a5e..945fd0493d 100644 --- a/doc/prelude-cheatsheet.tex +++ b/doc/prelude-cheatsheet.tex @@ -77,7 +77,7 @@ \item[] prelude-fullscreen \item[] menu-bar-mode \item[C-x g] magit-status - \item[C-x M-g] magit-dispatch-popup + \item[C-x M-g] magit-dispatch \end{keylist} \subsection{prelude} From 315924ef6a92169f89ad88065e90a0f28da236e1 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 8 May 2019 18:10:24 +0300 Subject: [PATCH 47/57] Enable probot-stale It should help us clean-up the issue tracker and maintain a focused backlog of tasks. --- .github/stale.yml | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000000..fbd63422af --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,60 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 30 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) +onlyLabels: [] + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - "high priority" + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Set to true to ignore issues with an assignee (defaults to false) +exemptAssignees: false + +# Label to use when marking as stale +staleLabel: stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contribution and understanding! + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. + +# Comment to post when closing a stale Issue or Pull Request. +closeComment: > + This issues been automatically closed due to lack of activity. Feel free to re-open it + if you ever come back to it. + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 + +# Limit to only `issues` or `pulls` +# only: issues + +# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': +# pulls: +# daysUntilStale: 30 +# markComment: > +# This pull request has been automatically marked as stale because it has not had +# recent activity. It will be closed if no further activity occurs. Thank you +# for your contributions. + +# issues: +# exemptLabels: +# - confirmed From 5832a3f445695721b749ddc95dc6a87ce7fc90b1 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 8 May 2019 18:51:37 +0300 Subject: [PATCH 48/57] Update the stale bot config --- .github/stale.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/stale.yml b/.github/stale.yml index fbd63422af..b7e3eeebbb 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -5,7 +5,7 @@ daysUntilStale: 30 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 7 +daysUntilClose: 15 # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) onlyLabels: [] @@ -13,6 +13,7 @@ onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - "high priority" + - "pinned" # Set to true to ignore issues in a project (defaults to false) exemptProjects: false From 123d3aad4c48ceb93e70c781728506868c370051 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Thu, 9 May 2019 12:07:19 +0300 Subject: [PATCH 49/57] Spare good first issues from the wrath of stalebot --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index b7e3eeebbb..827d52d526 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -13,6 +13,7 @@ onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - "high priority" + - "good first issue" - "pinned" # Set to true to ignore issues in a project (defaults to false) From 54b2d465b499e071af88694da37e961e19590272 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 11 May 2019 10:44:55 +0300 Subject: [PATCH 50/57] Relax the stalebot config --- .github/stale.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/stale.yml b/.github/stale.yml index 827d52d526..8bbe234c06 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -1,11 +1,11 @@ # Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 30 +daysUntilStale: 90 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 15 +daysUntilClose: 30 # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) onlyLabels: [] @@ -20,10 +20,10 @@ exemptLabels: exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false +exemptMilestones: true # Set to true to ignore issues with an assignee (defaults to false) -exemptAssignees: false +exemptAssignees: true # Label to use when marking as stale staleLabel: stale From dee95d12cc619b9e02f4a94e1e4c26981b4f0548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 17 May 2019 19:42:44 +0200 Subject: [PATCH 51/57] lsp: bind lsp-execute-code-action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau --- modules/prelude-lsp.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/prelude-lsp.el b/modules/prelude-lsp.el index 6c9b72312e..2bd5f02491 100644 --- a/modules/prelude-lsp.el +++ b/modules/prelude-lsp.el @@ -48,6 +48,7 @@ (define-key lsp-ui-mode-map (kbd "C-c C-l w") 'lsp-ui-peek-find-workspace-symbol) (define-key lsp-ui-mode-map (kbd "C-c C-l i") 'lsp-ui-peek-find-implementation) (define-key lsp-ui-mode-map (kbd "C-c C-l d") 'lsp-describe-thing-at-point) +(define-key lsp-ui-mode-map (kbd "C-c C-l e") 'lsp-execute-code-action) (setq lsp-ui-sideline-enable t) (setq lsp-ui-doc-enable t) From be6c9a1d5e27cab289329f4a197407c437fd2f85 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Wed, 29 May 2019 09:22:46 +0300 Subject: [PATCH 52/57] Kill obsolete funding channels --- README.md | 10 ++-------- doc/contributing.md | 8 ++------ doc/index.md | 6 ++---- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index ca0ef810ec..2ca865411e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ [![License GPL 3][badge-license]](http://www.gnu.org/licenses/gpl-3.0.txt) -[![Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/bbatsov/donate) [![Patreon](https://img.shields.io/badge/patreon-donate-orange.svg)](https://www.patreon.com/bbatsov) Emacs Prelude @@ -17,13 +16,8 @@ advised to always run Prelude with the latest Emacs - currently **26.1**. You can support the development of Prelude via -[PayPal](https://www.paypal.me/bbatsov), -[Salt](https://bountysource.com/teams/prelude), -[Patreon](https://www.patreon.com/bbatsov) and -[Liberapay](https://liberapay.com/bbatsov/donate). - -[![Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/bbatsov/donate) -[![Patreon](https://img.shields.io/badge/patreon-donate-orange.svg)](https://www.patreon.com/bbatsov) +[PayPal](https://www.paypal.me/bbatsov) and +[Patreon](https://www.patreon.com/bbatsov). ## Fast Forward diff --git a/doc/contributing.md b/doc/contributing.md index 1b2297686b..21ceef7e6a 100644 --- a/doc/contributing.md +++ b/doc/contributing.md @@ -50,9 +50,5 @@ If you want to make changes to the manual's page structure you'll have to edit ## Donations You can support the development of Prelude via - [Salt](https://salt.bountysource.com/teams/prelude), - [Patreon](https://www.patreon.com/bbatsov) and - [Liberapay](https://liberapay.com/bbatsov/donate). - -[![Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/bbatsov/donate) -[![Patreon](https://img.shields.io/badge/patreon-donate-orange.svg)](https://www.patreon.com/bbatsov) +[PayPal](https://www.paypal.me/bbatsov) and + [Patreon](https://www.patreon.com/bbatsov). diff --git a/doc/index.md b/doc/index.md index 2e483ed109..33cbc6fce0 100644 --- a/doc/index.md +++ b/doc/index.md @@ -13,10 +13,8 @@ Emacs power users. advised to always run Prelude with the latest Emacs - currently **26.1**. You can support the development of Prelude via -[PayPal](https://www.paypal.me/bbatsov), -[Salt](https://bountysource.com/teams/prelude), -[Patreon](https://www.patreon.com/bbatsov) and -[Liberapay](https://liberapay.com/bbatsov/donate). +[PayPal](https://www.paypal.me/bbatsov) and +[Patreon](https://www.patreon.com/bbatsov). ## Philosophy From d42469c8f692406af734cc4e20a5468072ba8bee Mon Sep 17 00:00:00 2001 From: apiraino Date: Tue, 18 Jun 2019 18:33:11 +0200 Subject: [PATCH 53/57] Extend rust module keybindings (#1237) --- modules/prelude-rust.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/prelude-rust.el b/modules/prelude-rust.el index c72a73640d..b8df89fe20 100644 --- a/modules/prelude-rust.el +++ b/modules/prelude-rust.el @@ -58,7 +58,9 @@ (defun prelude-rust-mode-defaults () (unless (featurep 'prelude-lsp) - (local-set-key (kbd "C-c C-d") 'racer-describe)) + (local-set-key (kbd "C-c C-d") 'racer-describe) + (local-set-key (kbd "C-c .") 'racer-find-definition) + (local-set-key (kbd "C-c ,") 'pop-tag-mark)) ;; Prevent #! from chmodding rust files to be executable (remove-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p) From 2fc6ba95f3867a85c4031cc0a95bf56429f41832 Mon Sep 17 00:00:00 2001 From: apiraino Date: Sun, 16 Jun 2019 17:42:19 +0200 Subject: [PATCH 54/57] Fix typo --- utils/installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/installer.sh b/utils/installer.sh index df4c73430a..fda04bae5b 100755 --- a/utils/installer.sh +++ b/utils/installer.sh @@ -243,4 +243,4 @@ printf "$BBLUE | |_) | __/ _ \ | | | |/ _ |/ _ \ \n" printf "$BBLUE | __/| | | __/ | |_| | (_| | __/ \n" printf "$BBLUE |_| |_| \___|_|\__,_|\__,_|\___| \n\n" printf "$GREEN ... is now installed and ready to do thy bidding, Master $USER!$RESET\n" -printf "$GREEN Don't forget to adjust the modules you want to use in $PRELUDE_INSTALL_DIR/sample/prelude-modules.el!$RESET\n" +printf "$GREEN Don't forget to adjust the modules you want to use in $PRELUDE_INSTALL_DIR/personal/prelude-modules.el!$RESET\n" From 4b13c9c58215eeaa8570e6ab2efab2aec7289e5f Mon Sep 17 00:00:00 2001 From: apiraino Date: Sun, 16 Jun 2019 17:59:32 +0200 Subject: [PATCH 55/57] clarify install docs --- doc/installation.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/installation.md b/doc/installation.md index 0e74d67761..ed4a43ee09 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -112,8 +112,11 @@ By default most of the modules that ship with Prelude are not loaded. For more i (require 'prelude-xml) ``` -You'll need to adjust your `prelude-modules.el` file once the -installation is done. If you are doing a manual install then you first +You'll need to adjust your `prelude-modules.el` file once the installation is done. + +In case of an automated installation, you'll find this file in the `personal` directory of your Emacs installation. + +If you are doing a manual install then you first need to copy the `prelude-modules.el` available in the sample directory to the root of `path/to/prelude/installation` and then adjust that one. From d0f702f6a4f395441fe2714bf5cb420f9e39ff7f Mon Sep 17 00:00:00 2001 From: Benjamin Howell Date: Sat, 27 Jul 2019 18:25:33 -0400 Subject: [PATCH 56/57] Add Handlebars .hbs parsing using web-mode web-mode.el already supports .hbs (handlebars) files. This extension is used for general handlebars files and is used in ember.js projects. Added .hbs to the web-mode.el file extension list. --- modules/prelude-web.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/prelude-web.el b/modules/prelude-web.el index 64adb2c9f2..1742180c05 100644 --- a/modules/prelude-web.el +++ b/modules/prelude-web.el @@ -39,6 +39,7 @@ (add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.tpl\\'" . web-mode)) +(add-to-list 'auto-mode-alist '("\\.hbs\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.blade\\.php\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.jsp\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode)) From c951f8e52e7deed9463ca4630db992408ec9a956 Mon Sep 17 00:00:00 2001 From: apiraino Date: Tue, 18 Jun 2019 20:55:48 +0200 Subject: [PATCH 57/57] Update PDF cheatsheet with new Rust bindings --- doc/prelude-cheatsheet.pdf | Bin 106614 -> 106752 bytes doc/prelude-cheatsheet.tex | 2 ++ 2 files changed, 2 insertions(+) diff --git a/doc/prelude-cheatsheet.pdf b/doc/prelude-cheatsheet.pdf index c83a979415df28df4a7928528a11c1eeb2593665..25ebd64a6a35191c6cf600e4e78b38917f6aaa5d 100644 GIT binary patch delta 31565 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≻rif>8}VgadDlkWo4ZDMDj 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 fIb$bUQ*9Y=`$kVO8Zmo9_d?d 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 a00$-ETH0zpFd+;x8#4?!xtM}D%>Mwz9ar`M diff --git a/doc/prelude-cheatsheet.tex b/doc/prelude-cheatsheet.tex index 945fd0493d..b9d4aeb075 100644 --- a/doc/prelude-cheatsheet.tex +++ b/doc/prelude-cheatsheet.tex @@ -337,6 +337,8 @@ \subsection{prelude-rust} \begin{keylist} \item[C-c C-d] racer-describe + \item[C-c .] racer-find-definition + \item[C-c ,] pop-tag-mark \end{keylist} \end{multicols}