From f3a1c670d926c1eb72138bad9c44e9a98fb7a98f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 29 Dec 2019 22:22:51 +0100 Subject: [PATCH] [emacs] Start switching to M-Emacs. --- .emacs.d/early-init.el | 68 + .emacs.d/elisp/init-ace-window.el | 47 + .emacs.d/elisp/init-all-the-icons.el | 65 + .emacs.d/elisp/init-avy.el | 58 + .emacs.d/elisp/init-cc.el | 82 ++ .emacs.d/elisp/init-comment.el | 49 + .emacs.d/elisp/init-company.el | 223 +++ .emacs.d/elisp/init-const.el | 112 ++ .emacs.d/elisp/init-crux.el | 56 + .emacs.d/elisp/init-dashboard.el | 90 ++ .emacs.d/elisp/init-dired.el | 102 ++ .emacs.d/elisp/init-discover-my-major.el | 47 + .emacs.d/elisp/init-dumb-jump.el | 52 + .emacs.d/elisp/init-eaf.el | 67 + .emacs.d/elisp/init-edit.el | 73 + .emacs.d/elisp/init-ein.el | 48 + .emacs.d/elisp/init-epaint.el | 58 + .emacs.d/elisp/init-erc.el | 140 ++ .emacs.d/elisp/init-ess.el | 50 + .emacs.d/elisp/init-eww.el | 58 + .emacs.d/elisp/init-flycheck.el | 64 + .emacs.d/elisp/init-fonts.el | 82 ++ .emacs.d/elisp/init-format.el | 47 + .emacs.d/elisp/init-func.el | 184 +++ .emacs.d/elisp/init-games.el | 68 + .emacs.d/elisp/init-global-config.el | 176 +++ .emacs.d/elisp/init-header.el | 54 + .emacs.d/elisp/init-indent.el | 75 + .emacs.d/elisp/init-java.el | 56 + .emacs.d/elisp/init-latex.el | 79 + .emacs.d/elisp/init-leetcode.el | 57 + .emacs.d/elisp/init-lsp.el | 114 ++ .emacs.d/elisp/init-magit.el | 51 + .emacs.d/elisp/init-mu4e.el | 130 ++ .emacs.d/elisp/init-org.el | 114 ++ .emacs.d/elisp/init-package.el | 100 ++ .emacs.d/elisp/init-parens.el | 116 ++ .emacs.d/elisp/init-pdf.el | 60 + .emacs.d/elisp/init-popup-kill-ring.el | 47 + .emacs.d/elisp/init-projectile.el | 60 + .emacs.d/elisp/init-pyim.el | 69 + .emacs.d/elisp/init-python.el | 91 ++ .emacs.d/elisp/init-quickrun.el | 49 + .emacs.d/elisp/init-scroll.el | 58 + .emacs.d/elisp/init-search.el | 114 ++ .emacs.d/elisp/init-shell.el | 79 + .emacs.d/elisp/init-theme.el | 70 + .emacs.d/elisp/init-tramp.el | 62 + .emacs.d/elisp/init-treemacs.el | 105 ++ .emacs.d/elisp/init-ui-config.el | 103 ++ .emacs.d/elisp/init-undo-tree.el | 49 + .emacs.d/elisp/init-webdev.el | 81 + .emacs.d/elisp/init-which-key.el | 52 + .emacs.d/elisp/init-winner.el | 61 + .emacs.d/elisp/init-yasnippet.el | 66 + .emacs.d/elisp/init-zone.el | 59 + .emacs.d/init-bak.el | 461 ++++++ .emacs.d/init.el | 667 +++------ .emacs.d/site-elisp/aweshell | 1 + .emacs.d/site-elisp/awesome-pair | 1 + .emacs.d/site-elisp/color-rg | 1 + .emacs.d/site-elisp/delete-block | 1 + .../site-elisp/emacs-application-framework | 1 + .emacs.d/site-elisp/epaint | 1 + .emacs.d/site-elisp/grep-dired | 1 + .emacs.d/site-elisp/header2 | 1 + .emacs.d/site-elisp/instant-rename-tag | 1 + .emacs.d/site-elisp/leetcode.el | 1 + .../lilypond-mode/lilypond-font-lock.el | 190 +++ .../lilypond-mode/lilypond-indent.el | 587 ++++++++ .../site-elisp/lilypond-mode/lilypond-init.el | 21 + .../site-elisp/lilypond-mode/lilypond-mode.el | 1206 +++++++++++++++ .../site-elisp/lilypond-mode/lilypond-song.el | 556 +++++++ .../lilypond-mode/lilypond-what-beat.el | 260 ++++ .../lilypond-mode/lilypond-words.el | 1308 +++++++++++++++++ .emacs.d/site-elisp/multi-term | 1 + .emacs.d/site-elisp/snails | 1 + .gitmodules | 36 + 78 files changed, 9306 insertions(+), 445 deletions(-) create mode 100644 .emacs.d/early-init.el create mode 100644 .emacs.d/elisp/init-ace-window.el create mode 100644 .emacs.d/elisp/init-all-the-icons.el create mode 100644 .emacs.d/elisp/init-avy.el create mode 100644 .emacs.d/elisp/init-cc.el create mode 100644 .emacs.d/elisp/init-comment.el create mode 100644 .emacs.d/elisp/init-company.el create mode 100644 .emacs.d/elisp/init-const.el create mode 100644 .emacs.d/elisp/init-crux.el create mode 100644 .emacs.d/elisp/init-dashboard.el create mode 100644 .emacs.d/elisp/init-dired.el create mode 100644 .emacs.d/elisp/init-discover-my-major.el create mode 100644 .emacs.d/elisp/init-dumb-jump.el create mode 100644 .emacs.d/elisp/init-eaf.el create mode 100644 .emacs.d/elisp/init-edit.el create mode 100644 .emacs.d/elisp/init-ein.el create mode 100644 .emacs.d/elisp/init-epaint.el create mode 100644 .emacs.d/elisp/init-erc.el create mode 100644 .emacs.d/elisp/init-ess.el create mode 100644 .emacs.d/elisp/init-eww.el create mode 100644 .emacs.d/elisp/init-flycheck.el create mode 100644 .emacs.d/elisp/init-fonts.el create mode 100644 .emacs.d/elisp/init-format.el create mode 100644 .emacs.d/elisp/init-func.el create mode 100644 .emacs.d/elisp/init-games.el create mode 100644 .emacs.d/elisp/init-global-config.el create mode 100644 .emacs.d/elisp/init-header.el create mode 100644 .emacs.d/elisp/init-indent.el create mode 100644 .emacs.d/elisp/init-java.el create mode 100644 .emacs.d/elisp/init-latex.el create mode 100644 .emacs.d/elisp/init-leetcode.el create mode 100644 .emacs.d/elisp/init-lsp.el create mode 100644 .emacs.d/elisp/init-magit.el create mode 100644 .emacs.d/elisp/init-mu4e.el create mode 100644 .emacs.d/elisp/init-org.el create mode 100644 .emacs.d/elisp/init-package.el create mode 100644 .emacs.d/elisp/init-parens.el create mode 100644 .emacs.d/elisp/init-pdf.el create mode 100644 .emacs.d/elisp/init-popup-kill-ring.el create mode 100644 .emacs.d/elisp/init-projectile.el create mode 100644 .emacs.d/elisp/init-pyim.el create mode 100644 .emacs.d/elisp/init-python.el create mode 100644 .emacs.d/elisp/init-quickrun.el create mode 100644 .emacs.d/elisp/init-scroll.el create mode 100644 .emacs.d/elisp/init-search.el create mode 100644 .emacs.d/elisp/init-shell.el create mode 100644 .emacs.d/elisp/init-theme.el create mode 100644 .emacs.d/elisp/init-tramp.el create mode 100644 .emacs.d/elisp/init-treemacs.el create mode 100644 .emacs.d/elisp/init-ui-config.el create mode 100644 .emacs.d/elisp/init-undo-tree.el create mode 100644 .emacs.d/elisp/init-webdev.el create mode 100644 .emacs.d/elisp/init-which-key.el create mode 100644 .emacs.d/elisp/init-winner.el create mode 100644 .emacs.d/elisp/init-yasnippet.el create mode 100644 .emacs.d/elisp/init-zone.el create mode 100644 .emacs.d/init-bak.el create mode 160000 .emacs.d/site-elisp/aweshell create mode 160000 .emacs.d/site-elisp/awesome-pair create mode 160000 .emacs.d/site-elisp/color-rg create mode 160000 .emacs.d/site-elisp/delete-block create mode 160000 .emacs.d/site-elisp/emacs-application-framework create mode 160000 .emacs.d/site-elisp/epaint create mode 160000 .emacs.d/site-elisp/grep-dired create mode 160000 .emacs.d/site-elisp/header2 create mode 160000 .emacs.d/site-elisp/instant-rename-tag create mode 160000 .emacs.d/site-elisp/leetcode.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-font-lock.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-indent.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-init.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-mode.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-song.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-what-beat.el create mode 100644 .emacs.d/site-elisp/lilypond-mode/lilypond-words.el create mode 160000 .emacs.d/site-elisp/multi-term create mode 160000 .emacs.d/site-elisp/snails diff --git a/.emacs.d/early-init.el b/.emacs.d/early-init.el new file mode 100644 index 0000000..65cda0a --- /dev/null +++ b/.emacs.d/early-init.el @@ -0,0 +1,68 @@ +;;; early-init.el --- -*- lexical-binding: t -*- +;; +;; Filename: early-init.el +;; Description: Early initialization +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Sun Jun 9 17:58:05 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Sep 17 01:13:45 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d init early-init +;; Compatibility: emacs-version >= 27 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; Emacs27 introduces early-init.el, which is run before init.el, +;; before package and UI initialization happens. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; DeferGC +(setq gc-cons-threshold 100000000) +;; -DeferGC + +;; UnsetPES +(setq package-enable-at-startup nil) +;; -UnsetPES + +;; UnsetFNHA +(defvar file-name-handler-alist-original file-name-handler-alist) +(setq file-name-handler-alist nil) +;; -UnsetFNHA + +;; UnsetSRF +(setq site-run-file nil) +;; -UnsetSRF + +;; DisableUnnecessaryInterface +(menu-bar-mode -1) +(unless (and (display-graphic-p) (eq system-type 'darwin)) + (push '(menu-bar-lines . 0) default-frame-alist)) +(push '(tool-bar-lines . 0) default-frame-alist) +(push '(vertical-scroll-bars) default-frame-alist) +;; -DisableUnnecessaryInterface + +(provide 'early-init) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; early-init.el ends here diff --git a/.emacs.d/elisp/init-ace-window.el b/.emacs.d/elisp/init-ace-window.el new file mode 100644 index 0000000..7909616 --- /dev/null +++ b/.emacs.d/elisp/init-ace-window.el @@ -0,0 +1,47 @@ +;;; init-ace-window.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-ace-window.el +;; Description: Initialize Ace-Window +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Apr 23 10:00:42 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:02:47 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d ace-window +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes ace-window +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; AceWindowPac +(use-package ace-window + :bind ("C-x C-o" . ace-window)) +;; -AceWindowPac + +(provide 'init-ace-window) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-ace-window.el ends here diff --git a/.emacs.d/elisp/init-all-the-icons.el b/.emacs.d/elisp/init-all-the-icons.el new file mode 100644 index 0000000..f5c4c8c --- /dev/null +++ b/.emacs.d/elisp/init-all-the-icons.el @@ -0,0 +1,65 @@ +;;; init-all-the-icons.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-all-the-icons.el +;; Description: Initialize All-The-Icons +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 17:06:08 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 11:47:45 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d all-the-icons +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes all-the-icons, all-the-icons-dired, all-the-icons-ivy +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; ATIPac +(use-package all-the-icons :if *sys/gui*) +;; -ATIPac + +;; ATIDiredPac +(use-package all-the-icons-dired + :after all-the-icons + :if *sys/gui* + :diminish + :custom-face + (all-the-icons-dired-dir-face ((t `(:foreground ,(face-background 'default))))) + :hook (dired-mode . all-the-icons-dired-mode) + :config + ;; Workaround for all-the-icons bug until PR merged https://github.com/domtronn/all-the-icons.el/pull/150 + (when (require 'all-the-icons nil 'noerror) + (setq all-the-icons-mode-icon-alist + (delete '(erc-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0 :face all-the-icons-white) all-the-icons-mode-icon-alist)) + (add-to-list 'all-the-icons-mode-icon-alist '(erc-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0)))) +;; -ATIDiredPac + +(provide 'init-all-the-icons) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-all-the-icons.el ends here diff --git a/.emacs.d/elisp/init-avy.el b/.emacs.d/elisp/init-avy.el new file mode 100644 index 0000000..43d2445 --- /dev/null +++ b/.emacs.d/elisp/init-avy.el @@ -0,0 +1,58 @@ +;;; init-avy.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-avy.el +;; Description: Initialize Avy +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 11:12:49 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Nov 7 05:55:40 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d avy +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes avy +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-global-config)) + +;; AvyPac +(use-package avy + :defer t + :bind + (("C-z c" . avy-goto-char-timer) + ("C-z l" . avy-goto-line)) + :custom + (avy-timeout-seconds 0.3) + (avy-style 'pre) + :custom-face + (avy-lead-face ((t (:background "#51afef" :foreground "#870000" :weight bold))))); +;; -AvyPac + +(provide 'init-avy) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-avy.el ends here diff --git a/.emacs.d/elisp/init-cc.el b/.emacs.d/elisp/init-cc.el new file mode 100644 index 0000000..9e0f66b --- /dev/null +++ b/.emacs.d/elisp/init-cc.el @@ -0,0 +1,82 @@ +;;; init-cc.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-cc.el +;; Description: Initialize C family languages +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:58:29 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Dec 26 02:07:34 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d c c++ go ccls +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initialize ccls modern-cpp-font-lock go-mode +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; CCLSPac +(use-package ccls + :defer t + :if (not *sys/win32*) + :hook ((c-mode c++-mode objc-mode) . + (lambda () (require 'ccls) (lsp))) + :custom + (ccls-executable (executable-find "ccls")) ; Add ccls to path if you haven't done so + (ccls-sem-highlight-method 'font-lock) + (ccls-enable-skipped-ranges nil) + :config + (lsp-register-client + (make-lsp-client + :new-connection (lsp-tramp-connection (cons ccls-executable ccls-args)) + :major-modes '(c-mode c++-mode cuda-mode objc-mode) + :server-id 'ccls-remote + :multi-root nil + :remote? t + :notification-handlers + (lsp-ht ("$ccls/publishSkippedRanges" #'ccls--publish-skipped-ranges) + ("$ccls/publishSemanticHighlight" #'ccls--publish-semantic-highlight)) + :initialization-options (lambda () ccls-initialization-options) + :library-folders-fn nil))) +;; -CCLSPac + +;; CPPFontLockPac +(use-package modern-cpp-font-lock + :diminish t + :init (modern-c++-font-lock-global-mode t)) +;; -CPPFontLockPac + +;; GoPac +(use-package go-mode + :mode "\\.go\\'" + :hook (before-save . gofmt-before-save)) +;; -GoPac + +(provide 'init-cc) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-cc.el ends here diff --git a/.emacs.d/elisp/init-comment.el b/.emacs.d/elisp/init-comment.el new file mode 100644 index 0000000..9200a5e --- /dev/null +++ b/.emacs.d/elisp/init-comment.el @@ -0,0 +1,49 @@ +;;; init-comment.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-comment.el +;; Description: Initialize Evil-Nerd-Commenter +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Apr 5 00:21:58 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Wed Oct 16 16:44:25 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d evil-nerd-commenter +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes evil-nerd-commenter +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; EvilNerdCommenPac +(use-package evil-nerd-commenter + :bind + (("C-c M-;" . c-toggle-comment-style) + ("M-;" . evilnc-comment-or-uncomment-lines))) +;; -EvilNerdCommenPac + +(provide 'init-comment) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-comment.el ends here diff --git a/.emacs.d/elisp/init-company.el b/.emacs.d/elisp/init-company.el new file mode 100644 index 0000000..80feebd --- /dev/null +++ b/.emacs.d/elisp/init-company.el @@ -0,0 +1,223 @@ +;;; init-company.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-company.el +;; Description: Initialize Company +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:02:00 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Fri Dec 27 22:11:06 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d company company-tabnine +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes company +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; ComPac +(use-package company + :diminish company-mode + :hook ((prog-mode LaTeX-mode latex-mode ess-r-mode) . company-mode) + :bind + (:map company-active-map + ([tab] . smarter-yas-expand-next-field-complete) + ("TAB" . smarter-yas-expand-next-field-complete)) + :custom + (company-minimum-prefix-length 1) + (company-tooltip-align-annotations t) + (company-begin-commands '(self-insert-command)) + (company-require-match 'never) + ;; Don't use company in the following modes + (company-global-modes '(not shell-mode eaf-mode)) + ;; Trigger completion immediately. + (company-idle-delay 0.1) + ;; Number the candidates (use M-1, M-2 etc to select completions). + (company-show-numbers t) + :config + (unless *clangd* (delete 'company-clang company-backends)) + (global-company-mode 1) + (defun smarter-yas-expand-next-field-complete () + "Try to `yas-expand' and `yas-next-field' at current cursor position. + +If failed try to complete the common part with `company-complete-common'" + (interactive) + (if yas-minor-mode + (let ((old-point (point)) + (old-tick (buffer-chars-modified-tick))) + (yas-expand) + (when (and (eq old-point (point)) + (eq old-tick (buffer-chars-modified-tick))) + (ignore-errors (yas-next-field)) + (when (and (eq old-point (point)) + (eq old-tick (buffer-chars-modified-tick))) + (company-complete-common)))) + (company-complete-common)))) +;; -ComPac + +;; CompanyLSPPac +(use-package company-lsp + :defer t + :custom (company-lsp-cache-candidates 'auto)) +;; -CompanyLSPPac + +;; CompanyTabNinePac +(use-package company-tabnine + :defer 1 + :custom + (company-tabnine-max-num-results 9) + :bind + (("M-q" . company-other-backend) + ("C-z t" . company-tabnine)) + :hook + (lsp-after-open . (lambda () + (setq company-tabnine-max-num-results 3) + (add-to-list 'company-transformers 'company//sort-by-tabnine t) + (add-to-list 'company-backends '(company-lsp :with company-tabnine :separate)))) + (kill-emacs . company-tabnine-kill-process) + :config + ;; Enable TabNine on default + (add-to-list 'company-backends #'company-tabnine) + + ;; Integrate company-tabnine with lsp-mode + (defun company//sort-by-tabnine (candidates) + (if (or (functionp company-backend) + (not (and (listp company-backend) (memq 'company-tabnine company-backend)))) + candidates + (let ((candidates-table (make-hash-table :test #'equal)) + candidates-lsp + candidates-tabnine) + (dolist (candidate candidates) + (if (eq (get-text-property 0 'company-backend candidate) + 'company-tabnine) + (unless (gethash candidate candidates-table) + (push candidate candidates-tabnine)) + (push candidate candidates-lsp) + (puthash candidate t candidates-table))) + (setq candidates-lsp (nreverse candidates-lsp)) + (setq candidates-tabnine (nreverse candidates-tabnine)) + (nconc (seq-take candidates-tabnine 3) + (seq-take candidates-lsp 6)))))) +;; -CompanyTabNinePac + +;; CompanyBoxPac +(use-package company-box + :diminish + :functions (my-company-box--make-line + my-company-box-icons--elisp) + :commands (company-box--get-color + company-box--resolve-colors + company-box--add-icon + company-box--apply-color + company-box--make-line + company-box-icons--elisp) + :hook (company-mode . company-box-mode) + :custom + (company-box-backends-colors nil) + (company-box-show-single-candidate t) + (company-box-max-candidates 50) + (company-box-doc-delay 0.3) + :config + ;; Support `company-common' + (defun my-company-box--make-line (candidate) + (-let* (((candidate annotation len-c len-a backend) candidate) + (color (company-box--get-color backend)) + ((c-color a-color i-color s-color) (company-box--resolve-colors color)) + (icon-string (and company-box--with-icons-p (company-box--add-icon candidate))) + (candidate-string (concat (propertize (or company-common "") 'face 'company-tooltip-common) + (substring (propertize candidate 'face 'company-box-candidate) (length company-common) nil))) + (align-string (when annotation + (concat " " (and company-tooltip-align-annotations + (propertize " " 'display `(space :align-to (- right-fringe ,(or len-a 0) 1))))))) + (space company-box--space) + (icon-p company-box-enable-icon) + (annotation-string (and annotation (propertize annotation 'face 'company-box-annotation))) + (line (concat (unless (or (and (= space 2) icon-p) (= space 0)) + (propertize " " 'display `(space :width ,(if (or (= space 1) (not icon-p)) 1 0.75)))) + (company-box--apply-color icon-string i-color) + (company-box--apply-color candidate-string c-color) + align-string + (company-box--apply-color annotation-string a-color))) + (len (length line))) + (add-text-properties 0 len (list 'company-box--len (+ len-c len-a) + 'company-box--color s-color) + line) + line)) + (advice-add #'company-box--make-line :override #'my-company-box--make-line) + + ;; Prettify icons + (defun my-company-box-icons--elisp (candidate) + (when (derived-mode-p 'emacs-lisp-mode) + (let ((sym (intern candidate))) + (cond ((fboundp sym) 'Function) + ((featurep sym) 'Module) + ((facep sym) 'Color) + ((boundp sym) 'Variable) + ((symbolp sym) 'Text) + (t . nil))))) + (advice-add #'company-box-icons--elisp :override #'my-company-box-icons--elisp) + + (when (and *sys/gui* + (require 'all-the-icons nil t)) + (declare-function all-the-icons-faicon 'all-the-icons) + (declare-function all-the-icons-material 'all-the-icons) + (declare-function all-the-icons-octicon 'all-the-icons) + (setq company-box-icons-all-the-icons + `((Unknown . ,(all-the-icons-material "find_in_page" :height 0.85 :v-adjust -0.2)) + (Text . ,(all-the-icons-faicon "text-width" :height 0.8 :v-adjust -0.05)) + (Method . ,(all-the-icons-faicon "cube" :height 0.8 :v-adjust -0.05 :face 'all-the-icons-purple)) + (Function . ,(all-the-icons-faicon "cube" :height 0.8 :v-adjust -0.05 :face 'all-the-icons-purple)) + (Constructor . ,(all-the-icons-faicon "cube" :height 0.8 :v-adjust -0.05 :face 'all-the-icons-purple)) + (Field . ,(all-the-icons-octicon "tag" :height 0.8 :v-adjust 0 :face 'all-the-icons-lblue)) + (Variable . ,(all-the-icons-octicon "tag" :height 0.8 :v-adjust 0 :face 'all-the-icons-lblue)) + (Class . ,(all-the-icons-material "settings_input_component" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-orange)) + (Interface . ,(all-the-icons-material "share" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-lblue)) + (Module . ,(all-the-icons-material "view_module" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-lblue)) + (Property . ,(all-the-icons-faicon "wrench" :height 0.8 :v-adjust -0.05)) + (Unit . ,(all-the-icons-material "settings_system_daydream" :height 0.85 :v-adjust -0.2)) + (Value . ,(all-the-icons-material "format_align_right" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-lblue)) + (Enum . ,(all-the-icons-material "storage" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-orange)) + (Keyword . ,(all-the-icons-material "filter_center_focus" :height 0.85 :v-adjust -0.2)) + (Snippet . ,(all-the-icons-material "format_align_center" :height 0.85 :v-adjust -0.2)) + (Color . ,(all-the-icons-material "palette" :height 0.85 :v-adjust -0.2)) + (File . ,(all-the-icons-faicon "file-o" :height 0.85 :v-adjust -0.05)) + (Reference . ,(all-the-icons-material "collections_bookmark" :height 0.85 :v-adjust -0.2)) + (Folder . ,(all-the-icons-faicon "folder-open" :height 0.85 :v-adjust -0.05)) + (EnumMember . ,(all-the-icons-material "format_align_right" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-lblue)) + (Constant . ,(all-the-icons-faicon "square-o" :height 0.85 :v-adjust -0.05)) + (Struct . ,(all-the-icons-material "settings_input_component" :height 0.85 :v-adjust -0.2 :face 'all-the-icons-orange)) + (Event . ,(all-the-icons-faicon "bolt" :height 0.8 :v-adjust -0.05 :face 'all-the-icons-orange)) + (Operator . ,(all-the-icons-material "control_point" :height 0.85 :v-adjust -0.2)) + (TypeParameter . ,(all-the-icons-faicon "arrows" :height 0.8 :v-adjust -0.05)) + (Template . ,(all-the-icons-material "format_align_center" :height 0.85 :v-adjust -0.2))) + company-box-icons-alist 'company-box-icons-all-the-icons))) +;; -CompanyBoxPac + +(provide 'init-company) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-company.el ends here diff --git a/.emacs.d/elisp/init-const.el b/.emacs.d/elisp/init-const.el new file mode 100644 index 0000000..21a7449 --- /dev/null +++ b/.emacs.d/elisp/init-const.el @@ -0,0 +1,112 @@ +;;; init-const.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-const.el +;; Description: Initialize Constants +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Mon Mar 18 14:20:54 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Mon Dec 9 20:49:39 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d constants +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes constants +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; UserInfo +(setq user-full-name "MikaĆ«l Capelle") +(setq user-mail-address "capelle.mikael@gmail.com") +;; -UserInfo + +;; Consts +(defconst *sys/gui* + (display-graphic-p) + "Are we running on a GUI Emacs?") + +(defconst *sys/win32* + (eq system-type 'windows-nt) + "Are we running on a WinTel system?") + +(defconst *sys/linux* + (eq system-type 'gnu/linux) + "Are we running on a GNU/Linux system?") + +(defconst *sys/mac* + (eq system-type 'darwin) + "Are we running on a Mac system?") + +(defconst *sys/root* + (string-equal "root" (getenv "USER")) + "Are you a ROOT user?") + +(defconst *rg* + (executable-find "rg") + "Do we have ripgrep?") + +(defconst *python* + (executable-find "python") + "Do we have python?") + +(defconst *python3* + (executable-find "python3") + "Do we have python3?") + +(defconst *tr* + (executable-find "tr") + "Do we have tr?") + +(defconst *mvn* + (executable-find "mvn") + "Do we have Maven?") + +(defconst *clangd* + (or (executable-find "clangd") ;; usually + (executable-find "/usr/local/opt/llvm/bin/clangd")) ;; macOS + "Do we have clangd?") + +(defconst *gcc* + (executable-find "gcc") + "Do we have gcc?") + +(defconst *git* + (executable-find "git") + "Do we have git?") + +(defconst *pdflatex* + (executable-find "pdflatex") + "Do we have pdflatex?") + +(defconst *eaf-env* + (and *sys/linux* *sys/gui* *python3* + (executable-find "pip") + (not (equal (shell-command-to-string "pip freeze | grep '^PyQt\\|PyQtWebEngine'") ""))) + "Check basic requirements for EAF to run.") +;; -Consts + +(provide 'init-const) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-const.el ends here diff --git a/.emacs.d/elisp/init-crux.el b/.emacs.d/elisp/init-crux.el new file mode 100644 index 0000000..c3b0757 --- /dev/null +++ b/.emacs.d/elisp/init-crux.el @@ -0,0 +1,56 @@ +;;; init-crux.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-crux.el +;; Description: Initialize Crux +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Dec 24 13:15:38 2019 (-0500) +;; Version: 2.0.0 +;; Last-Updated: Thu Dec 26 22:02:32 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d crux +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes Crux +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; CruxPac +(use-package crux + :bind + (("C-a" . crux-move-beginning-of-line) + ("C-x 4 t" . crux-transpose-windows) + ("C-x K" . crux-kill-other-buffers) + ("C-k" . crux-smart-kill-line)) + :config + (crux-with-region-or-buffer indent-region) + (crux-with-region-or-buffer untabify) + (crux-with-region-or-point-to-eol kill-ring-save) + (defalias 'rename-file-and-buffer #'crux-rename-file-and-buffer)) +;; -CruxPac + +(provide 'init-crux) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-crux.el ends here diff --git a/.emacs.d/elisp/init-dashboard.el b/.emacs.d/elisp/init-dashboard.el new file mode 100644 index 0000000..c575c3b --- /dev/null +++ b/.emacs.d/elisp/init-dashboard.el @@ -0,0 +1,90 @@ +;;; init-dashboard.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-dashboard.el +;; Description: Initialize Dashboard +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 17:21:46 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Mon Dec 23 18:19:44 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d dashboard +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes dashboard +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; DashboardPac +(use-package dashboard + :demand + :diminish (dashboard-mode page-break-lines-mode) + :bind ("C-z d" . open-dashboard) + :custom + (dashboard-banner-logo-title "Close the world. Open the nExt.") + (dashboard-startup-banner (expand-file-name "images/KEC_Dark_BK_Small.png" user-emacs-directory)) + (dashboard-items '((recents . 7) + (bookmarks . 7) + (agenda . 5))) + (initial-buffer-choice (lambda () (get-buffer dashboard-buffer-name))) + (dashboard-set-heading-icons t) + (dashboard-set-navigator t) + (dashboard-navigator-buttons + (if (featurep 'all-the-icons) + `(((,(all-the-icons-octicon "mark-github" :height 1.1 :v-adjust -0.05) + "M-EMACS" "Browse M-EMACS Homepage" + (lambda (&rest _) (browse-url "https://github.com/MatthewZMD/.emacs.d"))) + (,(all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1) + "Configuration" "" (lambda (&rest _) (edit-configs))))) + `((("" "M-EMACS" "Browse M-EMACS Homepage" + (lambda (&rest _) (browse-url "https://github.com/MatthewZMD/.emacs.d"))) + ("" "Configuration" "" (lambda (&rest _) (edit-configs))))))) + :custom-face + (dashboard-banner-logo-title ((t (:family "Love LetterTW" :height 123)))) + :config + (dashboard-modify-heading-icons '((recents . "file-text") + (bookmarks . "book"))) + (dashboard-setup-startup-hook) + ;; Open Dashboard function + (defun open-dashboard () + "Open the *dashboard* buffer and jump to the first widget." + (interactive) + (if (get-buffer dashboard-buffer-name) + (kill-buffer dashboard-buffer-name)) + (dashboard-insert-startupify-lists) + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (delete-other-windows))) +;; -DashboardPac + +;; PBLPac +(use-package page-break-lines + :diminish + :init (global-page-break-lines-mode)) +;; -PBLPac + +(provide 'init-dashboard) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-dashboard.el ends here diff --git a/.emacs.d/elisp/init-dired.el b/.emacs.d/elisp/init-dired.el new file mode 100644 index 0000000..2076af6 --- /dev/null +++ b/.emacs.d/elisp/init-dired.el @@ -0,0 +1,102 @@ +;;; init-dired.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-dired.el +;; Description: Initialize Dired and Related Configurations +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 11:37:00 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Wed Dec 25 02:33:09 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d dired auto-save +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes dired, super-save, disk-usage +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; DiredPackage +(use-package dired + :ensure nil + :bind + (("C-x C-j" . dired-jump) + ("C-x j" . dired-jump-other-window)) + :custom + ;; Always delete and copy recursively + (dired-recursive-deletes 'always) + (dired-recursive-copies 'always) + ;; Auto refresh Dired, but be quiet about it + (global-auto-revert-non-file-buffers t) + (auto-revert-verbose nil) + ;; Quickly copy/move file in Dired + (dired-dwim-target t) + ;; Move files to trash when deleting + (delete-by-moving-to-trash t) + ;; Load the newest version of a file + (load-prefer-newer t) + ;; Detect external file changes and auto refresh file + (auto-revert-use-notify nil) + (auto-revert-interval 3) ; Auto revert every 3 sec + :config + ;; Enable global auto-revert + (global-auto-revert-mode t) + ;; Reuse same dired buffer, to prevent numerous buffers while navigating in dired + (put 'dired-find-alternate-file 'disabled nil) + :hook + (dired-mode . (lambda () + (local-set-key (kbd "") #'dired-find-alternate-file) + (local-set-key (kbd "RET") #'dired-find-alternate-file) + (local-set-key (kbd "^") + (lambda () (interactive) (find-alternate-file "..")))))) +;; -DiredPackage + +;; DiskUsage +(use-package disk-usage + :commands (disk-usage)) +;; -DiskUsage + +;; SuperSave +(use-package super-save + :diminish + :custom + (super-save-auto-save-when-idle t) + (auto-save-default nil) + (make-backup-files nil) + :config + (super-save-mode 1)) +;; -SuperSave + +;; SaveAllBuffers +(defun save-all-buffers () + "Instead of `save-buffer', save all opened buffers by calling `save-some-buffers' with ARG t." + (interactive) + (save-some-buffers t)) +(global-set-key (kbd "C-x C-s") nil) +(global-set-key (kbd "C-x C-s") #'save-all-buffers) +;; -SaveAllBuffers + +(provide 'init-dired) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-dired.el ends here diff --git a/.emacs.d/elisp/init-discover-my-major.el b/.emacs.d/elisp/init-discover-my-major.el new file mode 100644 index 0000000..4e6a5ca --- /dev/null +++ b/.emacs.d/elisp/init-discover-my-major.el @@ -0,0 +1,47 @@ +;;; init-discover-my-major.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-discover-my-major.el +;; Description: Initialize Discover-My-Major +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 15:38:29 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:05:23 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d discover-my-major +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes discover-my-major +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; DiscMyMajor +(use-package discover-my-major + :bind ("C-h C-m" . discover-my-major)) +;; -DiscMyMajor + +(provide 'init-discover-my-major) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-discover-my-major.el ends here diff --git a/.emacs.d/elisp/init-dumb-jump.el b/.emacs.d/elisp/init-dumb-jump.el new file mode 100644 index 0000000..90a8e97 --- /dev/null +++ b/.emacs.d/elisp/init-dumb-jump.el @@ -0,0 +1,52 @@ +;;; init-dumb-jump.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-dumb-jump.el +;; Description: Initialize Dumb Jump +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:11:21 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sat Aug 24 22:07:00 2019 (+0000) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes dumb-jump +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; DumbJump +(use-package dumb-jump + :bind + (:map prog-mode-map + (("C-c C-o" . dumb-jump-go-other-window) + ("C-c C-j" . dumb-jump-go) + ("C-c C-i" . dumb-jump-go-prompt))) + :custom (dumb-jump-selector 'ivy)) +;; -DumbJump + +(provide 'init-dumb-jump) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-dumb-jump.el ends here diff --git a/.emacs.d/elisp/init-eaf.el b/.emacs.d/elisp/init-eaf.el new file mode 100644 index 0000000..0f0a88d --- /dev/null +++ b/.emacs.d/elisp/init-eaf.el @@ -0,0 +1,67 @@ +;;; init-eaf.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-eaf.el +;; Description: Initialize Emacs Application Framework +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Jun 4 00:26:09 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Fri Dec 27 22:07:41 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d pdf-tools +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes Emacs Application Framework +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; EAFPac +(use-package eaf + :load-path (lambda () (expand-file-name "site-elisp/emacs-application-framework" user-emacs-directory)) + :if *eaf-env* + :custom + (eaf-find-alternate-file-in-dired t) + (browse-url-browser-function 'eaf-open-browser) ;; Make EAF Browser my default browser + :config + (defalias 'browse-web #'eaf-open-browser) + ;; I already bind "RET", "", "^" to `dired-find-alternate-file' in `init-dired.el'. + ;; Comment this line out of you don't want to use EAF to open available files in dired. + ;; (global-set-key [remap dired-find-alternate-file] #'eaf-file-open-in-dired) + (eaf-bind-key scroll_up "RET" eaf-pdf-viewer-keybinding) + (eaf-bind-key scroll_down_page "DEL" eaf-pdf-viewer-keybinding) + (eaf-bind-key scroll_down_page "u" eaf-pdf-viewer-keybinding) + (eaf-bind-key scroll_up_page "d" eaf-pdf-viewer-keybinding) + (eaf-bind-key scroll_to_end "M->" eaf-pdf-viewer-keybinding) + (eaf-bind-key scroll_to_home "M-<" eaf-pdf-viewer-keybinding) + (eaf-bind-key quit-window "q" eaf-pdf-viewer-keybinding) + (eaf-bind-key take_photo "p" eaf-camera-keybinding)) +;; -EAFPac + +(provide 'init-eaf) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-eaf.el ends here diff --git a/.emacs.d/elisp/init-edit.el b/.emacs.d/elisp/init-edit.el new file mode 100644 index 0000000..5d15aa0 --- /dev/null +++ b/.emacs.d/elisp/init-edit.el @@ -0,0 +1,73 @@ +;;; init-edit.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-edit.el +;; Description: Initialize Editing Configuration +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 28 13:25:24 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 11:50:24 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d iedit +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes iedit, awesome-pair, delete-block +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: +(eval-when-compile + (require 'init-global-config)) + +;; IEditPac +(use-package iedit + :bind ("C-z ," . iedit-mode) + :diminish) +;; -IEditPac + +;; AwesomePairPac +(use-package awesome-pair + :load-path (lambda () (expand-file-name "site-elisp/awesome-pair" user-emacs-directory)) + :bind + (:map prog-mode-map + (("M-D" . awesome-pair-kill) + ("SPC" . awesome-pair-space) + ("=" . awesome-pair-equal) + ("M-F" . awesome-pair-jump-right) + ("M-B" . awesome-pair-jump-left))) + :hook (prog-mode . awesome-pair-mode)) +;; -AwesomePairPac + +;; DeleteBlockPac +(use-package delete-block + :load-path (lambda () (expand-file-name "site-elisp/delete-block" user-emacs-directory)) + :bind + (("M-d" . delete-block-forward) + ("C-" . delete-block-backward) + ("M-" . delete-block-backward) + ("M-DEL" . delete-block-backward))) +;; -DeleteBlockPac + +(provide 'init-edit) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-edit.el ends here diff --git a/.emacs.d/elisp/init-ein.el b/.emacs.d/elisp/init-ein.el new file mode 100644 index 0000000..8d3c72c --- /dev/null +++ b/.emacs.d/elisp/init-ein.el @@ -0,0 +1,48 @@ +;;; init-ein.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-ein.el +;; Description: Initialize Emacs IPython Notebook Client +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 21 14:04:50 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:05:40 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d ein jupyter +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes Jupyter (formerly IPython) client for Emacs +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; EINPac +(use-package ein + :disabled + :defer t) +;; -EINPac + +(provide 'init-ein) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-ein.el ends here diff --git a/.emacs.d/elisp/init-epaint.el b/.emacs.d/elisp/init-epaint.el new file mode 100644 index 0000000..2ba0185 --- /dev/null +++ b/.emacs.d/elisp/init-epaint.el @@ -0,0 +1,58 @@ +;;; init-epaint.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-epaint.el +;; Description: Initialize epaint +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Mon Sep 16 15:47:34 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Mon Sep 16 16:17:43 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d epaint +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes epaint +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; EPaintPac +(use-package epaint + :if *sys/gui* + :load-path (lambda () (expand-file-name "site-elisp/epaint" user-emacs-directory)) + :commands (epaint) + :init + (with-eval-after-load (quote epaint-context) + (unless (boundp (quote cl-struct-epaint-drawable)) + (defvar cl-struct-epaint-drawable (quote epaint-drawable))) + (unless (boundp (quote cl-struct-epaint-gc)) + (defvar cl-struct-epaint-gc (quote epaint-gc))))) +;; -EPaintPac + +(provide 'init-epaint) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-epaint.el ends here diff --git a/.emacs.d/elisp/init-erc.el b/.emacs.d/elisp/init-erc.el new file mode 100644 index 0000000..d8f532b --- /dev/null +++ b/.emacs.d/elisp/init-erc.el @@ -0,0 +1,140 @@ +;;; init-erc.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-erc.el +;; Description: Initialize ERC +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Jul 30 22:15:50 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Wed Dec 4 01:57:57 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d erc irc +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes erc +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-global-config) + (require 'init-func)) + +;; ERCPac +(use-package erc + :ensure nil + :init + (use-package erc-hl-nicks :defer t) + (use-package erc-image :defer t) + :custom-face + (erc-notice-face ((t (:foreground "#ababab")))) + :custom + (erc-autojoin-channels-alist '(("freenode.net" "#emacs"))) + (erc-track-exclude-types '("NICK" "PART" "MODE" "324" "329" "332" "333" "353" "477")) + (erc-hide-list '("JOIN" "PART" "QUIT")) + (erc-lurker-hide-list '("JOIN" "PART" "QUIT")) + (erc-server-coding-system '(utf-8 . utf-8)) + (erc-interpret-mirc-color t) + (erc-kill-buffer-on-part t) + (erc-kill-queries-on-quit t) + (erc-kill-server-buffer-on-quit t) + (erc-autojoin-timing 'ident) + (erc-fill-function 'erc-fill-static) + (erc-fill-static-center 15) + (erc-lurker-threshold-time 43200) + (erc-server-reconnect-attempts 5) + (erc-server-reconnect-timeout 3) + (erc-prompt-for-password nil) + (erc-prompt-for-nickserv-password nil) + :config + ;; Prerequisite: Configure this to your IRC nickname + (defvar erc-nick "" + "The nickname used to login into ERC") + (add-to-list 'erc-modules 'notifications) + (erc-track-mode t) + (erc-services-mode 1) + (defun erc-start-or-switch () + "Start ERC or switch to ERC buffer if it has started already." + (interactive) + (if (get-buffer "irc.freenode.net:6697") + (erc-track-switch-buffer 1) + (erc-tls :server "irc.freenode.net" :port 6697 :nick erc-nick))) + + (defun erc-count-users () + "Displays the number of users and ops connected on the current channel." + (interactive) + (if (get-buffer "irc.freenode.net:6697") + (let ((channel (erc-default-target))) + (if (and channel (erc-channel-p channel)) + (let ((hash-table (with-current-buffer (erc-server-buffer) + erc-server-users)) + (users 0) + (ops 0)) + (maphash (lambda (k v) + (when (member (current-buffer) + (erc-server-user-buffers v)) + (cl-incf users)) + (when (erc-channel-user-op-p k) + (cl-incf ops))) + hash-table) + (message "%d users (%s ops) are online on %s" users ops channel)) + (user-error "The current buffer is not a channel"))) + (user-error "You must first be connected on IRC"))) + + (defun erc-get-ops () + "Displays the names of ops users on the current channel." + (interactive) + (if (get-buffer "irc.freenode.net:6697") + (let ((channel (erc-default-target))) + (if (and channel (erc-channel-p channel)) + (let (ops) + (maphash (lambda (nick cdata) + (if (and (cdr cdata) + (erc-channel-user-op (cdr cdata))) + (setq ops (cons nick ops)))) + erc-channel-users) + (if ops + (message "The online ops users are: %s" (mapconcat 'identity ops " ")) + (message "There are no ops users online on %s" channel))) + (user-error "The current buffer is not a channel"))) + (user-error "You must first be connected on IRC"))) + + (defun erc-notify (nickname message) + "Displays a notification message for ERC." + (let* ((channel (buffer-name)) + (nick (erc-hl-nicks-trim-irc-nick nickname)) + (title (if (string-match-p (concat "^" nickname) channel) + nick + (concat nick " (" channel ")"))) + (msg (s-trim (s-collapse-whitespace message)))) + (alert (concat nick ": " msg) :title title))) + :bind + ("M-z i" . erc-start-or-switch) + :hook + (ercn-notify . erc-notify)) +;; -ERCPac + +(provide 'init-erc) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-erc.el ends here diff --git a/.emacs.d/elisp/init-ess.el b/.emacs.d/elisp/init-ess.el new file mode 100644 index 0000000..7569a18 --- /dev/null +++ b/.emacs.d/elisp/init-ess.el @@ -0,0 +1,50 @@ +;;; init-ess.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-ess.el +;; Description: Initialize ESS +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Sep 3 21:28:26 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Wed Sep 4 00:27:58 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d ess +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initialies ESS +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; ESSPac +(use-package ess + :defer t + :commands R + :config + (load "ess-autoloads")) +;; -ESSPac + +(provide 'init-ess) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-ess.el ends here diff --git a/.emacs.d/elisp/init-eww.el b/.emacs.d/elisp/init-eww.el new file mode 100644 index 0000000..1afe3b2 --- /dev/null +++ b/.emacs.d/elisp/init-eww.el @@ -0,0 +1,58 @@ +;;; init-eww.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-eww.el +;; Description: Configure Eww +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 11:13:42 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 12:18:07 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d eww +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes eww +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; EWWPac +(use-package eww + :ensure nil + :commands (eww) + :hook (eww-mode . (lambda () + "Rename EWW's buffer so sites open in new page." + (rename-buffer "eww" t))) + :config + ;; I am using EAF-Browser instead of EWW + (unless *eaf-env* + (setq browse-url-browser-function 'eww-browse-url))) ; Hit & to browse url with system browser +;; -EWWPac + +(provide 'init-eww) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-eww.el ends here diff --git a/.emacs.d/elisp/init-flycheck.el b/.emacs.d/elisp/init-flycheck.el new file mode 100644 index 0000000..15d7871 --- /dev/null +++ b/.emacs.d/elisp/init-flycheck.el @@ -0,0 +1,64 @@ +;;; init-flycheck.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-flycheck.el +;; Description: Initialize Flycheck +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:08:22 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:05:47 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d flycheck +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes flycheck +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; FlyCheckPac +(use-package flycheck + :defer t + :hook (prog-mode . flycheck-mode) + :custom + (flycheck-emacs-lisp-load-path 'inherit) + :config + (add-hook 'flycheck-after-syntax-check-hook 'flycheck-autolist-hook) + (flycheck-add-mode 'javascript-eslint 'js-mode) + (flycheck-add-mode 'typescript-tslint 'rjsx-mode)) +;; -FlyCheckPac + +(use-package flycheck-pos-tip + :after (flycheck) + :config + (add-hook 'flycheck-mode-hook 'flycheck-pos-tip-mode)) + +(use-package flycheck-color-mode-line + :after (flycheck) + :config + (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)) + +(provide 'init-flycheck) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-flycheck.el ends here diff --git a/.emacs.d/elisp/init-fonts.el b/.emacs.d/elisp/init-fonts.el new file mode 100644 index 0000000..c967c5e --- /dev/null +++ b/.emacs.d/elisp/init-fonts.el @@ -0,0 +1,82 @@ +;;; init-fonts.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-fonts.el +;; Description: Initialize Fonts +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 17:32:54 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sat Dec 28 16:01:14 2019 (+0100) +;; By: MikaĆ«l Capelle +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d fonts +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes fonts +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; FontsList +;; Input Mono, Monaco Style, Line Height 1.3 download +;; from http://input.fontbureau.com/ +(defvar font-list '( + ("Input" . 11) + ("SF Mono" . 12) + ("Consolas" . 12) ("Love LetterTW" . 12.5)) + "List of fonts and sizes. The first one available will be used.") +;; -FontsList + +;; FontFun +(defun change-font () + "Documentation." + (interactive) + (let* (available-fonts font-name font-size font-setting) + (dolist (font font-list (setq available-fonts (nreverse available-fonts))) + (when (member (car font) (font-family-list)) + (push font available-fonts))) + (if (not available-fonts) + (message "No fonts from the chosen set are available") + (if (called-interactively-p 'interactive) + (let* ((chosen + (assoc-string + (completing-read "What font to use? " available-fonts nil t) + available-fonts))) + (setq font-name (car chosen) + font-size (read-number "Font size: " (cdr chosen)))) + (setq font-name (caar available-fonts) + font-size (cdar available-fonts))) + (setq font-setting (format "%s-%d" font-name font-size)) + (set-frame-font font-setting nil t) + (add-to-list 'default-frame-alist (cons 'font font-setting))))) + +(when *sys/gui* + (change-font)) +;; -FontFun + +(provide 'init-fonts) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-fonts.el ends here diff --git a/.emacs.d/elisp/init-format.el b/.emacs.d/elisp/init-format.el new file mode 100644 index 0000000..61fd406 --- /dev/null +++ b/.emacs.d/elisp/init-format.el @@ -0,0 +1,47 @@ +;;; init-format.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-format.el +;; Description: Initialize Formatter +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:27:40 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:05:52 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d format-all +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes format-all +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; FormatAllPac +(use-package format-all + :bind ("C-c C-f" . format-all-buffer)) +;; -FormatAllPac + +(provide 'init-format) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-format.el ends here diff --git a/.emacs.d/elisp/init-func.el b/.emacs.d/elisp/init-func.el new file mode 100644 index 0000000..a13de4e --- /dev/null +++ b/.emacs.d/elisp/init-func.el @@ -0,0 +1,184 @@ +;;; init-func.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-func.el +;; Description: Initialize Functions +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Sun Jun 9 17:53:44 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Fri Dec 27 01:02:58 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This file initializes functions +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-global-config)) + +;; ResizeWidthHeight +;; Resizes the window width based on the input +(defun resize-window-width (w) + "Resizes the window width based on W." + (interactive (list (if (> (count-windows) 1) + (read-number "Set the current window width in [1~9]x10%: ") + (error "You need more than 1 window to execute this function!")))) + (message "%s" w) + (window-resize nil (- (truncate (* (/ w 10.0) (frame-width))) (window-total-width)) t)) + +;; Resizes the window height based on the input +(defun resize-window-height (h) + "Resizes the window height based on H." + (interactive (list (if (> (count-windows) 1) + (read-number "Set the current window height in [1~9]x10%: ") + (error "You need more than 1 window to execute this function!")))) + (message "%s" h) + (window-resize nil (- (truncate (* (/ h 10.0) (frame-height))) (window-total-height)) nil)) + +;; Setup shorcuts for window resize width and height +(global-set-key (kbd "C-z w") #'resize-window-width) +(global-set-key (kbd "C-z h") #'resize-window-height) + +(defun resize-window (width delta) + "Resize the current window's size. If WIDTH is non-nil, resize width by some DELTA." + (if (> (count-windows) 1) + (window-resize nil delta width) + (error "You need more than 1 window to execute this function!"))) + +;; Setup shorcuts for window resize width and height +(global-set-key (kbd "M-W =") (lambda () (interactive) (resize-window t 5))) +(global-set-key (kbd "M-W M-+") (lambda () (interactive) (resize-window t 5))) +(global-set-key (kbd "M-W -") (lambda () (interactive) (resize-window t -5))) +(global-set-key (kbd "M-W M-_") (lambda () (interactive) (resize-window t -5))) + +(global-set-key (kbd "M-H =") (lambda () (interactive) (resize-window nil 5))) +(global-set-key (kbd "M-H M-+") (lambda () (interactive) (resize-window nil 5))) +(global-set-key (kbd "M-H -") (lambda () (interactive) (resize-window nil -5))) +(global-set-key (kbd "M-H M-_") (lambda () (interactive) (resize-window nil -5))) +;; -ResizeWidthheight + +;; EditConfig +(defun edit-configs () + "Opens the README.org file." + (interactive) + (find-file "~/.emacs.d/init.org")) + +(global-set-key (kbd "C-z e") #'edit-configs) +;; -EditConfig + +;; OrgIncludeAuto +(defun save-and-update-includes () + "Update the line numbers of #+INCLUDE:s in current buffer. +Only looks at INCLUDEs that have either :range-begin or :range-end. +This function does nothing if not in `org-mode', so you can safely +add it to `before-save-hook'." + (interactive) + (when (derived-mode-p 'org-mode) + (save-excursion + (goto-char (point-min)) + (while (search-forward-regexp + "^\\s-*#\\+INCLUDE: *\"\\([^\"]+\\)\".*:range-\\(begin\\|end\\)" + nil 'noerror) + (let* ((file (expand-file-name (match-string-no-properties 1))) + lines begin end) + (forward-line 0) + (when (looking-at "^.*:range-begin *\"\\([^\"]+\\)\"") + (setq begin (match-string-no-properties 1))) + (when (looking-at "^.*:range-end *\"\\([^\"]+\\)\"") + (setq end (match-string-no-properties 1))) + (setq lines (decide-line-range file begin end)) + (when lines + (if (looking-at ".*:lines *\"\\([-0-9]+\\)\"") + (replace-match lines :fixedcase :literal nil 1) + (goto-char (line-end-position)) + (insert " :lines \"" lines "\"")))))))) + +(add-hook 'before-save-hook #'save-and-update-includes) + +(defun decide-line-range (file begin end) + "Visit FILE and decide which lines to include. +BEGIN and END are regexps which define the line range to use." + (let (l r) + (save-match-data + (with-temp-buffer + (insert-file-contents file) + (goto-char (point-min)) + (if (null begin) + (setq l "") + (search-forward-regexp begin) + (setq l (line-number-at-pos (match-beginning 0)))) + (if (null end) + (setq r "") + (search-forward-regexp end) + (setq r (1+ (line-number-at-pos (match-end 0))))) + (format "%s-%s" (+ l 1) (- r 1)))))) ;; Exclude wrapper +;; -OrgIncludeAuto + +;; BetterMiniBuffer +(defun abort-minibuffer-using-mouse () + "Abort the minibuffer when using the mouse." + (when (and (>= (recursion-depth) 1) (active-minibuffer-window)) + (abort-recursive-edit))) + +(add-hook 'mouse-leave-buffer-hook 'abort-minibuffer-using-mouse) + +;; keep the point out of the minibuffer +(setq-default minibuffer-prompt-properties '(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt)) +;; -BetterMiniBuffer + +;; DisplayLineOverlay +(defun display-line-overlay+ (pos str &optional face) + "Display line at POS as STR with FACE. + +FACE defaults to inheriting from default and highlight." + (let ((ol (save-excursion + (goto-char pos) + (make-overlay (line-beginning-position) + (line-end-position))))) + (overlay-put ol 'display str) + (overlay-put ol 'face + (or face '(:background null :inherit highlight))) + ol)) +;; -DisplayLineOverlay + +;; ReadLines +(defun read-lines (filePath) + "Return a list of lines of a file at FILEPATH." + (with-temp-buffer (insert-file-contents filePath) + (split-string (buffer-string) "\n" t))) +;; -ReadLines + +;; WhereAmI +(defun where-am-i () + "An interactive function showing function `buffer-file-name' or `buffer-name'." + (interactive) + (message (kill-new (if (buffer-file-name) (buffer-file-name) (buffer-name))))) +;; -WhereAmI + +(provide 'init-func) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-func.el ends here diff --git a/.emacs.d/elisp/init-games.el b/.emacs.d/elisp/init-games.el new file mode 100644 index 0000000..74bb4a5 --- /dev/null +++ b/.emacs.d/elisp/init-games.el @@ -0,0 +1,68 @@ +;;; init-games.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-games.el +;; Description: Initialize Games +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 11:16:53 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Dec 26 02:55:21 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d tetris speed-type 2048 +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes tetris, speed-type, 2048 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; TetrisConfig +(use-package tetris + :ensure nil + :commands (tetris) + :bind + (:map tetris-mode-map + ("C-p" . tetris-rotate-prev) + ("C-n" . tetris-rotate-down) + ("C-b" . tetris-move-left) + ("C-f" . tetris-move-right) + ("C-SPC" . tetris-move-bottom)) + :config + (defadvice tetris-end-game (around zap-scores activate) + (save-window-excursion ad-do-it))) +;; -TetrisConfig + +;; SpeedTypePac +(use-package speed-type + :commands (speed-type-text)) +;; -SpeedTypePac + +;; 2048Pac +(use-package 2048-game + :commands (2048-game)) +;; -2048Pac + +(provide 'init-games) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-games.el ends here diff --git a/.emacs.d/elisp/init-global-config.el b/.emacs.d/elisp/init-global-config.el new file mode 100644 index 0000000..0f949e6 --- /dev/null +++ b/.emacs.d/elisp/init-global-config.el @@ -0,0 +1,176 @@ +;;; init-global-config.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-global-config.el +;; Description: Initialize Global Configurations +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 14:01:54 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Wed Dec 25 03:02:50 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This file initializes global configurations +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; SudoEditPac +(use-package sudo-edit + :commands (sudo-edit)) +;; -SudoEditPac + +;; DefBindings +;; Unbind unneeded keys +(global-set-key (kbd "C-z") nil) +(global-set-key (kbd "M-z") nil) +(global-set-key (kbd "C-x C-z") nil) +(global-set-key (kbd "M-/") nil) +;; Use iBuffer instead of Buffer List +(global-set-key (kbd "C-x C-b") #'ibuffer) +;; Truncate lines +(global-set-key (kbd "C-x C-l") #'toggle-truncate-lines) +;; Adjust font size like web browsers +(global-set-key (kbd "C-+") #'text-scale-increase) +(global-set-key (kbd "C--") #'text-scale-decrease) +;; Move up/down paragraph +(global-set-key (kbd "M-n") #'forward-paragraph) +(global-set-key (kbd "M-p") #'backward-paragraph) +;; -DefBindings + +;; UTF8Coding +(unless *sys/win32* + (set-selection-coding-system 'utf-8) + (prefer-coding-system 'utf-8) + (set-language-environment "UTF-8") + (set-default-coding-systems 'utf-8) + (set-terminal-coding-system 'utf-8) + (set-keyboard-coding-system 'utf-8) + (setq locale-coding-system 'utf-8)) +;; Treat clipboard input as UTF-8 string first; compound text next, etc. +(when *sys/gui* + (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))) +;; -UTF8Coding + +;; EditExp +;; Remove useless whitespace before saving a file +(defun delete-trailing-whitespace-except-current-line () + "Sometimes `delete-trailing-whitespace' becomes very annoying. +It deletes trailing whitespace current line. Therefore I use this alternative." + (interactive) + (let ((begin (line-beginning-position)) + (end (line-end-position))) + (save-excursion + (when (< (point-min) begin) + (save-restriction + (narrow-to-region (point-min) (1- begin)) + (delete-trailing-whitespace) + (widen))) + (when (> (point-max) end) + (save-restriction + (narrow-to-region (+ end 2) (point-max)) + (delete-trailing-whitespace) + (widen)))))) +(add-hook 'before-save-hook #'delete-trailing-whitespace-except-current-line) + +;; Replace selection on insert +(delete-selection-mode 1) + +;; Map Alt key to Meta +(setq x-alt-keysym 'meta) +;; -EditExp + +;; History +(use-package recentf + :ensure nil + :hook (after-init . recentf-mode) + :custom + (recentf-auto-cleanup "05:00am") + (recentf-max-saved-items 200) + (recentf-exclude '((expand-file-name package-user-dir) + ".cache" + ".cask" + ".elfeed" + "bookmarks" + "cache" + "ido.*" + "persp-confs" + "recentf" + "undo-tree-hist" + "url" + "COMMIT_EDITMSG\\'"))) + +;; When buffer is closed, saves the cursor location +(save-place-mode 1) + +;; Set history-length longer +(setq-default history-length 500) +;; -History + +;; SmallConfigs +;; Turn Off Cursor Alarms +(setq ring-bell-function 'ignore) + +;; Show Keystrokes in Progress Instantly +(setq echo-keystrokes 0.1) + +;; Don't Lock Files +(setq-default create-lockfiles nil) + +;; Better Compilation +(setq-default compilation-always-kill t) ; kill compilation process before starting another + +(setq-default compilation-ask-about-save nil) ; save all buffers on `compile' + +(setq-default compilation-scroll-output t) + +;; ad-handle-definition warnings are generated when functions are redefined with `defadvice', +;; they are not helpful. +(setq ad-redefinition-action 'accept) + +;; Move Custom-Set-Variables to Different File +(setq custom-file (concat user-emacs-directory "custom-set-variables.el")) +(load custom-file 'noerror) + +;; So Long mitigates slowness due to extremely long lines. +;; Currently available in Emacs master branch *only*! +(when (fboundp 'global-so-long-mode) + (global-so-long-mode)) + +;; Add a newline automatically at the end of the file upon save. +(setq require-final-newline t) + +;; Default .args, .in, .out files to text-mode +(add-to-list 'auto-mode-alist '("\\.in\\'" . text-mode)) +(add-to-list 'auto-mode-alist '("\\.out\\'" . text-mode)) +(add-to-list 'auto-mode-alist '("\\.args\\'" . text-mode)) +;; -SmallConfigs + +(provide 'init-global-config) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-global-config.el ends here diff --git a/.emacs.d/elisp/init-header.el b/.emacs.d/elisp/init-header.el new file mode 100644 index 0000000..507999d --- /dev/null +++ b/.emacs.d/elisp/init-header.el @@ -0,0 +1,54 @@ +;;; init-header.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-header.el +;; Description: Initialize Header2 +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:32:02 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 11:54:28 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d header2 +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes header2 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; Header2Pac +(use-package header2 + :load-path (lambda () (expand-file-name "site-elisp/header2" user-emacs-directory)) + :custom + (header-copyright-notice (concat "Copyright (C) 2019 " (user-full-name) "\n")) + :hook (emacs-lisp-mode . auto-make-header) + :config + (add-to-list 'write-file-functions 'auto-update-file-header) + (autoload 'auto-make-header "header2") + (autoload 'auto-update-file-header "header2")) +;; -Header2Pac + +(provide 'init-header) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-header.el ends here diff --git a/.emacs.d/elisp/init-indent.el b/.emacs.d/elisp/init-indent.el new file mode 100644 index 0000000..d46f83b --- /dev/null +++ b/.emacs.d/elisp/init-indent.el @@ -0,0 +1,75 @@ +;;; init-indent.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-indent.el +;; Description: Initialize Indentation +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:29:56 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 3 21:41:41 2019 (-0500) +;; By: User Account1 +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d highlight-indent-guides indentation +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes highlight-indent-guides +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; HighLightIndentPac +(use-package highlight-indent-guides + :if *sys/gui* + :diminish + :hook ((prog-mode web-mode nxml-mode) . highlight-indent-guides-mode) + :custom + (highlight-indent-guides-method 'character) + (highlight-indent-guides-responsive 'top) + (highlight-indent-guides-delay 0) + (highlight-indent-guides-auto-character-face-perc 7)) +;; -HighLightIndentPac + +;; IndentConfig +(setq-default indent-tabs-mode nil) +(setq-default indent-line-function 'insert-tab) +(setq-default tab-width 4) +(setq-default c-basic-offset 4) +(setq-default js-switch-indent-offset 4) +(c-set-offset 'comment-intro 0) +(c-set-offset 'innamespace 0) +(c-set-offset 'case-label '+) +(c-set-offset 'access-label 0) +(c-set-offset (quote cpp-macro) 0 nil) +(add-hook 'after-change-major-mode-hook + (lambda () (if (equal electric-indent-mode 't) + (when (derived-mode-p 'text-mode) + (electric-indent-mode -1)) + (electric-indent-mode 1)))) +;; -IndentConfig + +(provide 'init-indent) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-indent.el ends here diff --git a/.emacs.d/elisp/init-java.el b/.emacs.d/elisp/init-java.el new file mode 100644 index 0000000..5fe5e38 --- /dev/null +++ b/.emacs.d/elisp/init-java.el @@ -0,0 +1,56 @@ +;;; init-java.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-java.el +;; Description: Initialize lsp-java java-one-click-run +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Jul 4 21:26:24 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:06:55 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d lsp-java java-one-click-run +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes lsp-java and java-one-click-run +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; LSPJavaPac +(use-package lsp-java + :after lsp-mode + :if *mvn* + :config + (use-package request :defer t) + :custom + (lsp-java-server-install-dir (expand-file-name "~/.emacs.d/eclipse.jdt.ls/server/")) + (lsp-java-workspace-dir (expand-file-name "~/.emacs.d/eclipse.jdt.ls/workspace/"))) +;; -LSPJavaPac + +(provide 'init-java) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-java.el ends here diff --git a/.emacs.d/elisp/init-latex.el b/.emacs.d/elisp/init-latex.el new file mode 100644 index 0000000..ce09182 --- /dev/null +++ b/.emacs.d/elisp/init-latex.el @@ -0,0 +1,79 @@ +;;; init-latex.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-latex.el +;; Description: Initialize AUCTex +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Wed Sep 4 16:35:00 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 12:00:08 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d auctex +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes AUCTex +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const) + (require 'init-global-config) + (require 'init-func)) + +;; AUCTeXPac +(use-package tex + :ensure auctex + :defer t + :custom + (TeX-auto-save t) + (TeX-parse-self t) + (TeX-master nil) + ;; to use pdfview with auctex + (TeX-view-program-selection '((output-pdf "pdf-tools")) + TeX-source-correlate-start-server t) + (TeX-view-program-list '(("pdf-tools" "TeX-pdf-tools-sync-view"))) + (TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) + :hook + (LaTeX-mode . (lambda () + (turn-on-reftex) + (setq reftex-plug-into-AUCTeX t) + (reftex-isearch-minor-mode) + (setq TeX-PDF-mode t) + (setq TeX-source-correlate-method 'synctex) + (setq TeX-source-correlate-start-server t))) + :config + (when (version< emacs-version "26") + (add-hook LaTeX-mode-hook #'display-line-numbers-mode))) +;; -AUCTeXPac + +;; OrgLatexPac +(use-package org-edit-latex + :defer t + :after org) +;; -OrgLatexPac + +(provide 'init-latex) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-latex.el ends here diff --git a/.emacs.d/elisp/init-leetcode.el b/.emacs.d/elisp/init-leetcode.el new file mode 100644 index 0000000..ecba587 --- /dev/null +++ b/.emacs.d/elisp/init-leetcode.el @@ -0,0 +1,57 @@ +;;; init-leetcode.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-leetcode.el +;; Description: Initialize LeetCode Client +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Apr 11 22:28:41 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sat Sep 7 00:52:17 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d leetcode +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes a LeetCode client +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; LeetCodePac +(use-package leetcode + :load-path (lambda () (expand-file-name "site-elisp/leetcode.el" user-emacs-directory)) + :commands (leetcode) + :init + (use-package graphql :defer t) + (use-package aio :defer t) + :custom + (url-debug t) + (leetcode-prefer-language "python3")) +;; -LeetCodePac + +(provide 'init-leetcode) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-leetcode.el ends here diff --git a/.emacs.d/elisp/init-lsp.el b/.emacs.d/elisp/init-lsp.el new file mode 100644 index 0000000..962dd66 --- /dev/null +++ b/.emacs.d/elisp/init-lsp.el @@ -0,0 +1,114 @@ +;;; init-lsp.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-lsp.el +;; Description: Initialize LSP +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:42:09 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Dec 26 01:56:25 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d lsp +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes lsp-mode and dap-mode +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; LSPPac +(use-package lsp-mode + :defer t + :commands lsp + :custom + (lsp-auto-guess-root nil) + (lsp-prefer-flymake nil) ; Use flycheck instead of flymake + (lsp-file-watch-threshold 2000) + (read-process-output-max (* 1024 1024)) + :bind (:map lsp-mode-map ("C-c C-f" . lsp-format-buffer)) + :hook ((java-mode python-mode go-mode + js-mode js2-mode typescript-mode web-mode + c-mode c++-mode objc-mode) . lsp)) +;; -LSPPac + +;; LSPUI +(use-package lsp-ui + :after lsp-mode + :diminish + :commands lsp-ui-mode + :custom-face + (lsp-ui-doc-background ((t (:background nil)))) + (lsp-ui-doc-header ((t (:inherit (font-lock-string-face italic))))) + :bind (:map lsp-ui-mode-map + ([remap xref-find-definitions] . lsp-ui-peek-find-definitions) + ([remap xref-find-references] . lsp-ui-peek-find-references) + ("C-c u" . lsp-ui-imenu)) + :custom + (lsp-ui-doc-enable t) + (lsp-ui-doc-header t) + (lsp-ui-doc-include-signature t) + (lsp-ui-doc-position 'top) + (lsp-ui-doc-border (face-foreground 'default)) + (lsp-ui-sideline-enable nil) + (lsp-ui-sideline-ignore-duplicate t) + (lsp-ui-sideline-show-code-actions nil) + :config + ;; Use lsp-ui-doc-webkit only in GUI + (if *sys/gui* + (setq lsp-ui-doc-use-webkit t)) + ;; WORKAROUND Hide mode-line of the lsp-ui-imenu buffer + ;; https://github.com/emacs-lsp/lsp-ui/issues/243 + (defadvice lsp-ui-imenu (after hide-lsp-ui-imenu-mode-line activate) + (setq mode-line-format nil))) +;; -LSPUI + +;; DAPPac +(use-package dap-mode + :diminish + :bind + (:map dap-mode-map + (("" . dap-debug) + ("" . dap-continue) + ("" . dap-next) + ("" . dap-step-in) + ("C-M-" . dap-step-out) + ("" . dap-breakpoint-toggle))) + :hook ((after-init . dap-mode) + (dap-mode . dap-ui-mode) + (python-mode . (lambda () (require 'dap-python))) + (ruby-mode . (lambda () (require 'dap-ruby))) + (go-mode . (lambda () (require 'dap-go))) + (java-mode . (lambda () (require 'dap-java))) + ((c-mode c++-mode objc-mode swift) . (lambda () (require 'dap-lldb))) + (php-mode . (lambda () (require 'dap-php))) + (elixir-mode . (lambda () (require 'dap-elixir))) + ((js-mode js2-mode typescript-mode) . (lambda () (require 'dap-chrome))))) +;; -DAPPac + +(provide 'init-lsp) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-lsp.el ends here diff --git a/.emacs.d/elisp/init-magit.el b/.emacs.d/elisp/init-magit.el new file mode 100644 index 0000000..9ac90af --- /dev/null +++ b/.emacs.d/elisp/init-magit.el @@ -0,0 +1,51 @@ +;;; init-magit.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-magit.el +;; Description: Initialize Magit +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 08:40:27 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:07:17 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d magit +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes magit +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; MagitPac +(use-package magit + :if *git* + :bind ("C-x g" . magit-status)) +;; -MagitPac + +(provide 'init-magit) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-magit.el ends here diff --git a/.emacs.d/elisp/init-mu4e.el b/.emacs.d/elisp/init-mu4e.el new file mode 100644 index 0000000..ff38b1f --- /dev/null +++ b/.emacs.d/elisp/init-mu4e.el @@ -0,0 +1,130 @@ +;;; init-mu4e.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-mu4e.el +;; Description: Initialize mu4e +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Mon Dec 2 15:17:14 2019 (-0500) +;; Version: 2.0.0 +;; Package-Requires: (mu4e) +;; Last-Updated: +;; By: +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d mu mu4e +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes mu4e for Email clients in Emacs +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; Mu4ePac +(use-package mu4e + :ensure nil + :commands (mu4e) + :init + (use-package mu4e-alert + :defer t + :config + (when (executable-find "notify-send") + (mu4e-alert-set-default-style 'libnotify)) + :hook + ((after-init . mu4e-alert-enable-notifications) + (after-init . mu4e-alert-enable-mode-line-display))) + (use-package mu4e-overview :defer t) + :bind ("M-z m" . mu4e) + :custom + (mu4e-maildir (expand-file-name "~/Maildir")) + (mu4e-get-mail-command "mbsync -c ~/.emacs.d/mu4e/.mbsyncrc -a") + (mu4e-view-prefer-html t) + (mu4e-update-interval 180) + (mu4e-headers-auto-update t) + (mu4e-compose-signature-auto-include nil) + (mu4e-compose-format-flowed t) + (mu4e-view-show-images t) + (mu4e-sent-messages-behavior 'delete) + (mu4e-change-filenames-when-moving t) ; work better for mbsync + (mu4e-attachment-dir "~/Downloads") + (message-kill-buffer-on-exit t) + (mu4e-compose-dont-reply-to-self t) + (mu4e-view-show-addresses t) + (mu4e-confirm-quit nil) + (mu4e-use-fancy-chars t) + :hook + ((mu4e-view-mode . visual-line-mode) + (mu4e-compose-mode . (lambda () + (visual-line-mode) + (use-hard-newlines -1) + (flyspell-mode))) + (mu4e-view-mode . (lambda() ;; try to emulate some of the eww key-bindings + (local-set-key (kbd "") 'shr-next-link) + (local-set-key (kbd "") 'shr-previous-link))) + (mu4e-headers-mode . (lambda () + (interactive) + (setq mu4e-headers-fields + `((:human-date . 25) ;; alternatively, use :date + (:flags . 6) + (:from . 22) + (:thread-subject . ,(- (window-body-width) 70)) ;; alternatively, use :subject + (:size . 7)))))) + :config + (add-to-list 'mu4e-view-actions + '("ViewInBrowser" . mu4e-action-view-in-browser) t) + (setq mu4e-contexts + (list + (make-mu4e-context + :name "gmail" + :enter-func (lambda () (mu4e-message "Entering context gmail")) + :leave-func (lambda () (mu4e-message "Leaving context gmail")) + :match-func + (lambda (msg) + (when msg + (mu4e-message-contact-field-matches + msg '(:from :to :cc :bcc) user-mail-address))) ; Set to your email address + :vars '((mu4e-refile-folder "/gmail/Archive") + (mu4e-sent-folder . "/gmail/[email].Sent Mail") + (mu4e-drafts-folder . "/gmail/[email].Drafts") + (mu4e-trash-folder . "/gmail/[email].Trash") + (mu4e-compose-signature . user-full-name) + (mu4e-compose-format-flowed . t) + (smtpmail-queue-dir . "~/Maildir/gmail/queue/cur") + (message-send-mail-function . smtpmail-send-it) + (smtpmail-smtp-user . "matthewzmd") ; Set to your username + (smtpmail-starttls-credentials . (("smtp.gmail.com" 587 nil nil))) + (smtpmail-auth-credentials . (expand-file-name "~/.authinfo.gpg")) + (smtpmail-default-smtp-server . "smtp.gmail.com") + (smtpmail-smtp-server . "smtp.gmail.com") + (smtpmail-smtp-service . 587) + (smtpmail-debug-info . t) + (smtpmail-debug-verbose . t) + (mu4e-maildir-shortcuts . ( ("/gmail/INBOX" . ?i) + ("/gmail/[email].Sent Mail" . ?s) + ("/gmail/[email].Trash" . ?t) + ("/gmail/[email].All Mail" . ?a) + ("/gmail/[email].Starred" . ?r) + ("/gmail/[email].Drafts" . ?d)))))))) +;; -Mu4ePac + +(provide 'init-mu4e) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-mu4e.el ends here diff --git a/.emacs.d/elisp/init-org.el b/.emacs.d/elisp/init-org.el new file mode 100644 index 0000000..3db0a54 --- /dev/null +++ b/.emacs.d/elisp/init-org.el @@ -0,0 +1,114 @@ +;;; init-org.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-org.el +;; Description: Initialize Org, Toc-org, HTMLize, OX-GFM +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 11:09:30 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 14:05:45 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d org toc-org htmlize ox-gfm +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes org toc-org htmlize ox-gfm +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; OrgPac +(use-package org + :ensure nil + :defer t + :bind + ("C-c l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c c" . org-capture) + ("C-c b" . org-switch) + (:map org-mode-map ("C-c C-p" . org-export-as-pdf-and-open)) + :custom + (org-log-done 'time) + (org-export-backends (quote (ascii html icalendar latex md odt))) + (org-use-speed-commands t) + (org-confirm-babel-evaluate 'nil) + (org-todo-keywords + '((sequence "TODO" "IN-PROGRESS" "REVIEW" "|" "DONE"))) + (org-agenda-window-setup 'other-window) + :config + (unless (version< org-version "9.2") + (require 'org-tempo)) + (when (file-directory-p "~/org/agenda/") + (setq org-agenda-files (list "~/org/agenda/"))) + + (defun org-export-turn-on-syntax-highlight () + "Setup variables to turn on syntax highlighting when calling `org-latex-export-to-pdf'." + (interactive) + (setq org-latex-listings 'minted + org-latex-packages-alist '(("" "minted")) + org-latex-pdf-process + '("pdflatex -shelnl-escape -interaction nonstopmode -output-directory %o %f" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))) + + (defun org-export-as-pdf-and-open () + "Run `org-latex-export-to-pdf', delete the tex file and open pdf in a new buffer." + (interactive) + (save-buffer) + (let* ((pdf-path (org-latex-export-to-pdf)) + (pdf-name (file-name-nondirectory pdf-path))) + (if (try-completion pdf-name (mapcar #'buffer-name (buffer-list))) + (progn + (kill-matching-buffers (concat "^" pdf-name) t t) + (find-file-other-window pdf-name)) + (find-file-other-window pdf-name)) + (delete-file (concat (substring pdf-path 0 (string-match "[^\.]*\/?$" pdf-path)) "tex"))))) +;; -OrgPac + +;; TocOrgPac +(use-package toc-org + :hook (org-mode . toc-org-mode)) +;; -TocOrgPac + +;; HTMLIZEPac +(use-package htmlize :defer t) +;; -HTMLIZEPac + +;; OXGFMPac +(use-package ox-gfm :defer t) +;; -OXGFMPac + +;; PlantUMLPac +(use-package plantuml-mode + :defer t + :custom + (org-plantuml-jar-path (expand-file-name "~/tools/plantuml/plantuml.jar")) + :config + (org-babel-do-load-languages + 'org-babel-load-languages + '(;; other Babel languages + (plantuml . t)))) +;; -PlantUMLPac + +(provide 'init-org) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-org.el ends here diff --git a/.emacs.d/elisp/init-package.el b/.emacs.d/elisp/init-package.el new file mode 100644 index 0000000..dfaf2c5 --- /dev/null +++ b/.emacs.d/elisp/init-package.el @@ -0,0 +1,100 @@ +;;; init-package.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-package.el +;; Description: Initialize Package Management for M-EMACS +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 10:53:00 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Dec 26 03:37:58 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d packages use-package +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This file initializes packages from melpa using use-package macro +;; as well as auto-package-update, diminish, gnu-elpa-keyring-update +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; MelpaPackages +;; Select the folder to store packages +;; Comment / Uncomment to use desired sites +(setq package-user-dir (expand-file-name "elpa" user-emacs-directory) + package-archives + '(("gnu" . "http://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("cselpa" . "https://elpa.thecybershadow.net/packages/") + ;; ("melpa-cn" . "http://mirrors.cloud.tencent.com/elpa/melpa/") + ;; ("gnu-cn" . "http://mirrors.cloud.tencent.com/elpa/gnu/") + )) +;; -MelpaPackages + +;; ConfigurePackageManager +(unless (bound-and-true-p package--initialized) + (setq package-enable-at-startup nil) ; To prevent initializing twice + (package-initialize)) + +;; set use-package-verbose to t for interpreted .emacs, +;; and to nil for byte-compiled .emacs.elc. +(eval-and-compile + (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))) +;; -ConfigurePackageManager + +;; ConfigureUsePackage +;; Install use-package if not installed +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + +(eval-and-compile + (setq use-package-always-ensure t) + (setq use-package-expand-minimally t) + (setq use-package-compute-statistics t) + (setq use-package-enable-imenu-support t)) + +(eval-when-compile + (require 'use-package) + (require 'bind-key)) +;; -ConfigureUsePackage + +;; AutoPackageUpdate +(use-package auto-package-update + :if (not (daemonp)) + :custom + (auto-package-update-interval 7) ;; in days + (auto-package-update-prompt-before-update t) + (auto-package-update-delete-old-versions t) + (auto-package-update-hide-results t) + :config + (auto-package-update-maybe)) +;; -AutoPackageUpdate + +;; DimPac +(use-package diminish) +;; -DimPac + +(provide 'init-package) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-package.el ends here diff --git a/.emacs.d/elisp/init-parens.el b/.emacs.d/elisp/init-parens.el new file mode 100644 index 0000000..1914011 --- /dev/null +++ b/.emacs.d/elisp/init-parens.el @@ -0,0 +1,116 @@ +;;; init-parens.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-parens.el +;; Description: Initialize Parenthesis +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 10:17:13 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 11:48:49 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d parenthesis smartparens delete-block +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes parenthesis smartparens delete-block +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-global-config)) + +;; SmartParensPac +(use-package smartparens + :hook (prog-mode . smartparens-mode) + :diminish smartparens-mode + :bind + (:map smartparens-mode-map + ("C-M-f" . sp-forward-sexp) + ("C-M-b" . sp-backward-sexp) + ("C-M-a" . sp-backward-down-sexp) + ("C-M-e" . sp-up-sexp) + ("C-M-w" . sp-copy-sexp) + ("C-M-k" . sp-change-enclosing) + ("M-k" . sp-kill-sexp) + ("C-M-" . sp-splice-sexp-killing-backward) + ("C-S-" . sp-splice-sexp-killing-around) + ("C-]" . sp-select-next-thing-exchange)) + :custom + (sp-escape-quotes-after-insert nil) + :config + ;; Stop pairing single quotes in elisp + (sp-local-pair 'emacs-lisp-mode "'" nil :actions nil) + (sp-local-pair 'org-mode "[" nil :actions nil) + ;; Smartparens is broken in `cc-mode' as of Emacs 27. See + ;; https://github.com/Fuco1/smartparens/issues/963 + (unless (version< emacs-version "27") + (dolist (fun '(c-electric-paren c-electric-brace)) + (add-to-list 'sp--special-self-insert-commands fun)))) +;; -SmartParensPac + +;; MatchParens +;; Show matching parenthesis +(show-paren-mode 1) +;; we will call `blink-matching-open` ourselves... +(remove-hook 'post-self-insert-hook + #'blink-paren-post-self-insert-function) + +;; this still needs to be set for `blink-matching-open` to work +(setq blink-matching-paren 'show) +(let ((ov nil)) ; keep track of the overlay + (advice-add + #'show-paren-function + :after + (defun show-paren--off-screen+ (&rest _args) + "Display matching line for off-screen paren." + (when (overlayp ov) + (delete-overlay ov)) + ;; check if it's appropriate to show match info, + ;; see `blink-paren-post-self-insert-function' + (when (and (overlay-buffer show-paren--overlay) + (not (or cursor-in-echo-area + executing-kbd-macro + noninteractive + (minibufferp) + this-command)) + (and (not (bobp)) + (memq (char-syntax (char-before)) '(?\) ?\$))) + (= 1 (logand 1 (- (point) + (save-excursion + (forward-char -1) + (skip-syntax-backward "/\\") + (point)))))) + ;; rebind `minibuffer-message' called by + ;; `blink-matching-open' to handle the overlay display + (cl-letf (((symbol-function #'minibuffer-message) + (lambda (msg &rest args) + (let ((msg (apply #'format-message msg args))) + (setq ov (display-line-overlay+ + (window-start) msg)))))) + (blink-matching-open)))))) +;; -MatchParens + +(provide 'init-parens) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-parens.el ends here diff --git a/.emacs.d/elisp/init-pdf.el b/.emacs.d/elisp/init-pdf.el new file mode 100644 index 0000000..d54ac31 --- /dev/null +++ b/.emacs.d/elisp/init-pdf.el @@ -0,0 +1,60 @@ +;;; init-pdf.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-pdf.el +;; Description: Initialize pdf-tools +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Jun 4 00:26:09 2019 (-0400) +;; Version: 1.0.0 +;; Last-Updated: Tue Dec 24 12:11:20 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d pdf-tools +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes pdf-tools +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; PDFToolsPac +(use-package pdf-tools-install + :ensure pdf-tools + :if (and *sys/gui* (not *sys/win32*)) + :mode "\\.pdf\\'" + :commands (pdf-loader-install) + :custom + (TeX-view-program-selection '((output-pdf "pdf-tools"))) + (TeX-view-program-list '(("pdf-tools" "TeX-pdf-tools-sync-view"))) + :hook + (pdf-view-mode . (lambda () (display-line-numbers-mode -1))) + :config + (pdf-loader-install)) +;; -PDFToolsPac + +(provide 'init-pdf) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-pdf.el ends here diff --git a/.emacs.d/elisp/init-popup-kill-ring.el b/.emacs.d/elisp/init-popup-kill-ring.el new file mode 100644 index 0000000..68c679b --- /dev/null +++ b/.emacs.d/elisp/init-popup-kill-ring.el @@ -0,0 +1,47 @@ +;;; init-popup-kill-ring.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-popup-kill-ring.el +;; Description: Initialize Popup-Kill-Ring +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 15:15:40 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:07:32 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d popup-kill-ring +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes popup-kill-ring +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; PopKillRing +(use-package popup-kill-ring + :bind ("M-y" . popup-kill-ring)) +;; -PopKillRing + +(provide 'init-popup-kill-ring) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-popup-kill-ring.el ends here diff --git a/.emacs.d/elisp/init-projectile.el b/.emacs.d/elisp/init-projectile.el new file mode 100644 index 0000000..771fb8a --- /dev/null +++ b/.emacs.d/elisp/init-projectile.el @@ -0,0 +1,60 @@ +;;; init-projectile.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-projectile.el +;; Description: Initialize Projectile +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 09:10:23 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:07:35 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d projectile +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes projectile +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; ProjPac +(use-package projectile + :bind + ("C-c p" . projectile-command-map) + ("C-z o" . projectile-find-file) + ("C-z p" . projectile-add-known-project) + :custom + (projectile-completion-system 'ivy) + :config + (projectile-mode 1) + (when (and *sys/win32* *tr*) + (setq projectile-indexing-method 'alien)) + (add-to-list 'projectile-globally-ignored-directories "node_modules")) +;; -ProjPac + +(provide 'init-projectile) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-projectile.el ends here diff --git a/.emacs.d/elisp/init-pyim.el b/.emacs.d/elisp/init-pyim.el new file mode 100644 index 0000000..9e39adb --- /dev/null +++ b/.emacs.d/elisp/init-pyim.el @@ -0,0 +1,69 @@ +;;; init-pyim.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-pyim.el +;; Description: Initialize Pyim +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Jun 20 00:36:05 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Dec 26 21:54:20 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d init +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes pyim +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; PyimPac +(use-package pyim + :init + (use-package posframe :defer t) + :custom + (default-input-method "pyim") + (pyim-default-scheme 'quanpin) + (pyim-page-tooltip 'posframe) + (pyim-page-length 9) + :config + (pyim-isearch-mode 1) + (setq-default pyim-english-input-switch-functions + '(pyim-probe-isearch-mode + pyim-probe-org-structure-template)) + (setq-default pyim-punctuation-half-width-functions + '(pyim-probe-punctuation-line-beginning + pyim-probe-punctuation-after-punctuation)) + :bind + ("M-j" . pyim-convert-string-at-point)) ; M-j å¼ŗåˆ¶å°†å…‰ę ‡å‰ēš„ę‹¼éŸ³å­—ē¬¦äø²č½¬ę¢äøŗäø­ę–‡ć€‚ +;; -PyimPac + +;; PyimBaseDictPac +(use-package pyim-basedict + :after pyim + :config (pyim-basedict-enable)) +;; -PyimBaseDictPac + +(provide 'init-pyim) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-pyim.el ends here diff --git a/.emacs.d/elisp/init-python.el b/.emacs.d/elisp/init-python.el new file mode 100644 index 0000000..f0b3782 --- /dev/null +++ b/.emacs.d/elisp/init-python.el @@ -0,0 +1,91 @@ +;;; init-python.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-python.el +;; Description: Initialize Python +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Mon Jun 10 18:58:02 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sun Dec 29 20:39:58 2019 (+0100) +;; By: MikaĆ«l Capelle +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: lsp-python-ms +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes lsp-python-ms +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-flycheck) + (require 'init-const)) + +;; PythonConfig +;; (use-package python-mode +;; :ensure nil +;; :after flycheck +;; :mode "\\.py\\'" +;; :custom +;; (python-indent-offset 4) +;; (flycheck-python-pycompile-executable "python3") +;; (python-shell-interpreter "python3")) +;; ;; -PythonConfig + +(add-hook 'python-mode-hook (lambda () (setq-local whitespace-line-column 100))) + +(use-package flycheck-mypy + :after flycheck + :config + (flycheck-add-next-checker 'python-flake8 'python-mypy)) + +(use-package elpy + :after flycheck + :mode "\\.py\\" + :custom + (flycheck-python-flake8-executable "python") + (python-indent-offset 4) + (python-shell-interpreter "ipython") + (python-shell-interpreter-args "-i --simple-prompt") + :config + (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) + (add-hook 'elpy-mode-hook 'flycheck-mode) + (add-to-list 'python-shell-completion-native-disabled-interpreters + "jupyter") + :init + (setq elpy-rpc-backend "jedi") + ;; (setq elpy-rpc-python-command "I:\\Languages\\Python\\Python37\\python.exe") + (elpy-enable)) +(add-hook 'python-mode-hook 'hs-minor-mode) + +;; LSPPythonPac +;; (use-package lsp-python-ms +;; :after lsp-mode python +;; :if (or *python3* *python*) +;; :custom +;; (lsp-python-executable-cmd "python3")) +;; ;; -LSPPythonPac + +(provide 'init-python) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-python.el ends here diff --git a/.emacs.d/elisp/init-quickrun.el b/.emacs.d/elisp/init-quickrun.el new file mode 100644 index 0000000..4d4eb6e --- /dev/null +++ b/.emacs.d/elisp/init-quickrun.el @@ -0,0 +1,49 @@ +;;; init-quickrun.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-quickrun.el +;; Description: Initialize quickrun +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Sun Jul 7 16:32:16 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:07:44 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d init +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes quickrun +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; QuickrunPac +(use-package quickrun + :bind + (("" . quickrun) + ("M-" . quickrun-shell))) +;; -QuickrunPac + +(provide 'init-quickrun) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-quickrun.el ends here diff --git a/.emacs.d/elisp/init-scroll.el b/.emacs.d/elisp/init-scroll.el new file mode 100644 index 0000000..f05dbeb --- /dev/null +++ b/.emacs.d/elisp/init-scroll.el @@ -0,0 +1,58 @@ +;;; init-scroll.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-scroll.el +;; Description: Initialize Smooth Scroll +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 08:30:08 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:07:50 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d smooth-scroll +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes smooth scroll +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; SmoothScroll +;; Vertical Scroll +(setq scroll-step 1) +(setq scroll-margin 1) +(setq scroll-conservatively 101) +(setq scroll-up-aggressively 0.01) +(setq scroll-down-aggressively 0.01) +(setq auto-window-vscroll nil) +(setq fast-but-imprecise-scrolling nil) +(setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) +(setq mouse-wheel-progressive-speed nil) +;; Horizontal Scroll +(setq hscroll-step 1) +(setq hscroll-margin 1) +;; -SmoothScroll + +(provide 'init-scroll) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-scroll.el ends here diff --git a/.emacs.d/elisp/init-search.el b/.emacs.d/elisp/init-search.el new file mode 100644 index 0000000..38660c8 --- /dev/null +++ b/.emacs.d/elisp/init-search.el @@ -0,0 +1,114 @@ +;;; init-search.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-search.el +;; Description: Initialize Packages for Searching +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 11:01:43 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sun Nov 10 14:31:56 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d color-rg rg +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes ivy swiper counsel color-rg snails +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-global-config) + (require 'init-const)) + +;; IvyPac +(use-package ivy + :diminish + :init + (use-package amx :defer t) + (use-package counsel :diminish :config (counsel-mode 1)) + (use-package swiper :defer t) + (ivy-mode 1) + :bind + (("C-s" . swiper-isearch) + ("C-z s" . counsel-rg) + ("C-z b" . counsel-buffer-or-recentf) + ("C-z C-b" . counsel-ibuffer) + (:map ivy-minibuffer-map + ("C-r" . ivy-previous-line-or-history) + ("M-RET" . ivy-immediate-done)) + (:map counsel-find-file-map + ("C-~" . counsel-goto-local-home))) + :custom + (ivy-use-virtual-buffers t) + (ivy-height 10) + (ivy-on-del-error-function nil) + (ivy-magic-slash-non-match-action 'ivy-magic-slash-non-match-create) + (ivy-count-format "怐%d/%d怑") + (ivy-wrap t) + :config + (defun counsel-goto-local-home () + "Go to the $HOME of the local machine." + (interactive) + (ivy--cd "~/"))) +;; -IvyPac + +;; ColorRGPac +(use-package color-rg + :load-path (lambda () (expand-file-name "site-elisp/color-rg" user-emacs-directory)) + :if *rg* + :bind ("C-M-s" . color-rg-search-input)) +;; -ColorRGPac + +;; SnailsPac +(use-package snails + :load-path (lambda () (expand-file-name "site-elisp/snails/" user-emacs-directory)) + :if *sys/gui* + :custom-face + (snails-content-buffer-face ((t (:background "#111" :height 110)))) + (snails-input-buffer-face ((t (:background "#222" :foreground "gold" :height 110)))) + (snails-header-line-face ((t (:inherit font-lock-function-name-face :underline t :height 1.1)))) + :config + (use-package exec-path-from-shell + :if (featurep 'cocoa) :defer t) + + ;; Functions for specific backends + (defun snails-current-project () + (interactive) + (snails '(snails-backend-projectile snails-backend-rg snails-backend-fd))) + (defun snails-active-recent-buffers () + (interactive) + (snails '(snails-backend-buffer snails-backend-recentf))) + (defun snails-everywhere () + (interactive) + (snails '(snails-backend-everything snails-backend-mdfind))) + :bind + (("M-s s" . snails) + ("M-s g" . snails-current-project) + ("M-s b" . snails-active-recent-buffers) + ("M-s e" . snails-everywhere))) +;; -SnailsPac + +(provide 'init-search) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-ag.el ends here diff --git a/.emacs.d/elisp/init-shell.el b/.emacs.d/elisp/init-shell.el new file mode 100644 index 0000000..9e98059 --- /dev/null +++ b/.emacs.d/elisp/init-shell.el @@ -0,0 +1,79 @@ +;;; init-shell.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-shell.el +;; Description: Initialize Shell +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Mar 19 09:20:19 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Oct 8 00:20:32 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d shell shell-here +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes shell-here, term-keys, multi-term, aweshell +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; AweshellPac +(use-package aweshell + :load-path (lambda () (expand-file-name "site-elisp/aweshell" user-emacs-directory)) + :commands (aweshell-new aweshell-dedicated-open) + :bind + (("M-#" . aweshell-dedicated-open) + (:map eshell-mode-map ("M-#" . aweshell-dedicated-close)))) +;; -AweshellPac + +;; ShellHerePac +(use-package shell-here + :bind ("M-~" . shell-here) + :config + (when *sys/linux* + (setq explicit-shell-file-name "/bin/bash"))) +;; -ShellHerePac + +;; MultiTermPac +(use-package multi-term + :load-path (lambda () (expand-file-name "site-elisp/multi-term" user-emacs-directory)) + :commands (multi-term) + :bind + (("M-$" . multi-term) + (:map dired-mode-map ("M-$" . multi-term))) + :custom + (multi-term-program (executable-find "bash"))) +;; -MultiTermPac + +;; TermKeysPac +(use-package term-keys + :if (not *sys/gui*) + :config (term-keys-mode t)) +;; -TermKeysPac + +(provide 'init-shell) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-shell.el ends here diff --git a/.emacs.d/elisp/init-theme.el b/.emacs.d/elisp/init-theme.el new file mode 100644 index 0000000..718ae1a --- /dev/null +++ b/.emacs.d/elisp/init-theme.el @@ -0,0 +1,70 @@ +;;; init-theme.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-theme.el +;; Description: Initialize Doom Themes and Modeline +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 17:11:56 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Fri Aug 23 10:49:38 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d doom-themes doom-modeline +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes doom-themes and doom-modeline +;; This is NOT Doom, but doom-themes and doom-modeine +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; DoomThemes +(use-package doom-themes + :custom-face + (cursor ((t (:background "BlanchedAlmond")))) + :config + ;; flashing mode-line on errors + (doom-themes-visual-bell-config) + ;; Corrects (and improves) org-mode's native fontification. + (doom-themes-org-config) + (load-theme 'doom-one t)) +;; -DoomThemes + +;; DoomModeline +(use-package doom-modeline + :hook (after-init . doom-modeline-mode) + :custom + ;; Don't compact font caches during GC. Windows Laggy Issue + (inhibit-compacting-font-caches t) + (doom-modeline-minor-modes t) + (doom-modeline-icon t) + (doom-modeline-major-mode-color-icon t) + (doom-modeline-height 15)) +;; -DoomModeline + +(provide 'init-theme) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-theme.el ends here diff --git a/.emacs.d/elisp/init-tramp.el b/.emacs.d/elisp/init-tramp.el new file mode 100644 index 0000000..0e330a4 --- /dev/null +++ b/.emacs.d/elisp/init-tramp.el @@ -0,0 +1,62 @@ +;;; init-tramp.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-tramp.el +;; Description: Initialize Tramp +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Aug 9 21:48:32 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Wed Oct 16 16:05:51 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d tramp +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes Tramp +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; TrampPac +(use-package tramp + :ensure nil + :defer 1 + :config + (add-to-list 'tramp-remote-path 'tramp-own-remote-path) + ;; TRAMP gcloud ssh + (add-to-list 'tramp-methods + '("gssh" + (tramp-login-program "gcloud compute ssh") + (tramp-login-args (("%h"))) + (tramp-async-args (("-q"))) + (tramp-remote-shell "/bin/bash") + (tramp-remote-shell-args ("-c")) + (tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null") + ("-o" "UserKnownHostsFile=/dev/null") + ("-o" "StrictHostKeyChecking=no"))) + (tramp-default-port 22)))) +;; -TrampPac + +(provide 'init-tramp) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-tramp.el ends here diff --git a/.emacs.d/elisp/init-treemacs.el b/.emacs.d/elisp/init-treemacs.el new file mode 100644 index 0000000..bc93c9d --- /dev/null +++ b/.emacs.d/elisp/init-treemacs.el @@ -0,0 +1,105 @@ +;;; init-treemacs.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-treemacs.el +;; Description: Initialize Treemacs +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 09:56:12 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 11:56:52 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d treemacs +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes treemacs +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; TreemacsPac +(use-package treemacs + :init + (with-eval-after-load 'winum + (define-key winum-keymap (kbd "M-0") #'treemacs-select-window)) + :custom + (treemacs-collapse-dirs 3) + (treemacs-deferred-git-apply-delay 0.5) + (treemacs-display-in-side-window t) + (treemacs-file-event-delay 5000) + (treemacs-file-follow-delay 0.2) + (treemacs-follow-after-init t) + (treemacs-follow-recenter-distance 0.1) + (treemacs-git-command-pipe "") + (treemacs-goto-tag-strategy 'refetch-index) + (treemacs-indentation 2) + (treemacs-indentation-string " ") + (treemacs-is-never-other-window nil) + (treemacs-max-git-entries 5000) + (treemacs-no-png-images nil) + (treemacs-no-delete-other-windows t) + (treemacs-project-follow-cleanup nil) + (treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory)) + (treemacs-recenter-after-file-follow nil) + (treemacs-recenter-after-tag-follow nil) + (treemacs-show-cursor nil) + (treemacs-show-hidden-files t) + (treemacs-silent-filewatch nil) + (treemacs-silent-refresh nil) + (treemacs-sorting 'alphabetic-desc) + (treemacs-space-between-root-nodes t) + (treemacs-tag-follow-cleanup t) + (treemacs-tag-follow-delay 1.5) + (treemacs-width 35) + :config + ;; The default width and height of the icons is 22 pixels. If you are + ;; using a Hi-DPI display, uncomment this to double the icon size. + ;;(treemacs-resize-icons 44) + (treemacs-follow-mode t) + (treemacs-filewatch-mode t) + (treemacs-fringe-indicator-mode t) + :bind + (("M-0" . treemacs-select-window) + ("C-x t 1" . treemacs-delete-other-windows) + ("C-x t t" . treemacs) + ("C-x t B" . treemacs-bookmark) + ("C-x t C-t" . treemacs-find-file) + ("C-x t M-t" . treemacs-find-tag)) + (:map treemacs-mode-map ("C-p" . treemacs-previous-line))) +;; -TreemacsPac + +;; TreeMagit +(use-package treemacs-magit + :defer t + :after (treemacs magit)) +;; -TreeMagit + +;; TreeProj +(use-package treemacs-projectile + :defer t + :after (treemacs projectile)) +;; -TreeProj + +(provide 'init-treemacs) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-treemacs.el ends here diff --git a/.emacs.d/elisp/init-ui-config.el b/.emacs.d/elisp/init-ui-config.el new file mode 100644 index 0000000..9b2e7d3 --- /dev/null +++ b/.emacs.d/elisp/init-ui-config.el @@ -0,0 +1,103 @@ +;;; init-ui-config.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-ui-config.el +;; Description: Initialize UI Configurations +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 16:12:56 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sat Dec 28 18:48:31 2019 (+0100) +;; By: MikaĆ«l Capelle +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d ui +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes prettify-symbols-mode and other UI configurations +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +(eval-when-compile + (require 'init-const)) + +;; PreSym +;; (global-prettify-symbols-mode 1) +;; (defun add-pretty-lambda () +;; "Make some word or string show as pretty Unicode symbols. See https://unicodelookup.com for more." +;; (setq prettify-symbols-alist +;; '( +;; ("lambda" . 955) +;; ("delta" . 120517) +;; ("epsilon" . 120518) +;; ("->" . 8594) +;; ("<=" . 8804) +;; (">=" . 8805) +;; ))) +;; (add-hook 'prog-mode-hook 'add-pretty-lambda) +;; (add-hook 'org-mode-hook 'add-pretty-lambda) +;; ;; -PreSym + +;; TitleBar +(setq-default frame-title-format '("M-EMACS - " user-login-name "@" system-name " - %b")) +;; -TitleBar + +;; YorN +(fset 'yes-or-no-p 'y-or-n-p) +;; -YorN + +;; StartupScreen +(setq inhibit-startup-screen t) +(setq initial-major-mode 'text-mode) +(setq initial-scratch-message "Present Day, Present Time...\n") +;; -StartupScreen + +;; DisLineNum +;; Hook line numbers to only when files are opened, also use linum-mode for emacs-version< 26 +(if (version< emacs-version "26") + (global-linum-mode) + (add-hook 'text-mode-hook #'display-line-numbers-mode) + (add-hook 'prog-mode-hook #'display-line-numbers-mode)) +;; Display column numbers in modeline +(column-number-mode 1) +;; -DisLineNum + +;; Whitespace +(setq-default fill-column 95) +(setq-default whitespace-line-column 95) +(add-hook 'python-mode-hook (lambda () (setq-local whitespace-line-column 100))) +(add-hook 'LaTeX-mode-hook (lambda () (setq-local whitespace-line-column -1))) +(add-hook 'markdown-mode-hook (lambda () (setq-local whitespace-line-column -1))) +(add-hook 'web-mode-hook (lambda () (setq-local whitespace-line-column -1))) +(add-hook 'text-mode-hook #'whitespace-mode) +(add-hook 'prog-mode-hook #'whitespace-mode) +(add-hook 'before-save-hook 'whitespace-cleanup) +;; -Whitespace + +;; DisTimeBat +(display-time-mode 1) +(display-battery-mode 1) +;; -DisTimeBat + +(provide 'init-ui-config) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-ui-config.el ends here diff --git a/.emacs.d/elisp/init-undo-tree.el b/.emacs.d/elisp/init-undo-tree.el new file mode 100644 index 0000000..a327279 --- /dev/null +++ b/.emacs.d/elisp/init-undo-tree.el @@ -0,0 +1,49 @@ +;;; init-undo-tree.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-undo-tree.el +;; Description: Initialize Undo Tree +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 15:28:48 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:08:13 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d undo-tree +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes undo-tree +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; UndoTreePac +(use-package undo-tree + :defer t + :diminish undo-tree-mode + :init (global-undo-tree-mode)) +;; -UndoTreePac + +(provide 'init-undo-tree) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-undo-tree.el ends here diff --git a/.emacs.d/elisp/init-webdev.el b/.emacs.d/elisp/init-webdev.el new file mode 100644 index 0000000..68fa1f1 --- /dev/null +++ b/.emacs.d/elisp/init-webdev.el @@ -0,0 +1,81 @@ +;;; init-webdev.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-webdev.el +;; Description: Initialize Web, Emmet, JS2, TypeScript, Tide +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Fri Mar 15 11:03:43 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Tue Dec 24 12:03:28 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d web-mode js2-mode typescript-mode emmet instant-rename-tag json-mode +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes web-mode js2-mode typescript-mode emmet instant-rename-tag instant-rename-tag +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; WebModePac +(use-package web-mode + :custom-face + (css-selector ((t (:inherit default :foreground "#66CCFF")))) + (font-lock-comment-face ((t (:foreground "#828282")))) + :mode + ("\\.phtml\\'" "\\.tpl\\.php\\'" "\\.[agj]sp\\'" "\\.as[cp]x\\'" + "\\.erb\\'" "\\.mustache\\'" "\\.djhtml\\'" "\\.[t]?html?\\'")) +;; -WebModePac + +;; Js2Pac +(use-package js2-mode + :mode "\\.js\\'" + :interpreter "node") +;; -Js2Pac + +;; TypeScriptPac +(use-package typescript-mode + :mode "\\.ts\\'" + :commands (typescript-mode)) +;; -TypeScriptPac + +;; EmmetPac +(use-package emmet-mode + :hook ((web-mode . emmet-mode) + (css-mode . emmet-mode))) +;; -EmmetPac + +;; InstantRenameTagPac +(use-package instant-rename-tag + :load-path (lambda () (expand-file-name "site-elisp/instant-rename-tag" user-emacs-directory)) + :bind ("C-z <" . instant-rename-tag)) +;; -InstantRenameTagPac + +;; JsonPac +(use-package json-mode + :mode "\\.json\\'") +;; -JsonPac + +(provide 'init-webdev) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-webdev.el ends here diff --git a/.emacs.d/elisp/init-which-key.el b/.emacs.d/elisp/init-which-key.el new file mode 100644 index 0000000..72169f5 --- /dev/null +++ b/.emacs.d/elisp/init-which-key.el @@ -0,0 +1,52 @@ +;;; init-which-key.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-which-key.el +;; Description: Initialize Which-key +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 15:06:27 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:08:23 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d which-key +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes which-key +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; WhichKeyPac +(use-package which-key + :diminish + :custom + (which-key-separator " ") + (which-key-prefix-prefix "+") + :config + (which-key-mode)) +;; -WhichKeyPac + +(provide 'init-which-key) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-which-key.el ends here diff --git a/.emacs.d/elisp/init-winner.el b/.emacs.d/elisp/init-winner.el new file mode 100644 index 0000000..09ad7af --- /dev/null +++ b/.emacs.d/elisp/init-winner.el @@ -0,0 +1,61 @@ +;;; init-winner.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-winner.el +;; Description: Initialize Winner Mode +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 14:39:31 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Thu Aug 8 16:08:26 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d winner +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes winner mode +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; WinnerPac +(use-package winner + :ensure nil + :custom + (winner-boring-buffers + '("*Completions*" + "*Compile-Log*" + "*inferior-lisp*" + "*Fuzzy Completions*" + "*Apropos*" + "*Help*" + "*cvs*" + "*Buffer List*" + "*Ibuffer*" + "*esh command on file*")) + :config + (winner-mode 1)) +;; -WinnerPac + +(provide 'init-winner) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-winner.el ends here diff --git a/.emacs.d/elisp/init-yasnippet.el b/.emacs.d/elisp/init-yasnippet.el new file mode 100644 index 0000000..8fe5124 --- /dev/null +++ b/.emacs.d/elisp/init-yasnippet.el @@ -0,0 +1,66 @@ +;;; init-yasnippet.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-yasnippet.el +;; Description: Initialize YASnippet +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Tue Apr 23 23:08:17 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sat Dec 14 20:56:21 2019 (-0500) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d yasnippet +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes YASnippet +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; YASnippetPac +(use-package yasnippet + :diminish yas-minor-mode + :init + (use-package yasnippet-snippets :after yasnippet) + :hook ((prog-mode LaTeX-mode org-mode) . yas-minor-mode) + :bind + (:map yas-minor-mode-map ("C-c C-n" . yas-expand-from-trigger-key)) + (:map yas-keymap + (("TAB" . smarter-yas-expand-next-field) + ([(tab)] . smarter-yas-expand-next-field))) + :config + (yas-reload-all) + (defun smarter-yas-expand-next-field () + "Try to `yas-expand' then `yas-next-field' at current cursor position." + (interactive) + (let ((old-point (point)) + (old-tick (buffer-chars-modified-tick))) + (yas-expand) + (when (and (eq old-point (point)) + (eq old-tick (buffer-chars-modified-tick))) + (ignore-errors (yas-next-field)))))) +;; -YASnippetPac + +(provide 'init-yasnippet) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-yasnippet.el ends here diff --git a/.emacs.d/elisp/init-zone.el b/.emacs.d/elisp/init-zone.el new file mode 100644 index 0000000..9b77d4f --- /dev/null +++ b/.emacs.d/elisp/init-zone.el @@ -0,0 +1,59 @@ +;;; init-zone.el --- -*- lexical-binding: t -*- +;; +;; Filename: init-zone.el +;; Description: Initialize Zone +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 17:38:34 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Fri Sep 13 00:41:28 2019 (-0400) +;; By: Mingde (Matthew) Zeng +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d zone +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This initializes zone mode +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;; ZonePac +(use-package zone + :ensure nil + :defer 5 + :config + ;; (zone-when-idle 600) ; in seconds + (defun zone-choose (pgm) + "Choose a PGM to run for `zone'." + (interactive + (list + (completing-read + "Program: " + (mapcar 'symbol-name zone-programs)))) + (let ((zone-programs (list (intern pgm)))) + (zone)))) +;; -ZonePac + +(provide 'init-zone) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; init-zone.el ends here diff --git a/.emacs.d/init-bak.el b/.emacs.d/init-bak.el new file mode 100644 index 0000000..ece29f2 --- /dev/null +++ b/.emacs.d/init-bak.el @@ -0,0 +1,461 @@ +;;; init.el --- -*- lexical-binding: t -*- + +;;; Init file for emacs + +;;; Commentary: + +;; Init file, load everything necessary to have a full functional Emacs, this should +;; not be used with Emacs < 24. + +;;; Code: + +(add-to-list 'load-path "~/.emacs.d/one-file-mode/") +(add-to-list 'load-path "~/.emacs.d/site-lisp/") + +;; Themes +(setq custom-theme-directory "~/.emacs.d/themes/") +(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") + +;; Packages +(require 'package) ;; You might already have this line +(setq package-user-dir (expand-file-name "elpa" user-emacs-directory) + package-archives + '(("gnu" . "http://elpa.gnu.org/packages/") + ("melpa" . "http://melpa.org/packages/") + ("cselpa" . "http://elpa.thecybershadow.net/packages/"))) + +(unless (bound-and-true-p package--initialized) + (setq package-enable-at-startup nil) ; To prevent initializing twice + (package-initialize)) + +;; set use-package-verbose to t for interpreted .emacs, +;; and to nil for byte-compiled .emacs.elc. +(eval-and-compile + (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))) + +;; Install use-package if not installed +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + +(eval-and-compile + (setq use-package-always-ensure t) + (setq use-package-expand-minimally t) + (setq use-package-compute-statistics t) + (setq use-package-enable-imenu-support t)) + +(eval-when-compile + (require 'use-package) + (require 'bind-key)) + +(use-package auto-package-update + :if (not (daemonp)) + :custom + (auto-package-update-interval 7) ;; in days + (auto-package-update-prompt-before-update t) + (auto-package-update-delete-old-versions t) + (auto-package-update-hide-results t) + :config + (auto-package-update-maybe)) + +(use-package diminish) + +(require 'iso-transl) + +(global-display-line-numbers-mode) + +;; No menu, scrollbar, displayline and column +(menu-bar-mode -1) +(tool-bar-mode -1) +(when (display-graphic-p) + (scroll-bar-mode -1)) +(column-number-mode t) +(line-number-mode t) +(desktop-save-mode t) + +;; Command rebinding + +;; M-f (forward-word) : DĆ©placement d'un mot vers la droite du curseur. +;; M-b (backward-word) : DĆ©placement d'un mot vers la gauche du curseur. +;; C-a (beginning-of-line) : DĆ©placement au dĆ©but de la ligne courante. +;; C-e (end-of-line) : DĆ©placement Ć  la fin de la ligne courante. +;; M-{ (backward-paragraph) : DĆ©placement vers le paragraphe prĆ©cĆ©dent. +(global-set-key (kbd "M-p") 'backward-paragraph) +;; M-} (forward-paragraph) : DĆ©placement vers le paragraphe suivant. +(global-set-key (kbd "M-n") 'forward-paragraph) +;; C-v (scroll-up) : DĆ©placement d'un Ć©cran vers le bas. +;; M-v (scroll-down) : DĆ©placement d'un Ć©cran vers le haut. +;; M-> (end-of-buffer) : DĆ©placement Ć  la fin du buffer. +;; M-< (beginning-of-buffer) : DĆ©placement au dĆ©but du buffer. + +(use-package material-theme + :config + (load-theme 'material t)) + +;; No split screen at startup +(setq inhibit-startup-screen t) +;; Or if you use use-package +(setq dashboard-items '((recents . 5) + ;; (bookmarks . 5) + (projects . 5) + (agenda . 5) + (registers . 5))) +(setq dashboard-set-heading-icons t) +(setq dashboard-set-file-icons t) +(setq dashboard-set-navigator t) +(use-package dashboard + :ensure t + :config + (dashboard-setup-startup-hook)) +(add-hook 'dashboard-mode-hook (lambda () (display-line-numbers-mode -1))) +(setq initial-buffer-choice (lambda () (get-buffer "*dashboard*"))) + +(use-package doom-modeline + :ensure t + :hook (after-init . doom-modeline-mode)) + +(use-package ace-window + :bind ("C-x C-o" . ace-window)) + +;; Encoding +(set-language-environment "UTF-8") + +;; Selection mode +(delete-selection-mode 1) + +;; Indentation mode +(setq-default indent-tabs-mode nil) +(setq tab-width 4) + +;; Compilation coloration + +(ignore-errors + (require 'ansi-color) + (defun my-colorize-compilation-buffer () + (when (eq major-mode 'compilation-mode) + (ansi-color-apply-on-region compilation-filter-start (point-max)))) + (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer)) + +;; Retrieve PATH from fish shell +(when (memq window-system '(mac ns x)) + (setq exec-path-from-shell-shell-name "/usr/local/bin/fish") + (exec-path-from-shell-initialize)) + +;; Auto complete + Yasnippet +(use-package projectile + :config + (projectile-mode 1) + (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map) + (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) + (setq projectile-enable-caching t)) + +(use-package helm + :config + (global-set-key (kbd "M-x") 'helm-M-x) + (global-set-key (kbd "C-x r b") 'helm-filtered-bookmarks) + (global-set-key (kbd "C-x C-f") 'helm-find-files) + (global-set-key (kbd "C-x C-b") 'helm-buffers-list) + (helm-mode 1) + (add-to-list 'helm-boring-buffer-regexp-list "\\*.*")) + +(use-package helm-projectile + :after (helm projectile) + :config + (setq projectile-completion-system 'helm) + (helm-projectile-on)) + +(use-package yasnippet + :config + (yas-global-mode 1)) + +(use-package flycheck + :config + (add-hook 'flycheck-after-syntax-check-hook 'flycheck-autolist-hook) + (global-flycheck-mode) + (setq flycheck-emacs-lisp-load-path "inherict") + (setq flycheck-clang-args '("-stdlib=libc++" "-W" "-Wall")) + (add-hook 'c++-mode-hook + (lambda () + (setq-local flycheck-clang-language-standard "c++14")))) + +(use-package flycheck-pos-tip + :after (flycheck) + :config + (add-hook 'flycheck-mode-hook 'flycheck-pos-tip-mode)) + +(use-package flycheck-color-mode-line + :after (flycheck) + :config + (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)) + +(use-package company + :config + (add-hook 'after-init-hook 'global-company-mode) + (global-set-key (kbd "M-/") 'company-complete)) + +(use-package company-c-headers + :config + (add-to-list 'company-backends 'company-c-headers)) +(use-package company-jedi + :config + (add-to-list 'company-backends 'company-jedi)) +(use-package company-web + :config + (add-to-list 'company-backends 'company-web-html)) + +; C++ +(use-package modern-cpp-font-lock + :ensure t) +(add-hook 'c++-mode-hook #'modern-c++-font-lock-mode) + +;; Doc mode +(require 'doc-mode) +(add-hook 'c-mode-common-hook 'doc-mode) +(add-hook 'c++-mode-common-hook 'doc-mode) + +;; Latex +(use-package auctex + :defer t + :config + (setq TeX-auto-save t) + (setq TeX-parse-self t) + (setq-default TeX-master nil) + (defun my-latex-mode-setup () + "Redefines and updates variables for various customizations." + (setq LaTeX-paragraph-commands + '("If" "State" "Loop" "For" "ForAll")) + (setq LaTeX-begin-regexp + (concat LaTeX-begin-regexp "\\|If\\b" "\\|Loop\\b" "\\|For\\b" "\\|ForAll\\b")) + (setq LaTeX-end-regexp + (concat LaTeX-end-regexp "\\|EndIf\\b" "\\|EndLoop\\b" + "\\|EndFor\\b" "\\|Else\\b" "\\|ElsIf\\b")) + (setq LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make)) + (defun LaTeX-indent-level-count () + "Count indentation change caused by all \\left, \\right, \\begin, and + \\end commands in the current line." + (save-excursion + (save-restriction + (let ((count 0)) + (narrow-to-region (point) + (save-excursion + (re-search-forward + (concat "[^" TeX-esc "]" + "\\(" LaTeX-indent-comment-start-regexp + "\\)\\|\n\\|\\'")) + (backward-char) + (point))) + (while (search-forward TeX-esc nil t) + (cond + ((looking-at "left\\b") + (setq count (+ count LaTeX-left-right-indent-level))) + ((looking-at "right\\b") + (setq count (- count LaTeX-left-right-indent-level))) + ((looking-at LaTeX-begin-regexp) + (setq count (+ count LaTeX-indent-level))) + ((looking-at "Else\\b")) + ((looking-at "ElsIf\\b")) + ((looking-at LaTeX-end-regexp) + (setq count (- count LaTeX-indent-level))) + ((looking-at (regexp-quote TeX-esc)) + (forward-char 1)))) + count))))) + + (add-to-list 'LaTeX-verbatim-environments "code") + (add-to-list 'LaTeX-indent-environment-list + '("code" current-indentation)) + + (add-hook 'LaTeX-mode-hook 'my-latex-mode-setup) + (add-hook 'LaTeX-mode-hook 'visual-line-mode) + (add-hook 'LaTeX-mode-hook 'flyspell-mode) + (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode) + + (add-hook 'LaTeX-mode-hook 'turn-on-reftex) + (setq reftex-plug-into-AUCTeX t) + (require 'tex) + (TeX-global-PDF-mode t) +) +(use-package company-auctex + :after (auctex company) + :config (company-auctex-init)) + +;; (add-to-list 'ispell-local-dictionary-alist '("francais-hunspell" +;; "[[:alpha:]]" +;; "[^[:alpha]]" +;; "[']" +;; t +;; ("-d" "fr_FR") +;; nil +;; iso-8859-1)) + +;; magit +(use-package magit + :config + (add-hook 'after-save-hook 'magit-after-save-refresh-status)) + +;; CSS style +(setq css-indent-offset 2) + +;; Markdown mode +(use-package markdown-mode + :mode "\\.text\\'" "\\.markdown\\'" "\\.md\\'") + +;; White space mode & Fill mode column + +(defun my-visual-hook () + (visual-line-mode t) + ;; (visual-fill-column-mode t) + (define-key visual-line-mode-map [remap kill-line] nil) + (whitespace-mode t)) + +(setq-default fill-column 95) +(setq-default whitespace-line-column 95) +(add-hook 'python-mode-hook (lambda () (setq-local whitespace-line-column 100))) +(add-hook 'LaTeX-mode-hook (lambda () (setq-local whitespace-line-column -1))) +(add-hook 'markdown-mode-hook (lambda () (setq-local whitespace-line-column -1))) +(add-hook 'web-mode-hook (lambda () (setq-local whitespace-line-column -1))) + +(add-hook 'text-mode-hook 'my-visual-hook) +(add-hook 'prog-mode-hook 'my-visual-hook) + +(add-hook 'before-save-hook 'whitespace-cleanup) + +;; Electric pair mode +(electric-pair-mode 1) +(show-paren-mode 1) +(setq show-paren-delay 0) + +;; C mode +(setq c-default-style "k&r") +(setq c-basic-offset 4) + +(defun ac-cc-mode-setup () + "Initialization hook for CC-mode runs before any other hooks." + (hide-ifdef-mode) + (hs-minor-mode) + (setq hide-ifdef-shadow t)) + +(add-hook 'c-mode-common-hook 'ac-cc-mode-setup) +(add-hook 'c++-mode-common-hook 'ac-cc-mode-setup) +(add-hook 'auto-complete-mode-hook 'ac-common-setup) + +(setq c-doc-comment-style + '((java-mode . javadoc) + (pike-mode . autodoc) + (c-mode . javadoc) + (c++-mode . javadoc))) + +(add-to-list 'auto-mode-alist '("\\.hpp\\'" . c++-mode)) + +;; Run C programs directly from within emacs +(setq execute-command nil) +(setq execute-buffer-name "*output*") +(setq execute-process-name "execute") + +(defun set-execute-command () + (interactive) + (setq sp (split-string (read-from-minibuffer "Execute command: "))) + (setq execute-command (combine-and-quote-strings (cons (file-truename (car sp)) (cdr sp))))) + +(defun kill-execute-c-program () + (interactive) + (if (get-process execute-process-name) + (delete-process (get-process execute-process-name)))) + +(defun execute-c-program () + (interactive) + (if (not execute-command) (set-execute-command)) + (kill-execute-c-program) + (setq old-buffer (current-buffer)) + (setq output-buffer (get-buffer-create execute-buffer-name)) + (switch-to-buffer-other-window output-buffer) + (end-of-buffer) + (insert (concat (propertize execute-command 'face 'bold) "\n")) + (switch-to-buffer-other-window old-buffer) + (start-process-shell-command execute-process-name execute-buffer-name execute-command)) + +(defun key-c-mode-setup () + (local-set-key (kbd "C-c C-c") 'smart-compile) + (local-set-key (kbd "C-c C-r") 'execute-c-program) + (local-set-key [f3] 'kill-execute-c-program) + (local-set-key [f4] 'set-execute-command)) + +(add-hook 'c++-mode-common-hook 'key-c-mode-setup) +(add-hook 'c-mode-common-hook 'key-c-mode-setup) + +;; Flyspell dictionarie +(defun fd-switch-dictionary () + (interactive) + (let* ((dic ispell-current-dictionary) + (change (if (string= dic "francais") "english" "francais"))) + (ispell-change-dictionary change) + (message "Dictionary switched from %s to %s" dic change) + )) + +(defun key-latex-mode-setup () + (local-set-key [f8] 'fd-switch-dictionary)) + +(add-hook 'LaTeX-mode-hook 'key-latex-mode-setup) + +;; python +(use-package flycheck-mypy) +(use-package elpy + :config + (when (load "flycheck" t t) + (flycheck-add-next-checker 'python-flake8 'python-mypy) + (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) + (add-hook 'elpy-mode-hook 'flycheck-mode)) + (setq python-shell-interpreter "ipython" + python-shell-interpreter-args "-i --simple-prompt") + ;; (setq python-shell-interpreter "jupyter" + ;; python-shell-interpreter-args "console --simple-prompt" + ;; python-shell-prompt-detect-failure-warning nil) + (add-to-list 'python-shell-completion-native-disabled-interpreters + "jupyter") + :init + (setq elpy-rpc-backend "jedi") + (setq elpy-rpc-python-command "I:\\Languages\\Python\\Python37\\python.exe") + (elpy-enable)) +(add-hook 'python-mode-hook 'hs-minor-mode) + +;; Web mode +(add-to-list 'auto-mode-alist '("\\.ctp\\'" . web-mode)) +(add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) + +;;(use-package mmm-mode +;; :config +;; (require 'mmm-auto) +;; (setq mmm-global-mode 'maybe) +;; (mmm-add-mode-ext-class 'html-mode "\\.php\\'" 'html-php) +;; (mmm-add-mode-ext-class nil "\\.ctp\\'" 'html-php) +;; (add-to-list 'mmm-mode-ext-classes-alist '(html-mode nil html-js)) +;; (add-to-list 'mmm-mode-ext-classes-alist '(html-mode nil embedded-css)) +;; (add-to-list 'mmm-mode-ext-classes-alist '(html-mode nil fancy-html))) + +;; Go +(require 'go-template-mode) + +;; Dockers +(require 'dockerfile-mode) +(add-to-list 'auto-mode-alist '("Dockerfile\\'" . dockerfile-mode)) + +;; Lilypond +(autoload 'LilyPond-mode "lilypond-mode" "LilyPond Editing Mode" t) +(add-to-list 'auto-mode-alist '("\\.ly$" . LilyPond-mode)) +(add-to-list 'auto-mode-alist '("\\.ily$" . LilyPond-mode)) +(add-hook 'LilyPond-mode-hook (lambda () (turn-on-font-lock))) + +;; Term +(setq explicit-shell-file-name "/bin/bash") +(defun my-term-hook () + (visual-fill-column-mode nil) + (visual-line-mode nil)) +(add-hook 'term-load-hook 'my-term-hook) +(eval-after-load "term" + '(define-key term-raw-map (kbd "C-c C-y") 'term-paste)) + +(setq custom-file "~/.emacs.d/custom.el") +(load custom-file) +(put 'narrow-to-region 'disabled nil) + +(provide 'init) +;;; init.el ends here diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 68fd809..5b0e37f 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -1,455 +1,232 @@ ;;; init.el --- -*- lexical-binding: t -*- - -;;; Init file for emacs - +;; +;; Filename: init.el +;; Description: Initialize M-EMACS +;; Author: Mingde (Matthew) Zeng +;; Copyright (C) 2019 Mingde (Matthew) Zeng +;; Created: Thu Mar 14 10:15:28 2019 (-0400) +;; Version: 2.0.0 +;; Last-Updated: Sat Dec 28 18:41:54 2019 (+0100) +;; By: MikaĆ«l Capelle +;; URL: https://github.com/MatthewZMD/.emacs.d +;; Keywords: M-EMACS .emacs.d init +;; Compatibility: emacs-version >= 26.1 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;;; Commentary: - -;; Init file, load everything necessary to have a full functional Emacs, this should -;; not be used with Emacs < 24. - +;; +;; This is the init.el file for M-EMACS +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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. If not, see . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;;; Code: -(add-to-list 'load-path "~/.emacs.d/one-file-mode/") +;; CheckVer +(cond ((version< emacs-version "26.1") + (warn "M-EMACS requires Emacs 26.1 and above!")) + ((let* ((early-init-f (expand-file-name "early-init.el" user-emacs-directory)) + (early-init-do-not-edit-d (expand-file-name "early-init-do-not-edit/" user-emacs-directory)) + (early-init-do-not-edit-f (expand-file-name "early-init.el" early-init-do-not-edit-d))) + (and (version< emacs-version "27") + (or (not (file-exists-p early-init-do-not-edit-f)) + (file-newer-than-file-p early-init-f early-init-do-not-edit-f))) + (make-directory early-init-do-not-edit-d t) + (copy-file early-init-f early-init-do-not-edit-f t t t t) + (add-to-list 'load-path early-init-do-not-edit-d) + (require 'early-init)))) +;; -CheckVer -;; Themes -(setq custom-theme-directory "~/.emacs.d/themes/") -(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") +;; BetterGC +(defvar better-gc-cons-threshold 67108864 ; 64mb + "The default value to use for `gc-cons-threshold'. + +If you experience freezing, decrease this. If you experience stuttering, +increase this.") + +(add-hook 'emacs-startup-hook + (lambda () + (setq gc-cons-threshold better-gc-cons-threshold) + (setq file-name-handler-alist file-name-handler-alist-original) + (makunbound 'file-name-handler-alist-original))) +;; -BetterGC + +;; AutoGC +(add-hook 'emacs-startup-hook + (lambda () + (if (boundp 'after-focus-change-function) + (add-function :after after-focus-change-function + (lambda () + (unless (frame-focus-state) + (garbage-collect)))) + (add-hook 'after-focus-change-function 'garbage-collect)) + ;; -AutoGC MinibufferGC + (defun gc-minibuffer-setup-hook () + (setq gc-cons-threshold (* better-gc-cons-threshold 2))) + + (defun gc-minibuffer-exit-hook () + (garbage-collect) + (setq gc-cons-threshold better-gc-cons-threshold)) + + (add-hook 'minibuffer-setup-hook #'gc-minibuffer-setup-hook) + (add-hook 'minibuffer-exit-hook #'gc-minibuffer-exit-hook))) +;; -MinibufferGC + +;; LoadPath +(defun update-to-load-path (folder) + "Update FOLDER and its subdirectories to `load-path'." + (let ((base folder)) + (unless (member base load-path) + (add-to-list 'load-path base)) + (dolist (f (directory-files base)) + (let ((name (concat base "/" f))) + (when (and (file-directory-p name) + (not (equal f "..")) + (not (equal f "."))) + (unless (member base load-path) + (add-to-list 'load-path name))))))) + +(update-to-load-path (expand-file-name "elisp" user-emacs-directory)) +(update-to-load-path (expand-file-name "one-file-mode" user-emacs-directory)) +;; -LoadPath + +;; Constants + +(require 'init-const) ;; Packages -(require 'package) ;; You might already have this line -(setq package-user-dir (expand-file-name "elpa" user-emacs-directory) - package-archives - '(("gnu" . "http://elpa.gnu.org/packages/") - ("melpa" . "http://melpa.org/packages/") - ("cselpa" . "http://elpa.thecybershadow.net/packages/"))) - -(unless (bound-and-true-p package--initialized) - (setq package-enable-at-startup nil) ; To prevent initializing twice - (package-initialize)) - -;; set use-package-verbose to t for interpreted .emacs, -;; and to nil for byte-compiled .emacs.elc. -(eval-and-compile - (setq use-package-verbose (not (bound-and-true-p byte-compile-current-file)))) - -;; Install use-package if not installed -(unless (package-installed-p 'use-package) - (package-refresh-contents) - (package-install 'use-package)) - -(eval-and-compile - (setq use-package-always-ensure t) - (setq use-package-expand-minimally t) - (setq use-package-compute-statistics t) - (setq use-package-enable-imenu-support t)) - -(eval-when-compile - (require 'use-package) - (require 'bind-key)) - -(use-package auto-package-update - :if (not (daemonp)) - :custom - (auto-package-update-interval 7) ;; in days - (auto-package-update-prompt-before-update t) - (auto-package-update-delete-old-versions t) - (auto-package-update-hide-results t) - :config - (auto-package-update-maybe)) - -(use-package diminish) - -(require 'iso-transl) - -(global-display-line-numbers-mode) - -;; No menu, scrollbar, displayline and column -(menu-bar-mode -1) -(tool-bar-mode -1) -(when (display-graphic-p) - (scroll-bar-mode -1)) -(column-number-mode t) -(line-number-mode t) -(desktop-save-mode t) - -;; Command rebinding - -;; M-f (forward-word) : DĆ©placement d'un mot vers la droite du curseur. -;; M-b (backward-word) : DĆ©placement d'un mot vers la gauche du curseur. -;; C-a (beginning-of-line) : DĆ©placement au dĆ©but de la ligne courante. -;; C-e (end-of-line) : DĆ©placement Ć  la fin de la ligne courante. -;; M-{ (backward-paragraph) : DĆ©placement vers le paragraphe prĆ©cĆ©dent. -(global-set-key (kbd "M-p") 'backward-paragraph) -;; M-} (forward-paragraph) : DĆ©placement vers le paragraphe suivant. -(global-set-key (kbd "M-n") 'forward-paragraph) -;; C-v (scroll-up) : DĆ©placement d'un Ć©cran vers le bas. -;; M-v (scroll-down) : DĆ©placement d'un Ć©cran vers le haut. -;; M-> (end-of-buffer) : DĆ©placement Ć  la fin du buffer. -;; M-< (beginning-of-buffer) : DĆ©placement au dĆ©but du buffer. - -(use-package material-theme - :config - (load-theme 'material t)) - -;; No split screen at startup -(setq inhibit-startup-screen t) -;; Or if you use use-package -(setq dashboard-items '((recents . 5) - ;; (bookmarks . 5) - (projects . 5) - (agenda . 5) - (registers . 5))) -(setq dashboard-set-heading-icons t) -(setq dashboard-set-file-icons t) -(setq dashboard-set-navigator t) -(use-package dashboard - :ensure t - :config - (dashboard-setup-startup-hook)) -(add-hook 'dashboard-mode-hook (lambda () (display-line-numbers-mode -1))) -(setq initial-buffer-choice (lambda () (get-buffer "*dashboard*"))) - -(use-package doom-modeline - :ensure t - :hook (after-init . doom-modeline-mode)) - -(use-package ace-window - :bind ("C-x C-o" . ace-window)) - -;; Encoding -(set-language-environment "UTF-8") - -;; Selection mode -(delete-selection-mode 1) - -;; Indentation mode -(setq-default indent-tabs-mode nil) -(setq tab-width 4) - -;; Compilation coloration - -(ignore-errors - (require 'ansi-color) - (defun my-colorize-compilation-buffer () - (when (eq major-mode 'compilation-mode) - (ansi-color-apply-on-region compilation-filter-start (point-max)))) - (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer)) - -;; Retrieve PATH from fish shell -(when (memq window-system '(mac ns x)) - (setq exec-path-from-shell-shell-name "/usr/local/bin/fish") - (exec-path-from-shell-initialize)) - -;; Auto complete + Yasnippet -(use-package projectile - :config - (projectile-mode 1) - (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map) - (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) - (setq projectile-enable-caching t)) - -(use-package helm - :config - (global-set-key (kbd "M-x") 'helm-M-x) - (global-set-key (kbd "C-x r b") 'helm-filtered-bookmarks) - (global-set-key (kbd "C-x C-f") 'helm-find-files) - (global-set-key (kbd "C-x C-b") 'helm-buffers-list) - (helm-mode 1) - (add-to-list 'helm-boring-buffer-regexp-list "\\*.*")) - -(use-package helm-projectile - :after (helm projectile) - :config - (setq projectile-completion-system 'helm) - (helm-projectile-on)) - -(use-package yasnippet - :config - (yas-global-mode 1)) - -(use-package flycheck - :config - (add-hook 'flycheck-after-syntax-check-hook 'flycheck-autolist-hook) - (global-flycheck-mode) - (setq flycheck-emacs-lisp-load-path "inherict") - (setq flycheck-clang-args '("-stdlib=libc++" "-W" "-Wall")) - (add-hook 'c++-mode-hook - (lambda () - (setq-local flycheck-clang-language-standard "c++14")))) - -(use-package flycheck-pos-tip - :after (flycheck) - :config - (add-hook 'flycheck-mode-hook 'flycheck-pos-tip-mode)) - -(use-package flycheck-color-mode-line - :after (flycheck) - :config - (add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)) - -(use-package company - :config - (add-hook 'after-init-hook 'global-company-mode) - (global-set-key (kbd "M-/") 'company-complete)) - -(use-package company-c-headers - :config - (add-to-list 'company-backends 'company-c-headers)) -(use-package company-jedi - :config - (add-to-list 'company-backends 'company-jedi)) -(use-package company-web - :config - (add-to-list 'company-backends 'company-web-html)) - -; C++ -(use-package modern-cpp-font-lock - :ensure t) -(add-hook 'c++-mode-hook #'modern-c++-font-lock-mode) - -;; Doc mode -(require 'doc-mode) -(add-hook 'c-mode-common-hook 'doc-mode) -(add-hook 'c++-mode-common-hook 'doc-mode) - -;; Latex -(use-package auctex - :defer t - :config - (setq TeX-auto-save t) - (setq TeX-parse-self t) - (setq-default TeX-master nil) - (defun my-latex-mode-setup () - "Redefines and updates variables for various customizations." - (setq LaTeX-paragraph-commands - '("If" "State" "Loop" "For" "ForAll")) - (setq LaTeX-begin-regexp - (concat LaTeX-begin-regexp "\\|If\\b" "\\|Loop\\b" "\\|For\\b" "\\|ForAll\\b")) - (setq LaTeX-end-regexp - (concat LaTeX-end-regexp "\\|EndIf\\b" "\\|EndLoop\\b" - "\\|EndFor\\b" "\\|Else\\b" "\\|ElsIf\\b")) - (setq LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make)) - (defun LaTeX-indent-level-count () - "Count indentation change caused by all \\left, \\right, \\begin, and - \\end commands in the current line." - (save-excursion - (save-restriction - (let ((count 0)) - (narrow-to-region (point) - (save-excursion - (re-search-forward - (concat "[^" TeX-esc "]" - "\\(" LaTeX-indent-comment-start-regexp - "\\)\\|\n\\|\\'")) - (backward-char) - (point))) - (while (search-forward TeX-esc nil t) - (cond - ((looking-at "left\\b") - (setq count (+ count LaTeX-left-right-indent-level))) - ((looking-at "right\\b") - (setq count (- count LaTeX-left-right-indent-level))) - ((looking-at LaTeX-begin-regexp) - (setq count (+ count LaTeX-indent-level))) - ((looking-at "Else\\b")) - ((looking-at "ElsIf\\b")) - ((looking-at LaTeX-end-regexp) - (setq count (- count LaTeX-indent-level))) - ((looking-at (regexp-quote TeX-esc)) - (forward-char 1)))) - count))))) - - (add-to-list 'LaTeX-verbatim-environments "code") - (add-to-list 'LaTeX-indent-environment-list - '("code" current-indentation)) - - (add-hook 'LaTeX-mode-hook 'my-latex-mode-setup) - (add-hook 'LaTeX-mode-hook 'visual-line-mode) - (add-hook 'LaTeX-mode-hook 'flyspell-mode) - (add-hook 'LaTeX-mode-hook 'LaTeX-math-mode) - - (add-hook 'LaTeX-mode-hook 'turn-on-reftex) - (setq reftex-plug-into-AUCTeX t) - (require 'tex) - (TeX-global-PDF-mode t) -) -(use-package company-auctex - :after (auctex company) - :config (company-auctex-init)) - -;; (add-to-list 'ispell-local-dictionary-alist '("francais-hunspell" -;; "[[:alpha:]]" -;; "[^[:alpha]]" -;; "[']" -;; t -;; ("-d" "fr_FR") -;; nil -;; iso-8859-1)) - -;; magit -(use-package magit - :config - (add-hook 'after-save-hook 'magit-after-save-refresh-status)) - -;; CSS style -(setq css-indent-offset 2) - -;; Markdown mode -(use-package markdown-mode - :mode "\\.text\\'" "\\.markdown\\'" "\\.md\\'") - -;; White space mode & Fill mode column - -(defun my-visual-hook () - (visual-line-mode t) - ;; (visual-fill-column-mode t) - (define-key visual-line-mode-map [remap kill-line] nil) - (whitespace-mode t)) - -(setq-default fill-column 95) -(setq-default whitespace-line-column 95) -(add-hook 'python-mode-hook (lambda () (setq-local whitespace-line-column 100))) -(add-hook 'LaTeX-mode-hook (lambda () (setq-local whitespace-line-column -1))) -(add-hook 'markdown-mode-hook (lambda () (setq-local whitespace-line-column -1))) -(add-hook 'web-mode-hook (lambda () (setq-local whitespace-line-column -1))) - -(add-hook 'text-mode-hook 'my-visual-hook) -(add-hook 'prog-mode-hook 'my-visual-hook) - -(add-hook 'before-save-hook 'whitespace-cleanup) - -;; Electric pair mode -(electric-pair-mode 1) -(show-paren-mode 1) -(setq show-paren-delay 0) - -;; C mode -(setq c-default-style "k&r") -(setq c-basic-offset 4) - -(defun ac-cc-mode-setup () - "Initialization hook for CC-mode runs before any other hooks." - (hide-ifdef-mode) - (hs-minor-mode) - (setq hide-ifdef-shadow t)) - -(add-hook 'c-mode-common-hook 'ac-cc-mode-setup) -(add-hook 'c++-mode-common-hook 'ac-cc-mode-setup) -(add-hook 'auto-complete-mode-hook 'ac-common-setup) - -(setq c-doc-comment-style - '((java-mode . javadoc) - (pike-mode . autodoc) - (c-mode . javadoc) - (c++-mode . javadoc))) - -(add-to-list 'auto-mode-alist '("\\.hpp\\'" . c++-mode)) - -;; Run C programs directly from within emacs -(setq execute-command nil) -(setq execute-buffer-name "*output*") -(setq execute-process-name "execute") - -(defun set-execute-command () - (interactive) - (setq sp (split-string (read-from-minibuffer "Execute command: "))) - (setq execute-command (combine-and-quote-strings (cons (file-truename (car sp)) (cdr sp))))) - -(defun kill-execute-c-program () - (interactive) - (if (get-process execute-process-name) - (delete-process (get-process execute-process-name)))) - -(defun execute-c-program () - (interactive) - (if (not execute-command) (set-execute-command)) - (kill-execute-c-program) - (setq old-buffer (current-buffer)) - (setq output-buffer (get-buffer-create execute-buffer-name)) - (switch-to-buffer-other-window output-buffer) - (end-of-buffer) - (insert (concat (propertize execute-command 'face 'bold) "\n")) - (switch-to-buffer-other-window old-buffer) - (start-process-shell-command execute-process-name execute-buffer-name execute-command)) - -(defun key-c-mode-setup () - (local-set-key (kbd "C-c C-c") 'smart-compile) - (local-set-key (kbd "C-c C-r") 'execute-c-program) - (local-set-key [f3] 'kill-execute-c-program) - (local-set-key [f4] 'set-execute-command)) - -(add-hook 'c++-mode-common-hook 'key-c-mode-setup) -(add-hook 'c-mode-common-hook 'key-c-mode-setup) - -;; Flyspell dictionarie -(defun fd-switch-dictionary () - (interactive) - (let* ((dic ispell-current-dictionary) - (change (if (string= dic "francais") "english" "francais"))) - (ispell-change-dictionary change) - (message "Dictionary switched from %s to %s" dic change) - )) - -(defun key-latex-mode-setup () - (local-set-key [f8] 'fd-switch-dictionary)) - -(add-hook 'LaTeX-mode-hook 'key-latex-mode-setup) - -;; python -(use-package flycheck-mypy) -(use-package elpy - :config - (when (load "flycheck" t t) - (flycheck-add-next-checker 'python-flake8 'python-mypy) - (setq elpy-modules (delq 'elpy-module-flymake elpy-modules)) - (add-hook 'elpy-mode-hook 'flycheck-mode)) - (setq python-shell-interpreter "ipython" - python-shell-interpreter-args "-i --simple-prompt") - ;; (setq python-shell-interpreter "jupyter" - ;; python-shell-interpreter-args "console --simple-prompt" - ;; python-shell-prompt-detect-failure-warning nil) - (add-to-list 'python-shell-completion-native-disabled-interpreters - "jupyter") - :init - (setq elpy-rpc-backend "jedi") - (setq elpy-rpc-python-command "python3") - (elpy-enable)) -(add-hook 'python-mode-hook 'hs-minor-mode) - -;; Web mode -(add-to-list 'auto-mode-alist '("\\.ctp\\'" . web-mode)) -(add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) - -;;(use-package mmm-mode -;; :config -;; (require 'mmm-auto) -;; (setq mmm-global-mode 'maybe) -;; (mmm-add-mode-ext-class 'html-mode "\\.php\\'" 'html-php) -;; (mmm-add-mode-ext-class nil "\\.ctp\\'" 'html-php) -;; (add-to-list 'mmm-mode-ext-classes-alist '(html-mode nil html-js)) -;; (add-to-list 'mmm-mode-ext-classes-alist '(html-mode nil embedded-css)) -;; (add-to-list 'mmm-mode-ext-classes-alist '(html-mode nil fancy-html))) - -;; Go -(require 'go-template-mode) - -;; Dockers -(require 'dockerfile-mode) -(add-to-list 'auto-mode-alist '("Dockerfile\\'" . dockerfile-mode)) - -;; Term - -(setq explicit-shell-file-name "/bin/bash") -(defun my-term-hook () - (visual-fill-column-mode nil) - (visual-line-mode nil)) -(add-hook 'term-load-hook 'my-term-hook) -(eval-after-load "term" - '(define-key term-raw-map (kbd "C-c C-y") 'term-paste)) - -(setq custom-file "~/.emacs.d/custom.el") -(load custom-file) -(put 'narrow-to-region 'disabled nil) + +;; Package Management +(require 'init-package) + +;; Global Functionalities +(require 'init-global-config) + +(require 'init-func) + +(require 'init-search) + +(require 'init-crux) + +(require 'init-avy) + +(require 'init-winner) + +(require 'init-which-key) + +(require 'init-popup-kill-ring) + +(require 'init-undo-tree) + +(require 'init-discover-my-major) + +(require 'init-ace-window) + +(require 'init-shell) + +(require 'init-dired) + +;; User Interface Enhancements +(require 'init-ui-config) + +(require 'init-all-the-icons) + +(require 'init-theme) + +(require 'init-dashboard) + +(require 'init-fonts) + +(require 'init-scroll) + +;; General Programming +(require 'init-magit) + +(require 'init-projectile) + +(require 'init-treemacs) + +(require 'init-yasnippet) + +(require 'init-flycheck) + +(require 'init-dumb-jump) + +(require 'init-parens) + +(require 'init-indent) + +(require 'init-quickrun) + +(require 'init-format) + +(require 'init-comment) + +(require 'init-edit) + +(require 'init-header) + +(require 'init-ein) + +(require 'init-lsp) + +(require 'init-company) + +;; Programming + +(require 'init-java) + +(require 'init-cc) + +(require 'init-python) + +(require 'init-latex) + +(require 'init-ess) + +;; Web Development +(require 'init-webdev) + +;; Miscellaneous +(require 'init-org) + +(require 'init-eaf) + +(require 'init-erc) + +(require 'init-eww) + +(require 'init-mu4e) + +(require 'init-tramp) + +(require 'init-pdf) + +(require 'init-leetcode) + +(require 'init-pyim) + +(require 'init-epaint) + +(require 'init-games) + +(require 'init-zone) (provide 'init) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; init.el ends here diff --git a/.emacs.d/site-elisp/aweshell b/.emacs.d/site-elisp/aweshell new file mode 160000 index 0000000..7d6afd1 --- /dev/null +++ b/.emacs.d/site-elisp/aweshell @@ -0,0 +1 @@ +Subproject commit 7d6afd1959194956495252abeef0c1cd39ebeee2 diff --git a/.emacs.d/site-elisp/awesome-pair b/.emacs.d/site-elisp/awesome-pair new file mode 160000 index 0000000..4aa25e1 --- /dev/null +++ b/.emacs.d/site-elisp/awesome-pair @@ -0,0 +1 @@ +Subproject commit 4aa25e10b0a8bbb31f199cce41f70d35d18209bd diff --git a/.emacs.d/site-elisp/color-rg b/.emacs.d/site-elisp/color-rg new file mode 160000 index 0000000..9aa81f6 --- /dev/null +++ b/.emacs.d/site-elisp/color-rg @@ -0,0 +1 @@ +Subproject commit 9aa81f6c711870ae1a7c6182d911671512a48387 diff --git a/.emacs.d/site-elisp/delete-block b/.emacs.d/site-elisp/delete-block new file mode 160000 index 0000000..50e1df3 --- /dev/null +++ b/.emacs.d/site-elisp/delete-block @@ -0,0 +1 @@ +Subproject commit 50e1df3e273ffa049525726fb72818e859ecc9cf diff --git a/.emacs.d/site-elisp/emacs-application-framework b/.emacs.d/site-elisp/emacs-application-framework new file mode 160000 index 0000000..40d6e68 --- /dev/null +++ b/.emacs.d/site-elisp/emacs-application-framework @@ -0,0 +1 @@ +Subproject commit 40d6e68085f1f2b6fc3231644e8b5a6c346982c7 diff --git a/.emacs.d/site-elisp/epaint b/.emacs.d/site-elisp/epaint new file mode 160000 index 0000000..8b40f92 --- /dev/null +++ b/.emacs.d/site-elisp/epaint @@ -0,0 +1 @@ +Subproject commit 8b40f927cbb3633d41b9bb4d40d072e522fa3739 diff --git a/.emacs.d/site-elisp/grep-dired b/.emacs.d/site-elisp/grep-dired new file mode 160000 index 0000000..1f53289 --- /dev/null +++ b/.emacs.d/site-elisp/grep-dired @@ -0,0 +1 @@ +Subproject commit 1f532893f03728406dcf5842e49c019f6186623e diff --git a/.emacs.d/site-elisp/header2 b/.emacs.d/site-elisp/header2 new file mode 160000 index 0000000..e41bb4f --- /dev/null +++ b/.emacs.d/site-elisp/header2 @@ -0,0 +1 @@ +Subproject commit e41bb4fe0e003130e8c7af199ef4546a2cf57856 diff --git a/.emacs.d/site-elisp/instant-rename-tag b/.emacs.d/site-elisp/instant-rename-tag new file mode 160000 index 0000000..5909263 --- /dev/null +++ b/.emacs.d/site-elisp/instant-rename-tag @@ -0,0 +1 @@ +Subproject commit 5909263fa697d2ca44d8fd8b2741315af02d9d9f diff --git a/.emacs.d/site-elisp/leetcode.el b/.emacs.d/site-elisp/leetcode.el new file mode 160000 index 0000000..86e9e16 --- /dev/null +++ b/.emacs.d/site-elisp/leetcode.el @@ -0,0 +1 @@ +Subproject commit 86e9e167c10eed487cf6715a764527d84ccb35fa diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-font-lock.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-font-lock.el new file mode 100644 index 0000000..be7b592 --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-font-lock.el @@ -0,0 +1,190 @@ +;;; lilypond-font-lock.el --- syntax coloring for LilyPond mode + +;; Author: 2001-2006: Heikki Junes +;; * Emacs-mode: new keywords, reserved words, identifiers, notenames, +;; some dynamics and brackets are font-lock-keywords +;; * context-dependent syntax-tables +;; Author: 1997: Han-Wen Nienhuys +;; Author: 1995-1996 Barry A. Warsaw +;; 1992-1994 Tim Peters +;; Created: Feb 1992 +;; Version: 2.9.29 +;; Last Modified: 11NOV2006 +;; Keywords: lilypond languages music notation + +;; This started out as a cannabalised version of python-mode.el, by hwn +;; For changes see the LilyPond ChangeLog +;; + +;; TODO: +;; - handle lexer modes (\header, \melodic) etc. + +(defconst LilyPond-font-lock-keywords + (let* ((kwregex (mapconcat (lambda (x) (concat "\\" x)) LilyPond-keywords "\\|")) + (iregex (mapconcat (lambda (x) (concat "\\" x)) LilyPond-identifiers "\\|")) + (ncrwregex (mapconcat (lambda (x) (concat "" x)) LilyPond-non-capitalized-reserved-words "\\|")) + (rwregex (mapconcat (lambda (x) (concat "" x)) LilyPond-Capitalized-Reserved-Words "\\|")) + (duration "\\([ \t]*\\(128\\|6?4\\|3?2\\|16?\\|8\\)[.]*\\([ \t]*[*][ \t]*[0-9]+\\(/[1-9][0-9]*\\)?\\)?\\)") + (longduration "\\([ \t]*\\(\\\\\\(longa\\|breve\\|maxima\\)\\)[.]*\\([ \t]*[*][ \t]*[0-9]+\\(/[1-9][0-9]*\\)?\\)?\\)") +) + + (list +;; Fonts in use (from GNU Emacs Lisp Reference Manual, elisp.ps): +;; font-lock- (c)omment / (s)tring / (k)eyword / (b)uiltin / (f)unction-name / +;; (v)ariable-name / (t)ype / co(n)stant / (w)arning -face + +;; The order below is designed so that proofreading would be possible. + +;; Fontify... +;; ... (f) identifiers and (k) keywords. +;; ... (n) user defined indetifiers +;; ... (v) the right and the left side of '='-marks. +;; ... (v) reserved words, e.g., FiguredBass. +;; ... (t) notes and rests +;; "on top", ... (s) lyrics-mode +;; "on top", ... (w) horizontal grouping +;; "on top", ... (f) vertical grouping +;; "on top", ... (b) expressional grouping +;; "on top", ... (s) (multiline-)scheme; urgh. one should count the slurs +;; "on top", ... (s) strings +;; "on top", ... (c) (multiline-)comments + +;; One should note 'font-lock-multiline' has been possible since Emacs 21.1. +;; See, e.g., text in "http://emacs.kldp.org/emacs-21.1/etc/NEWS". + +;; ... identifiers (defined above, see iregex) + (cons (concat "\\(\\([_^-]?\\(" iregex "\\)\\)+\\)\\($\\|[] \t(~{}>\\\\_()^*-]\\)") '(1 font-lock-function-name-face)) + +;; ... keywords (defined above, see kwregex) + (cons (concat "\\(\\([_^-]?\\(" kwregex "\\)\\)+\\)\\($\\|[] \t(~{}>\\\\_()^*-]\\)") '(1 font-lock-keyword-face)) + +;; ... user defined identifiers, roughly \[a-zA-Z]+ with single - or _ in between. + '("\\([_^-]?\\\\\\([a-zA-Z[:nonascii:]]\\(?:[-_]?[a-zA-Z[:nonascii:]]\\)*\\)\\)" 1 font-lock-constant-face) + +;; ... the left side of '=' -mark + '("\\([_a-zA-Z.0-9-]+\\)[ \t]*=[ \t]*" 1 font-lock-variable-name-face) + +;; ... the right side of '=' -mark + '("[ \t]*=[ \t]*\\([_a-zA-Z.0-9-]+\\)" 1 font-lock-variable-name-face) + +;; ... reserved words (defined above, see rwregex) + (cons (concat "\\(" rwregex "\\)") 'font-lock-variable-name-face) + +;; ... note or rest with (an accidental and) a duration, e.g., b,?16.*3/4 + (cons (concat "\\(^\\|[ <\{[/~(!)\t\\\|]\\)\\(\\(\\(" ncrwregex "\\)[,']*[?!]?\\|[srR]\\)" duration "?\\)") '(2 font-lock-type-face)) + +;; "on top", ... notes and rests with a long duration + (cons (concat "\\(^\\|[ <\{[/~(!)\t\\\|]\\)\\(\\(\\(" ncrwregex "\\)[,']*[?!]?\\|[srR]\\)" longduration "\\)") '(2 font-lock-type-face t)) + +;; "on top", ... lyrics-mode: fontify everything between '<'...'>' or '{'...'}' +; URGH, does not know anything about inner brackets. +; Multiple lines may need refontifying (C-c f). + '("\\(\\\\lyrics[^{<]*\\)\\({[^}]*\\|<[^>]*\\)" 2 font-lock-string-face t) + +;; "on top", ... horizontal grouping, also as postfix syntax '-*': +;; - brackets '{[]}' +;; - ties '~' +;; - ligatures \[, \] + '("\\(-?[][~}{]\\|\\\\[][]\\)" 0 font-lock-reference-face t) + +;; "on top", ... vertical grouping: +;; - '<>'-chord brackets with '\\'-voice sep., not marcato '->' +;; - '<< a b >>8' -chords + (cons (concat "\\(\\(-.\\)+\\|[^-^_]\\)\\([<>]+\\(" duration "\\|" longduration "\\)?\\|\\\\\\\\\\)") '(3 font-lock-function-name-face t)) + +;; "on top", ... expressional grouping, also as postfix syntax '-*': +;; - slurs ( ), \( \), [-^_][()] +;; - hairpins \<, \>, \! + '("\\(-?\\\\[()]\\|[-^_]?[()]\\)" 0 font-lock-builtin-face t) + +;; "on top", ... (multiline-)scheme: try find slurs up to 7th + '("[_^-]?#\\(#[ft]\\|-?[0-9.]+\\|\"[^\"]*\"\\|['`]?[a-zA-Z:-]+\\|['`]?([^()]*\\(([^()]*\\(([^()]*\\(([^()]*\\(([^()]*\\(([^()]*\\(([^)]*)[^()]*\\)*)[^()]*\\)*)[^()]*\\)*)[^()]*\\)*)[^()]*\\)*)[^()]*\\)*[^)]*)\\)" 0 font-lock-string-face t) + +;; "on top", ... strings, match also unending strings at eof: +;; if '\n' was not found, it must be '$' which is eof (?). + '("\\([_^-]?\"\\([^\"\\\\]\\|\\\\.\\|\\\\\n\\)*\\(\"\\|$\\)\\)" 0 font-lock-string-face t) + +;; "on top", ... (multiline-)comments + '("\\(%\\({[^%]*%\\(}\\|\\([^}][^%]*%\\)+}\\)\\|.*\\)\\)" 0 font-lock-comment-face t) + + ) + ) + "Additional expressions to fontify in LilyPond mode.") + +;; define a mode-specific abbrev table for those who use such things +(defvar LilyPond-mode-abbrev-table nil + "Abbrev table in use in `LilyPond-mode' buffers.") + +(define-abbrev-table 'LilyPond-mode-abbrev-table nil) + +(defvar LilyPond-mode-syntax-table nil + "Syntax table used in `LilyPond-mode' buffers.") + +(defun LilyPond-mode-set-syntax-table (&optional not-punct) + "Change syntax table according to the argument `not-punct' which contains characters which are given a context dependent non-punctuation syntax: parentheses may be set to parenthesis syntax and characters `-', `^' and `_' may be set to escape syntax." + (if (not not-punct) (setq not-punct '())) + (setq LilyPond-mode-syntax-table (make-syntax-table)) + (let ((defaults + '( + ;; NOTE: Emacs knows only "13"-style (used), XEmacs knows also "1b3b", etc. + ( ?\% . "< 13" ) ; comment starter, 1st char in block-comments + ( ?\n . ">") ; newline: comment ender + ( ?\r . ">") ; formfeed: comment ender + ( ?\\ . "\\" ) ; escape characters (as '\n' in strings) + ( ?\" . "\"" ) ; string quote characters + ;; word constituents (e.g., belonging to a note) + ( ?\' . "w") ( ?\, . "w") ; transposing octaves + ;; punctuation characters (separate symbols from another) + ( ?\$ . "." ) ( ?\& . "." ) + ( ?\* . "." ) ( ?\+ . "." ) ( ?\/ . "." ) ( ?\= . "." ) + ( ?\| . "." ) ; bar line + ))) + ;; all the paren characters are now handled by lily-specific indenting/matching code in lilypond-indent.el + (if (or (memq ?\{ not-punct) (memq ?\} not-punct)) + (setq defaults (cons '( ?\{ . "(} 2" ) (cons '( ?\} . "){ 4" ) defaults))) ; begin and end of a block-comment + (setq defaults (cons '( ?\{ . ". 2" ) (cons '( ?\} . ". 4" ) defaults)))) ; begin and end of a block-comment + (if (or (memq ?\[ not-punct) (memq ?\] not-punct)) + (setq defaults (cons '( ?\[ . "(]" ) (cons '( ?\] . ")[" ) defaults))) + (setq defaults (cons '( ?\[ . "." ) (cons '( ?\] . "." ) defaults)))) + (if (or (memq ?\< not-punct) (memq ?\> not-punct)) + (setq defaults (cons '( ?\< . "(>" ) (cons '( ?\> . ")<" ) defaults))) + (setq defaults (cons '( ?\< . "." ) (cons '( ?\> . "." ) defaults)))) + (if (or (memq ?\( not-punct) (memq ?\) not-punct)) + (setq defaults (cons '( ?\( . "()" ) (cons '( ?\) . ")(" ) defaults))) + (setq defaults (cons '( ?\( . "." ) (cons '( ?\) . "." ) defaults)))) + ;; In LilyPond the following chars serve as escape chars, e.g., c^> d-) e_( , + ;; but they may be set to punctuation chars, since inside strings they should not act as escape chars + (setq defaults (cons (if (memq ?- not-punct) '( ?\- . "\\" ) '( ?\- . "." ) ) defaults)) + (setq defaults (cons (if (memq ?^ not-punct) '( ?^ . "\\" ) '( ?^ . "." ) ) defaults)) + (setq defaults (cons (if (memq ?\_ not-punct) '( ?\_ . "\\" ) '( ?\_ . "." ) ) defaults)) + (mapcar (function + (lambda (x) (modify-syntax-entry + (car x) (cdr x) LilyPond-mode-syntax-table))) + defaults) + (set-syntax-table LilyPond-mode-syntax-table))) + +(defun LilyPond-mode-context-set-syntax-table () + "Change syntax table according to current context." + (interactive) + ;; default syntax table sets parentheses to punctuation characters + (LilyPond-mode-set-syntax-table) + ;; find current context + (setq context (parse-partial-sexp (point-min) (point))) + (cond ((nth 3 context)) ; inside string + ((nth 4 context)) ; inside a comment + ((eq (char-syntax (or (char-before (point)) 0)) ?\\)) ; found escape-char + ((and (eq (char-syntax (or (char-before (- (point) 1)) 0)) ?\\) + (memq (char-before (point)) '( ?\) ?\] )))) ; found escape-char + ((memq (char-before (point)) '( ?\) )) + (LilyPond-mode-set-syntax-table '( ?\( ?\) ))) + ((memq (char-before (point)) '( ?\] )) + (LilyPond-mode-set-syntax-table '( ?\[ ?\] ))) + ((memq (char-before (point)) '( ?\> ?\} )) + (LilyPond-mode-set-syntax-table '( ?\< ?\> ?\{ ?\} ?\^ ?\- ?\_ ))) + ((memq (char-after (point)) '( ?\( )) + (LilyPond-mode-set-syntax-table '( ?\( ?\) ))) + ((memq (char-after (point)) '( ?\[ )) + (LilyPond-mode-set-syntax-table '( ?\[ ?\] ))) + ((memq (char-after (point)) '( ?\< ?\{ )) + (LilyPond-mode-set-syntax-table '( ?\< ?\> ?\{ ?\} ?\^ ?\- ?\_ ))) + )) diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-indent.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-indent.el new file mode 100644 index 0000000..70d24f9 --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-indent.el @@ -0,0 +1,587 @@ +;;; lilypond-indent.el --- Auto-indentation for lilypond code +;;; +;;; Heikki Junes +;;; * ond-char paren matching is handled by context dependent syntax tables +;;; * match two-char slurs '\( ... \)' and '\[ ... \]' separately. +;;; * adopt Emacs' f90-comment-region + +;;; Chris Jackson +;;; some code is taken from ESS (Emacs Speaks Statistics) S-mode by A.J.Rossini + +;;; Variables for customising indentation style + +;;; TODO: +;;; * currently, in bracket matching one may need a non-bracket +;;; chararacter between the bracket characters, like ( ( ) ) + +(defcustom LilyPond-indent-level 2 + "*Indentation of lilypond statements with respect to containing block." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-brace-offset 0 + "*Extra indentation for open braces. +Compares with other text in same context." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-angle-offset 0 + "*Extra indentation for open angled brackets. +Compares with other text in same context." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-square-offset 0 + "*Extra indentation for open square brackets. +Compares with other text in same context." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-scheme-paren-offset 0 + "*Extra indentation for open scheme parens. +Compares with other text in same context." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-close-brace-offset 0 + "*Extra indentation for closing braces." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-close-angle-offset 0 + "*Extra indentation for closing angle brackets." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-close-square-offset 0 + "*Extra indentation for closing square brackets." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-close-scheme-paren-offset 0 + "*Extra indentation for closing scheme parens." + :group 'LilyPond + :type 'integer) + +(defcustom LilyPond-fancy-comments t + "*Non-nil means distiguish between %, %%, and %%% for indentation." + :group 'LilyPond + :type 'boolean) + +(defcustom LilyPond-comment-region "%%%" + "*String inserted by \\[LilyPond-comment-region]\ + at start of each line in region." + :group 'LilyPond + :type 'string) + +(defun LilyPond-comment-region (beg-region end-region) + "Comment/uncomment every line in the region. +Insert LilyPond-comment-region at the beginning of every line in the region +or, if already present, remove it." + (interactive "*r") + (let ((end (make-marker))) + (set-marker end end-region) + (goto-char beg-region) + (beginning-of-line) + (if (looking-at (regexp-quote LilyPond-comment-region)) + (delete-region (point) (match-end 0)) + (insert LilyPond-comment-region)) + (while (and (zerop (forward-line 1)) + (< (point) (marker-position end))) + (if (looking-at (regexp-quote LilyPond-comment-region)) + (delete-region (point) (match-end 0)) + (insert LilyPond-comment-region))) + (set-marker end nil))) + +(defun LilyPond-calculate-indent () + "Return appropriate indentation for current line as lilypond code. +In usual case returns an integer: the column to indent to. +Returns nil if line starts inside a string" + (save-excursion + (beginning-of-line) + (let ((indent-point (point)) + (case-fold-search nil) + state) + (setq containing-sexp (save-excursion (LilyPond-scan-containing-sexp))) + (beginning-of-defun) + (while (< (point) indent-point) + (setq state (parse-partial-sexp (point) indent-point 0))) + ;; (setq containing-sexp (car (cdr state))) is the traditional way for languages + ;; with simpler parenthesis delimiters + (cond ((nth 3 state) + ;; point is in the middle of a string + nil) + ((nth 4 state) + ;; point is in the middle of a block comment + (LilyPond-calculate-indent-within-blockcomment)) + ((null containing-sexp) + ;; Line is at top level - no indent + (beginning-of-line) + 0) + (t + ;; Find previous non-comment character. + (goto-char indent-point) + (LilyPond-backward-to-noncomment containing-sexp) + ;; Now we get the answer. + ;; Position following last unclosed open. + (goto-char containing-sexp) + (or + ;; Is line first statement after an open brace or bracket? + ;; If no, find that first statement and indent like it. + (save-excursion + (forward-char 1) + ;; Skip over comments following open brace. + (skip-chars-forward " \t\n") + (cond ((looking-at "%{") + (while (progn + (and (not (looking-at "%}")) + (< (point) (point-max)))) + (forward-line 1) + (skip-chars-forward " \t\n")) + (forward-line 1) + (skip-chars-forward " \t\n")) + ((looking-at "%") + (while (progn (skip-chars-forward " \t\n") + (looking-at "%")) + (forward-line 1)))) + ;; The first following code counts + ;; if it is before the line we want to indent. + (and (< (point) indent-point) + (current-column))) + ;; If no previous statement, + ;; indent it relative to line brace is on. + ;; For open brace in column zero, don't let statement + ;; start there too. If LilyPond-indent-level is zero, use + ;; LilyPond-brace-offset instead + (+ (if (and (bolp) (zerop LilyPond-indent-level)) + (cond ((= (following-char) ?{) + LilyPond-brace-offset) + ((= (following-char) ?<) + LilyPond-angle-offset) + ((= (following-char) ?\[) + LilyPond-square-offset) + ((= (following-char) ?\)) + LilyPond-scheme-paren-offset) + (t + 0)) + LilyPond-indent-level) + (progn + (skip-chars-backward " \t") + (current-indentation))))))))) + + +(defun LilyPond-indent-line () + "Indent current line as lilypond code. +Return the amount the indentation changed by." + (let ((indent (LilyPond-calculate-indent)) + beg shift-amt + (case-fold-search nil) + (pos (- (point-max) (point)))) + (beginning-of-line) + (setq beg (point)) + (cond ((eq indent nil) + (setq indent (current-indentation))) + (t + (skip-chars-forward " \t") + (if (and LilyPond-fancy-comments (looking-at "%%%\\|%{\\|%}")) + (setq indent 0)) + (if (and LilyPond-fancy-comments + (looking-at "%") + (not (looking-at "%%\\|%{\\|%}"))) + (setq indent comment-column) + (if (eq indent t) (setq indent 0)) + (if (listp indent) (setq indent (car indent))) + (cond + ((= (following-char) ?}) + (setq indent (+ indent (- LilyPond-close-brace-offset LilyPond-indent-level)))) + ((= (following-char) ?>) + (setq indent (+ indent (- LilyPond-close-angle-offset LilyPond-indent-level)))) + ((= (following-char) ?\]) + (setq indent (+ indent (- LilyPond-close-square-offset LilyPond-indent-level)))) + ((and (= (following-char) ?\)) (LilyPond-inside-scheme-p)) + (setq indent (+ indent (- LilyPond-close-scheme-paren-offset LilyPond-indent-level)))) + ((= (following-char) ?{) + (setq indent (+ indent LilyPond-brace-offset))) + ((= (following-char) ?<) + (setq indent (+ indent LilyPond-angle-offset))) + ((= (following-char) ?\[) + (setq indent (+ indent LilyPond-square-offset))) + ((and (= (following-char) ?\() (LilyPond-inside-scheme-p)) + (setq indent (+ indent LilyPond-scheme-paren-offset))) + )))) + (skip-chars-forward " \t") + (setq shift-amt (- indent (current-column))) + (if (zerop shift-amt) + (if (> (- (point-max) pos) (point)) + (goto-char (- (point-max) pos))) + (delete-region beg (point)) + (indent-to indent) + ;; If initial point was within line's indentation, + ;; position after the indentation. + ;; Else stay at same point in text. + (if (> (- (point-max) pos) (point)) + (goto-char (- (point-max) pos)))) + shift-amt)) + + +(defun LilyPond-inside-comment-p () + "Return non-nil if point is inside a line or block comment" + (setq this-point (point)) + (or (save-excursion (beginning-of-line) + (skip-chars-forward " \t") + (looking-at "%")) + (save-excursion + ;; point is in the middle of a block comment + (setq lastopen (save-excursion (re-search-backward "%{[ \\t]*" (point-min) t))) + (setq lastclose (save-excursion (re-search-backward "%}[ \\t]*" (point-min) t))) + (if (or (and (= (char-before) ?%) (= (char-after) ?{)) + (and (= (char-after) ?%) (= (char-after (1+ (point))) ?{))) + (setq lastopen (save-excursion (backward-char) (point)))) + (and + lastopen + (or (not lastclose) + (<= lastclose lastopen)))) + )) + + +(defun LilyPond-inside-string-or-comment-p () + "Test if point is inside a string or a comment" + (setq this-point (point)) + (or (save-excursion (beginning-of-line) + (skip-chars-forward " \t") + (looking-at "%")) + (save-excursion + (beginning-of-defun) + (while (< (point) this-point) + (setq state (parse-partial-sexp (point) this-point 0))) + (cond ((nth 3 state) + ;; point is in the middle of a string + t ) + ((nth 4 state) + ;; point is in the middle of a block comment + t ) + (t + nil))))) + + +(defun LilyPond-backward-over-blockcomments (lim) + "Move point back to closest non-whitespace character not part of a block comment" + (setq lastopen (save-excursion (re-search-backward "%{[ \\t]*" lim t))) + (setq lastclose (save-excursion (re-search-backward "%}[ \\t]*" lim t))) + (if lastopen + (if lastclose + (if (<= lastclose lastopen) + (goto-char lastopen)) + (goto-char lastopen))) + (skip-chars-backward " %\t\n\f")) + + +(defun LilyPond-backward-over-linecomments (lim) + "Move point back to the closest non-whitespace character not part of a line comment. +Argument LIM limit." + (let (opoint stop) + (while (not stop) + (skip-chars-backward " \t\n\f" lim) + (setq opoint (point)) + (beginning-of-line) + (search-forward "%" opoint 'move) + (skip-chars-backward " \t%") + (setq stop (or (/= (preceding-char) ?\n) (<= (point) lim))) + (if stop (point) + (beginning-of-line))))) + + +(defun LilyPond-backward-to-noncomment (lim) + "Move point back to closest non-whitespace character not part of a comment" + (LilyPond-backward-over-linecomments lim) + (LilyPond-backward-over-blockcomments lim)) + + +(defun LilyPond-calculate-indent-within-blockcomment () + "Return the indentation amount for line inside a block comment." + (let (end percent-start) + (save-excursion + (beginning-of-line) + (skip-chars-forward " \t") + (skip-chars-backward " \t\n") + (setq end (point)) + (beginning-of-line) + (skip-chars-forward " \t") + (and (re-search-forward "%{[ \t]*" end t) + (goto-char (1+ (match-beginning 0)))) + (if (and (looking-at "[ \t]*$") (= (preceding-char) ?\%)) + (1+ (current-column)) + (current-column))))) + + +;; Key: Type of bracket (character). +;; Value: Pair of regexps representing the corresponding open and close bracket +;; () are treated specially (need to indent in Scheme but not in music) + +(defconst LilyPond-parens-regexp-alist + `( ( ?> . ("\\([^\\]\\|^\\)<" . "\\([^ \\n\\t_^-]\\|[_^-][-^]\\|\\s-\\)\\s-*>")) + ;; a b c->, a b c^> and a b c_> are not close-angle-brackets, they're accents + ;; but a b c^-> and a b c^^> are close brackets with tenuto/marcato before them + ;; also \> and \< are hairpins + ;; duh .. a single '>', as in chords '<< ... >>', was not matched here + ( ?} . ("{" . "}")) + ;; ligatures '\[ ... \]' are skipped in the following expression + ( ?\] . ("\\([^\\]\\([\\][\\]\\)*\\|^\\)[[]" . "\\([^\\]\\([\\][\\]\\)*\\|^\\)[]]")) + ( "\\]" . ("\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][[]" . "\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][]]")) + ( "\\)" . ("\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][(]" . "\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][)]")) + )) + + +(defconst LilyPond-parens-alist + `( ( ?< . ?> ) + ( ?{ . ?} ) + ( ?\[ . ?\] ) + ( "\\[" . "\\]" ) + ( ?\( . ?\) ) + ( "\\(" . "\\)" ) + )) + + +(defun LilyPond-matching-paren (bracket-type) + "Returns the open corresponding to the close specified by bracket-type, or vice versa" + (cond ( (member bracket-type (mapcar 'car LilyPond-parens-alist)) + (cdr (assoc bracket-type LilyPond-parens-alist)) ) + ( (member bracket-type (mapcar 'cdr LilyPond-parens-alist)) + (car (rassoc bracket-type LilyPond-parens-alist)) ) + nil)) + + +(defun LilyPond-scan-containing-sexp (&optional bracket-type slur-paren-p dir) + "Move point to the beginning of the deepest parenthesis pair enclosing point. + +If the optional argument bracket-type, a character representing a +close bracket such as ) or }, is specified, then the parenthesis pairs +searched are limited to this type. + +If the optional argument slur-paren-p is non-nil, then slur +parentheses () are considered as matching pairs. Otherwise Scheme +parentheses are considered to be matching pairs, but slurs are not. +slur-paren-p defaults to nil. +" +;;; An user does not call this function directly, or by a key sequence. + ;; (interactive) + (let ( (level (if (not (eq dir 1)) 1 -1)) + (regexp-alist LilyPond-parens-regexp-alist) + (oldpos (point)) + (assoc-bracket-type (if (not (eq dir 1)) bracket-type (LilyPond-matching-paren bracket-type)))) + + (if (LilyPond-inside-scheme-p) + (setq paren-regexp "(\\|)") + (if slur-paren-p + ;; expressional slurs '\( ... \)' are not taken into account + (setq regexp-alist (cons '( ?\) . ("\\([^\\]\\([\\][\\]\\)*\\|^\\)(" . "\\([^\\]\\([\\][\\]\\)*\\|^\\))")) regexp-alist))) + (if (member assoc-bracket-type (mapcar 'car regexp-alist)) + (progn (setq paren-regexp (cdr (assoc assoc-bracket-type regexp-alist))) + (setq paren-regexp (concat (car paren-regexp) "\\|" (cdr paren-regexp)))) + (setq paren-regexp (concat (mapconcat 'car (mapcar 'cdr regexp-alist) "\\|") "\\|" + (mapconcat 'cdr (mapcar 'cdr regexp-alist) "\\|"))))) + ;; match concurrent one-char opening and closing slurs + (if (and (eq dir 1) + (not (sequencep bracket-type)) + (eq (char-syntax (or (char-after oldpos) 0)) ?\() + (not (eq (char-after oldpos) ?<))) + ;; anyway do not count open slur, since already level = -1 + (progn (forward-char 1) + (if (eq (following-char) + (LilyPond-matching-paren (char-after oldpos))) + ;; matching char found, go after it and set level = 0 + (progn (forward-char 1) + (setq level 0))))) + ;; browse the code until matching slur is found, or report mismatch + (while (and (if (not (eq dir 1)) + (> level 0) + (< level 0)) + ;; dir tells whether to search backward or forward + (if (not (eq dir 1)) + (re-search-backward paren-regexp nil t) + (re-search-forward paren-regexp nil t)) + ;; note: in case of two-char bracket only latter is compared + (setq match (char-before (match-end 0)))) +;;; (message "%d" level) (sit-for 0 300) + (if (not (save-excursion (goto-char (match-end 0)) + ;; skip over strings and comments + (LilyPond-inside-string-or-comment-p))) + (if (memq match '(?} ?> ?\] ?\))) + ;; count closing brackets + (progn (setq level (1+ level)) + ;; slurs may be close to each other, e.g., + ;; a single '>' was not matched .. need to be corrected + (if (and (eq dir 1) (eq (char-after (match-end 0)) match)) + (if (/= level 0) + (progn + (setq level (1+ level)) + (forward-char 1)))) +;;; (message "%d %c" level match) (sit-for 0 300) + ;; hmm.. + (if (and (= match ?>) + (looking-at ".\\s-+>\\|\\({\\|}\\|<\\|>\\|(\\|)\\|[][]\\)>")) + (forward-char 1))) + ;; count opening brackets + (progn (setq level (1- level)) +;;; (message "%d %c" level match) (sit-for 0 300) + ;; hmm.. + (if (and (= match ?<) + (looking-at ".\\s-+<\\|\\({\\|}\\|<\\|>\\|(\\|)\\|[][]\\)<")) + (forward-char 1)))))) + ;; jump to the matching slur + (if (not (eq dir 1)) + (progn + (if (sequencep bracket-type) + ;; match the latter char in two-char brackets + (if (looking-at "..[][)(]") (forward-char 1))) + ;; if the following char is not already a slur + (if (and (not (looking-at "[)(]")) + ;; match the slur which follows + (looking-at ".[][><)(]")) (forward-char 1))) + (backward-char 1)) + (if (= level 0) + (point) + (progn (goto-char oldpos) + nil)))) + + +(defun LilyPond-inside-scheme-p () + "Tests if point is inside embedded Scheme code" +;;; An user does not call this function directly, or by a key sequence. + ;; (interactive) + (let ( (test-point (point)) + (level 0) ) + (save-excursion + (if (or (and (eq (char-after (point)) ?\() + (save-excursion + (skip-chars-backward "'`") + (memq (char-before) '(?# ?$)))) + (and (re-search-backward "[#$][`']?(" nil t) + (progn + (search-forward "(") + (setq level 1) + (while (and (> level 0) + (re-search-forward "[()]" test-point t) + (setq match (char-after (match-beginning 0))) + (<= (point) test-point)) + (if (= match ?\() + (setq level (1+ level)) + (setq level (1- level)))) + (> level 0)))) + t + nil)))) + + +;;; Largely taken from the 'blink-matching-open' in lisp/simple.el in +;;; the Emacs distribution. + +(defun LilyPond-blink-matching-paren (&optional dir) + "Move cursor momentarily to the beginning of the sexp before +point. In lilypond files this is used for closing ), ], } and >, whereas the +builtin 'blink-matching-open' is not used. In syntax table, see +`lilypond-font-lock.el', all brackets are punctuation characters." +;;; An user does not call this function directly, or by a key sequence. + ;; (interactive) + (let ( (oldpos (point)) + (level 0) + (mismatch) ) + (if (not (or (equal this-command 'LilyPond-electric-close-paren) + (eq dir 1))) + (goto-char (setq oldpos (- oldpos 1)))) + ;; Test if a ligature \] or expressional slur \) was encountered + (setq bracket-type (char-after (point))) + (setq char-before-bracket-type nil) + (if (memq bracket-type '(?\] ?\) ?\[ ?\()) + (progn + (setq np -1) + (while (eq (char-before (- (point) (setq np (+ np 1)))) ?\\) + (setq char-before-bracket-type (if char-before-bracket-type nil ?\\))) + (if (eq char-before-bracket-type ?\\) + (setq bracket-type (string char-before-bracket-type bracket-type))))) + (when blink-matching-paren-distance + (narrow-to-region + (max (point-min) (- (point) blink-matching-paren-distance)) + (min (point-max) (+ (point) blink-matching-paren-distance)))) + (if (and (equal this-command 'LilyPond-electric-close-paren) + (memq bracket-type '(?> ?} ?< ?{))) + ;; < { need to be mutually balanced and nested, so search backwards for both of these bracket types + (LilyPond-scan-containing-sexp nil nil dir) + ;; whereas ( ) slurs within music don't, so only need to search for ( ) + ;; use same mechanism for [ ] slurs + (LilyPond-scan-containing-sexp bracket-type t dir)) + (setq blinkpos (point)) + (setq mismatch + (or (null (LilyPond-matching-paren (char-after blinkpos))) + (/= (char-after oldpos) + (LilyPond-matching-paren (char-after blinkpos))))) + (if mismatch (progn (setq blinkpos nil) + (message "Mismatched parentheses"))) + (if (and blinkpos + (equal this-command 'LilyPond-electric-close-paren)) + (if (pos-visible-in-window-p) + (and blink-matching-paren-on-screen + (sit-for blink-matching-delay)) + (message + "Matches %s" + ;; Show what precedes the open in its line, if anything. + (if (save-excursion + (skip-chars-backward " \t") + (not (bolp))) + (buffer-substring (progn (beginning-of-line) (point)) + (1+ blinkpos)) + ;; Show what follows the open in its line, if anything. + (if (save-excursion + (forward-char 1) + (skip-chars-forward " \t") + (not (eolp))) + (buffer-substring blinkpos + (progn (end-of-line) (point))) + ;; Otherwise show the previous nonblank line, + ;; if there is one. + (if (save-excursion + (skip-chars-backward "\n \t") + (not (bobp))) + (concat + (buffer-substring (progn + (skip-chars-backward "\n \t") + (beginning-of-line) + (point)) + (progn (end-of-line) + (skip-chars-backward " \t") + (point))) + ;; Replace the newline and other whitespace with `...'. + "..." + (buffer-substring blinkpos (1+ blinkpos))) + ;; There is nothing to show except the char itself. + (buffer-substring blinkpos (1+ blinkpos)))))))) + (if (not (equal this-command 'LilyPond-electric-close-paren)) + (goto-char (setq oldpos (+ oldpos 1))) + (goto-char oldpos)) + (if (not (eq dir 1)) + blinkpos + (+ blinkpos 1)))) + + +(defun LilyPond-electric-close-paren () + "Blink on the matching open paren when a >, ), } or ] is inserted" + (interactive) + (let ((oldpos (point))) + (self-insert-command 1) + ;; Refontify buffer if a block-comment-ender '%}' is inserted + (if (and (eq (char-before (point)) ?}) + (eq (char-before (- (point) 1)) ?%)) + (font-lock-fontify-buffer) + ;; Match paren if the cursor is not inside string or comment. + (if (and blink-matching-paren + (not (LilyPond-inside-string-or-comment-p)) + (save-excursion (re-search-backward + (concat (mapconcat 'cdr (mapcar 'cdr LilyPond-parens-regexp-alist) "\\|") "\\|)") nil t) + (eq oldpos (1- (match-end 0))))) + (progn (backward-char 1) + (LilyPond-blink-matching-paren) + (forward-char 1)))))) + +(defun LilyPond-scan-sexps (pos dir) + "This function is redefined to be used in Emacs' show-paren-function and +in XEmacs' paren-highlight." + (LilyPond-blink-matching-paren dir)) diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-init.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-init.el new file mode 100644 index 0000000..2ee31da --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-init.el @@ -0,0 +1,21 @@ +;;; lilypond-init.el --- Startup code for LilyPond mode +;; +;; Instructions, extracted from Documentation/topdocs/INSTALL.texi: + +;; Emacs mode for entering music and running LilyPond is contained in +;; the source archive as `lilypond-mode.el', `lilypond-indent.el', +;; `lilypond-font-lock.el' and `lilypond-words.el'. You should install +;; these files to a directory included in your `load-path'. +;; File `lilypond-init.el' should be placed to `load-path/site-start.d/' +;; or appended to your `~/.emacs' or `~/.emacs.el'. + +;; As a user, you may want add your source path or, e.g., `~/site-lisp/' to +;; your `load-path'. Append the following line (modified) to your `~/.emacs': + +;(setq load-path (append (list (expand-file-name "~/site-lisp")) load-path)) + +(autoload 'LilyPond-mode "lilypond-mode" "LilyPond Editing Mode" t) +(add-to-list 'auto-mode-alist '("\\.ly$" . LilyPond-mode)) +(add-to-list 'auto-mode-alist '("\\.ily$" . LilyPond-mode)) +(add-hook 'LilyPond-mode-hook (lambda () (turn-on-font-lock))) + diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-mode.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-mode.el new file mode 100644 index 0000000..0bf0540 --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-mode.el @@ -0,0 +1,1206 @@ +;;;; lilypond-mode.el -- Major mode for editing GNU LilyPond music scores +;;;; This file is part of LilyPond, the GNU music typesetter. +;;;; +;;;; Copyright (C) 1999--2015 Jan Nieuwenhuizen +;;;; Changed 2001--2003 Heikki Junes +;;;; * Add PS-compilation, PS-viewing and MIDI-play (29th Aug 2001) +;;;; * Keyboard shortcuts (12th Sep 2001) +;;;; * Inserting tags, inspired on sgml-mode (11th Oct 2001) +;;;; * Autocompletion & Info (23rd Nov 2002) +;;;; +;;;; LilyPond 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. +;;;; +;;;; LilyPond 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 LilyPond. If not, see . + + +;;; Inspired on auctex + +;;; Look lilypond-init.el or Documentation/topdocs/INSTALL.texi +;;; for installing instructions. + +(require 'easymenu) +(require 'compile) + +(defconst LilyPond-version "2.5.20" + "`LilyPond-mode' version number.") + +(defconst LilyPond-help-address "bug-lilypond@gnu.org" + "Address accepting submission of bug reports.") + +(defvar LilyPond-mode-hook nil + "*Hook called by `LilyPond-mode'.") + +(defvar LilyPond-region-file-prefix "emacs-lily" + "File prefix for commands on buffer or region.") + +(defvar LilyPond-master-file nil + "Master file that LilyPond will be run on.") + +;; FIXME: find ``\score'' in buffers / make settable? +(defun LilyPond-get-master-file () + (or LilyPond-master-file + (buffer-file-name))) + +(defvar LilyPond-kick-xdvi nil + "If true, no simultaneous xdvi's are started, but reload signal is sent.") + +(defvar LilyPond-command-history nil + "Command history list.") + +(defvar LilyPond-regexp-alist + '(("\\([a-zA-Z]?:?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 2)) + "Regexp used to match LilyPond errors. See `compilation-error-regexp-alist'.") + +(defvar LilyPond-imenu nil + "A flag to tell whether LilyPond-imenu is turned on.") +(make-variable-buffer-local 'LilyPond-imenu) + +(defcustom LilyPond-include-path ".:/tmp" + "* LilyPond include path." + :type 'string + :group 'LilyPond) + +(defun LilyPond-words-filename () + "The file containing LilyPond \keywords \Identifiers and ReservedWords. +Finds file lilypond-words.el from load-path." + (let ((fn nil) + (lp load-path) + (words-file "lilypond-words.el")) + (while (and (> (length lp) 0) (not fn)) + (setq fn (concat (car lp) "/" words-file)) + (if (not (file-readable-p fn)) + (progn (setq fn nil) (setq lp (cdr lp))))) + (if (not fn) + (progn (message "Warning: `lilypond-words.el' not found in `load-path'. See `lilypond-init.el'.") + (sit-for 5 0))) + fn)) + +(defun LilyPond-add-dictionary-word (x) + "Contains all words: \keywords \Identifiers and ReservedWords." + (nconc '(("" . 1)) x)) + +(if (> emacs-major-version 20) + (defun get-buffer-size (b) (buffer-size b)) + (defun get-buffer-size (b) + (let (size (current-buffer (current-buffer))) + (set-buffer b) + (setq size (buffer-size)) + (set-buffer current-buffer) + size + ))) + +;; creates dictionary if empty +(if (and (eq (length (LilyPond-add-dictionary-word ())) 1) + (not (eq (LilyPond-words-filename) nil))) + (progn + (setq b (find-file-noselect (LilyPond-words-filename) t t)) + (setq m (set-marker (make-marker) 1 (get-buffer b))) + (setq i 1) + (while (> (get-buffer-size b) (marker-position m)) + (setq i (+ i 1)) + (setq copy (copy-alist (list (eval (symbol-name (read m)))))) + (setcdr copy i) + (LilyPond-add-dictionary-word (list copy))) + (kill-buffer b))) + +(defvar LilyPond-insert-tag-current "" + "The last command selected from the LilyPond-Insert -menu.") + +(defconst LilyPond-menu-keywords + (let ((wordlist '()) + (co (all-completions "" (LilyPond-add-dictionary-word ()))) + (currword "")) + (progn + (while (> (length co) 0) + (setq currword (car co)) + (if (string-equal "-" (car (setq co (cdr co)))) + (progn + (add-to-list 'wordlist currword) + (while (and (> (length co) 0) + (not (string-equal "-" (car (setq co (cdr co)))))))))) + (reverse wordlist))) + "Keywords inserted from LilyPond-Insert-menu.") + +(defconst LilyPond-keywords + (let ((wordlist '("\\score")) + (co (all-completions "" (LilyPond-add-dictionary-word ()))) + (currword "")) + (progn + (while (> (length co) 0) + (setq currword (car co)) + (if (> (length currword) 1) + (if (and (string-equal "\\" (substring currword 0 1)) + (string-match "[a-z-]+" currword) + (= (match-beginning 0) 1) + (= (match-end 0) (length currword)) + (not (string-equal "\\longa" currword)) + (not (string-equal "\\breve" currword)) + (not (string-equal "\\maxima" currword)) + (string-equal (downcase currword) currword)) + (add-to-list 'wordlist currword))) + (if (string-equal "-" (car (setq co (cdr co)))) + (while (and (> (length co) 0) + (not (string-equal "-" (car (setq co (cdr co))))))))) + (reverse wordlist))) + "LilyPond \\keywords") + +(defconst LilyPond-identifiers + (let ((wordlist '("\\voiceOne")) + (co (all-completions "" (LilyPond-add-dictionary-word ())))) + (progn + (while (> (length co) 0) + (setq currword (car co)) + (if (> (length currword) 1) + (if (and (string-equal "\\" (substring currword 0 1)) + (string-match "[a-zA-Z-]+" currword) + (= (match-beginning 0) 1) + (= (match-end 0) (length currword)) + (not (string-equal (downcase currword) currword))) + (add-to-list 'wordlist currword))) + (if (string-equal "-" (car (setq co (cdr co)))) + (while (and (> (length co) 0) + (not (string-equal "-" (car (setq co (cdr co))))))))) + (reverse wordlist))) + "LilyPond \\Identifiers") + +(defconst LilyPond-Capitalized-Reserved-Words + (let ((wordlist '("StaffContext")) + (co (all-completions "" (LilyPond-add-dictionary-word ())))) + (progn + (while (> (length co) 0) + (setq currword (car co)) + (if (> (length currword) 0) + (if (and (string-match "[a-zA-Z_]+" currword) + (= (match-beginning 0) 0) + (= (match-end 0) (length currword)) + (not (string-equal (downcase currword) currword))) + (add-to-list 'wordlist currword))) + (if (string-equal "-" (car (setq co (cdr co)))) + (while (and (> (length co) 0) + (not (string-equal "-" (car (setq co (cdr co))))))))) + (reverse wordlist))) + "LilyPond ReservedWords") + +(defconst LilyPond-non-capitalized-reserved-words + (let ((wordlist '("cessess")) + (co (all-completions "" (LilyPond-add-dictionary-word ())))) + (progn + (while (> (length co) 0) + (setq currword (car co)) + (if (> (length currword) 0) + (if (and (string-match "[a-z]+" currword) + (= (match-beginning 0) 0) + (= (match-end 0) (length currword)) + (string-equal (downcase currword) currword)) + (add-to-list 'wordlist currword))) + (if (string-equal "-" (car (setq co (cdr co)))) + (while (and (> (length co) 0) + (not (string-equal "-" (car (setq co (cdr co))))))))) + (reverse wordlist))) + "LilyPond notenames") + +(defun LilyPond-check-files (derived originals extensions) + "Check that DERIVED is newer than any of the ORIGINALS. +Try each original with each member of EXTENSIONS, in all directories +in LilyPond-include-path." + (let ((found nil) + (regexp (concat "\\`\\(" + (mapconcat (function (lambda (dir) + (regexp-quote (expand-file-name dir)))) + LilyPond-include-path "\\|") + "\\).*\\(" + (mapconcat 'regexp-quote originals "\\|") + "\\)\\.\\(" + (mapconcat 'regexp-quote extensions "\\|") + "\\)\\'")) + (buffers (buffer-list))) + (while buffers + (let* ((buffer (car buffers)) + (name (buffer-file-name buffer))) + (setq buffers (cdr buffers)) + (if (and name (string-match regexp name)) + (progn + (and (buffer-modified-p buffer) + (or (not LilyPond-save-query) + (y-or-n-p (concat "Save file " + (buffer-file-name buffer) + "? "))) + (save-excursion (set-buffer buffer) (save-buffer))) + (if (file-newer-than-file-p name derived) + (setq found t)))))) + found)) + +(defun LilyPond-running () + "Check the currently running LilyPond compiling jobs." + (let ((process-names (list "lilypond" "tex" "2ps" "2midi" + "book" "latex")) + (running nil)) + (while (setq process-name (pop process-names)) + (setq process (get-process process-name)) + (if (and process + (eq (process-status process) 'run)) + (push process-name running))) + running)) ; return the running jobs + +(defun LilyPond-midi-running () + "Check the currently running Midi processes." + (let ((process-names (list "midi" "midiall")) + (running nil)) + (while (setq process-name (pop process-names)) + (setq process (get-process process-name)) + (if (and process + (eq (process-status process) 'run)) + (push process-name running))) + running)) ; return the running jobs + +(defun LilyPond-kill-jobs () + "Kill the currently running LilyPond compiling jobs." + (interactive) + (let ((process-names (LilyPond-running)) + (killed nil)) + (while (setq process-name (pop process-names)) + (quit-process (get-process process-name) t) + (push process-name killed)) + killed)) ; return the killed jobs + +(defun LilyPond-kill-midi () + "Kill the currently running midi processes." + (let ((process-names (LilyPond-midi-running)) + (killed nil)) + (while (setq process-name (pop process-names)) + (quit-process (get-process process-name) t) + (push process-name killed)) + killed)) ; return the killed jobs + +;; URG, should only run LilyPond-compile for LilyPond +;; not for tex,xdvi (lilypond?) +(defun LilyPond-compile-file (command name) + ;; We maybe should know what we run here (Lily, lilypond, tex) + ;; and adjust our error-matching regex ? + (compilation-start + (if (eq LilyPond-command-current 'LilyPond-command-master) + command + ;; use temporary directory for Commands on Buffer/Region + ;; hm.. the directory is set twice, first to default-dir + (concat "cd " (LilyPond-temp-directory) "; " command)))) + +;; do we still need this, now that we're using compilation-start? +(defun LilyPond-save-buffer () + "Save buffer and set default command for compiling." + (interactive) + (if (buffer-modified-p) + (progn (save-buffer) + (setq LilyPond-command-next LilyPond-command-default)))) + +;;; return (dir base ext) +(defun split-file-name (name) + (let* ((i (string-match "[^/]*$" name)) + (dir (if (> i 0) (substring name 0 i) "./")) + (file (substring name i (length name))) + (i (string-match "[^.]*$" file))) + (if (and + (> i 0) + (< i (length file))) + (list dir (substring file 0 (- i 1)) (substring file i (length file))) + (list dir file "")))) + + +;; Should check whether in command-alist? +(defcustom LilyPond-command-default "LilyPond" + "Default command. Must identify a member of LilyPond-command-alist." + + :group 'LilyPond + :type 'string) +;;;(make-variable-buffer-local 'LilyPond-command-last) + +(defvar LilyPond-command-next LilyPond-command-default) + +(defvar LilyPond-command-current 'LilyPond-command-master) +;;;(make-variable-buffer-local 'LilyPond-command-master) + + +;; If non-nil, LilyPond-command-query will return the value of this +;; variable instead of quering the user. +(defvar LilyPond-command-force nil) + +(defcustom LilyPond-lilypond-command "lilypond" + "Command used to compile LY files." + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-ps-command "gv --watch" + "Command used to display PS files." + + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-pdf-command "xpdf" + "Command used to display PDF files." + + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-midi-command "timidity" + "Command used to play MIDI files." + + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-all-midi-command "timidity -ia" + "Command used to play MIDI files." + + :group 'LilyPond + :type 'string) + +(defun LilyPond-command-current-midi () + "Play midi corresponding to the current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "Midi") 'LilyPond-get-master-file)) + +(defun LilyPond-command-all-midi () + "Play midi corresponding to the current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "MidiAll") 'LilyPond-get-master-file)) + +(defun count-matches-as-number (re) + "Count-matches in emacs 22 backwards-incompatibly returns a number" + (let ((result (count-matches re))) + (if (stringp result) + (string-to-number result) + result))) + +(defun count-rexp (start end rexp) + "Print number of found regular expressions in the region." + (interactive "r") + (save-excursion + (save-restriction + (narrow-to-region start end) + (goto-char (point-min)) + (count-matches-as-number rexp)))) + +(defun count-midi-words () + "Check number of midi-scores before the curser." + (if (eq LilyPond-command-current 'LilyPond-command-region) + (count-rexp (mark t) (point) "\\\\midi") + (count-rexp (point-min) (point-max) "\\\\midi"))) + +(defun count-midi-words-backwards () + "Check number of midi-scores before the curser." + (if (eq LilyPond-command-current 'LilyPond-command-region) + (count-rexp (mark t) (point) "\\\\midi") + (count-rexp (point-min) (point) "\\\\midi"))) + +(defun LilyPond-string-current-midi () + "Check the midi file of the following midi-score in the current document." + (let ((fnameprefix (if (eq LilyPond-command-current 'LilyPond-command-master) + (substring (LilyPond-get-master-file) 0 -3); suppose ".ly" + LilyPond-region-file-prefix)) + (allcount (count-midi-words)) + (count (count-midi-words-backwards))) + (concat fnameprefix + (if (and (> allcount 1) (> count 0)) ; not first score + (if (eq count allcount) ; last score + (concat "-" (number-to-string (+ count -1))) + (concat "-" (number-to-string count)))) + ".midi"))) + +(defun LilyPond-string-all-midi () + "Return the midi files of the current document in ascending order." + (let ((fnameprefix (if (eq LilyPond-command-current 'LilyPond-command-master) + (substring (LilyPond-get-master-file) 0 -3); suppose ".ly" + LilyPond-region-file-prefix)) + (allcount (count-midi-words))) + (concat (if (> allcount 0) ; at least one midi-score + (concat fnameprefix ".midi ")) + (if (> allcount 1) ; more than one midi-score + (concat fnameprefix "-[1-9].midi ")) + (if (> allcount 9) ; etc. + (concat fnameprefix "-[1-9][0-9].midi")) + (if (> allcount 99) ; not first score + (concat fnameprefix "-[1-9][0-9][0-9].midi"))))) + +;; This is the major configuration variable. +(defcustom LilyPond-command-alist + ;; Should expand this to include possible keyboard shortcuts which + ;; could then be mapped to define-key and menu. + '( + ("LilyPond" . ((LilyPond-lilypond-command " %s") "%s" "%l" "View")) + ("2PS" . ((LilyPond-lilypond-command " -f ps %s") "%s" "%p" "ViewPS")) + ("Book" . ("lilypond-book %x" "%x" "%l" "LaTeX")) + ("LaTeX" . ("latex '\\nonstopmode\\input %l'" "%l" "%d" "ViewDVI")) + + ;; refreshes when kicked USR1 + ("View" . ((LilyPond-pdf-command " %f"))) + ("ViewPDF" . ((LilyPond-pdf-command " %f"))) + ("ViewPS" . ((LilyPond-ps-command " %p"))) + + ;; The following are refreshed in LilyPond-command: + ;; - current-midi depends on cursor position and + ("Midi" . ("")) ; + ;; - all-midi depends on number of midi-score. + ("MidiAll" . ("")) + ) + + "AList of commands to execute on the current document. + +The key is the name of the command as it will be presented to the +user, the value is a cons of the command string handed to the shell +after being expanded, and the next command to be executed upon +success. The expansion is done using the information found in +LilyPond-expand-list. +" + :group 'LilyPond + :type '(repeat (cons :tag "Command Item" + (string :tag "Key") + (cons :tag "How" + (string :tag "Command") + (string :tag "Next Key"))))) + +;; drop this? +(defcustom LilyPond-file-extension ".ly" + "*File extension used in LilyPond sources." + :group 'LilyPond + :type 'string) + + +(defcustom LilyPond-expand-alist + '( + ("%s" . ".ly") + ("%t" . ".tex") + ("%d" . ".dvi") + ("%f" . ".pdf") + ("%p" . ".ps") + ("%l" . ".tex") + ("%x" . ".tely") + ("%m" . ".midi") + ) + + "Alist of expansion strings for LilyPond command names." + :group 'LilyPond + :type '(repeat (cons :tag "Alist item" + (string :tag "Symbol") + (string :tag "Expansion")))) + + +(defcustom LilyPond-command-Show "View" + "*The default command to show (view or print) a LilyPond file. +Must be the car of an entry in `LilyPond-command-alist'." + :group 'LilyPond + :type 'string) + (make-variable-buffer-local 'LilyPond-command-Show) + +(defcustom LilyPond-command-Print "Print" + "The name of the Print entry in LilyPond-command-Print." + :group 'LilyPond + :type 'string) + +(defun LilyPond-find-required-command (command file) + "Find the first command in the chain that is needed to run + (input file is newer than the output file)" + (let* ((entry (cdr (assoc command LilyPond-command-alist))) + (next-command (nth 3 entry))) + (if (null next-command) + command + (let* ((src-string (nth 1 entry)) + (input (LilyPond-command-expand src-string file)) + (output (LilyPond-command-expand (nth 2 entry) file))) + (if (or (file-newer-than-file-p input output) + (and (equal "%s" src-string) + (not (equal (buffer-name) file)) + (file-newer-than-file-p (buffer-name) + output))) + command + (LilyPond-find-required-command next-command file)))))) + +(defun LilyPond-command-query (name) + "Query the user for what LilyPond command to use." + (cond ((string-equal name LilyPond-region-file-prefix) + (LilyPond-check-files (concat name ".tex") + (list name) + (list LilyPond-file-extension))) + ((verify-visited-file-modtime (current-buffer)) + (and (buffer-modified-p) + (y-or-n-p "Save buffer before next command? ") + (LilyPond-save-buffer))) + ((y-or-n-p "The command will be invoked to an already saved buffer. Revert it? ") + (revert-buffer t t))) + + (let* ((default (LilyPond-find-required-command LilyPond-command-next name)) + (completion-ignore-case t) + (answer (or LilyPond-command-force + (completing-read + (concat "Command: (default " default ") ") + LilyPond-command-alist nil t nil 'LilyPond-command-history)))) + + ;; If the answer is "LilyPond" it will not be expanded to "LilyPond" + (let ((answer (car-safe (assoc answer LilyPond-command-alist)))) + (if (and answer + (not (string-equal answer ""))) + answer + default)))) + +(defun LilyPond-command-master () + "Run command on the current document." + (interactive) + (LilyPond-command-select-master) + (LilyPond-command (LilyPond-command-query (LilyPond-get-master-file)) + 'LilyPond-get-master-file)) + +(defun LilyPond-command-lilypond () + "Run lilypond for the current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "LilyPond") 'LilyPond-get-master-file) +) + +(defun LilyPond-command-formatps () + "Format the ps output of the current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "2PS") 'LilyPond-get-master-file) +) + +(defun LilyPond-command-formatmidi () + "Format the midi output of the current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "2Midi") 'LilyPond-get-master-file)) + +(defun LilyPond-command-view () + "View the output of current document." + (interactive) + (LilyPond-command-viewpdf)) + +(defun LilyPond-command-viewpdf () + "View the ps output of current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "ViewPDF") 'LilyPond-get-master-file)) + +(defun LilyPond-command-viewps () + "View the ps output of current document." + (interactive) + (LilyPond-command (LilyPond-command-menu "ViewPS") 'LilyPond-get-master-file)) + +;; FIXME, this is broken +(defun LilyPond-region-file (begin end) + (let ( + ;; (dir "./") + (dir (LilyPond-temp-directory)) + (base LilyPond-region-file-prefix) + (ext LilyPond-file-extension)) + (concat dir base ext))) + +;;; Commands on Region work if there is an appropriate '\score'. +(defun LilyPond-command-region (begin end) + "Run LilyPond on the current region." + (interactive "r") + (if (or (> begin (point-min)) (< end (point-max))) + (LilyPond-command-select-region)) + (write-region begin end (LilyPond-region-file begin end) nil 'nomsg) + (LilyPond-command (LilyPond-command-query + (LilyPond-region-file begin end)) + '(lambda () (LilyPond-region-file begin end))) + ;; Region may deactivate even if buffer was intact, reactivate? + ;; Currently, also deactived regions are used. + ) + +(defun LilyPond-command-buffer () + "Run LilyPond on buffer." + (interactive) + (LilyPond-command-select-buffer) + (LilyPond-command-region (point-min) (point-max))) + +(defun LilyPond-command-expand (arg file) + (cond + ((listp arg) + (mapconcat (lambda (arg) (LilyPond-command-expand arg file)) + arg + "")) + ((and (symbolp arg) (boundp arg) + ;; Avoid self-quoting symbols + (not (eq (symbol-value arg) arg))) + (LilyPond-command-expand (symbol-value arg) file)) + ((stringp arg) + (let ((case-fold-search nil)) + (if (string-match "%" arg) + (let* ((b (match-beginning 0)) + (e (+ b 2)) + (l (split-file-name file)) + (dir (car l)) + (base (cadr l))) + (concat (substring arg 0 b) + (shell-quote-argument (concat dir base)) + (LilyPond-command-expand + (concat + (let ((entry (assoc (substring arg b e) + LilyPond-expand-alist))) + (if entry (cdr entry) "")) + (substring arg e)) + file))) + arg))) + (t (error "Bad expansion `%S'" arg)))) + +(defun LilyPond-shell-process (name buffer command) + (let ((old (current-buffer))) + (switch-to-buffer-other-window buffer) + ;; If we empty the buffer don't see messages scroll by. + ;; (erase-buffer) + + (start-process-shell-command name buffer command) + (switch-to-buffer-other-window old))) + + +(defun LilyPond-command (name file) + "Run command NAME on the file you get by calling FILE. + +FILE is a function return a file name. It has one optional argument, +the extension to use on the file. + +Use the information in LilyPond-command-alist to determine how to run the +command." + + (let ((entry (assoc name LilyPond-command-alist))) + (if entry + (let ((command (LilyPond-command-expand (cadr entry) + (apply file nil))) + (jobs nil) + (job-string "no jobs")) + (if (member name (list "View" "ViewPS")) + ;; is USR1 a right signal for viewps? + (let ((buffer-xdvi (get-buffer-create (concat "*" name "*")))) + ;; what if XEDITOR is set to gedit or so, should we steal it? + (if (not (getenv "XEDITOR")) + (setenv "XEDITOR" "emacsclient --no-wait +%l:%c %f")) + (if LilyPond-kick-xdvi + (let ((process-xdvi (get-buffer-process buffer-xdvi))) + (if process-xdvi + (signal-process (process-id process-xdvi) 'SIGUSR1) + (LilyPond-shell-process name buffer-xdvi command))) + (LilyPond-shell-process name buffer-xdvi command))) + (progn + (if (string-equal name "Midi") + (progn + (setq command (concat LilyPond-midi-command " " (LilyPond-string-current-midi))) + (if (LilyPond-kill-midi) + (setq job-string nil)))) ; either stop or start playing + (if (string-equal name "MidiAll") + (progn + (setq command (concat LilyPond-all-midi-command " " (LilyPond-string-all-midi))) + (LilyPond-kill-midi))) ; stop and start playing + (if (and (member name (list "Midi" "MidiAll")) job-string) + (if (file-newer-than-file-p + (LilyPond-get-master-file) + (concat (substring (LilyPond-get-master-file) 0 -3) ".midi")) + (if (y-or-n-p "Midi older than source. Reformat midi?") + (progn + (LilyPond-command-formatmidi) + (while (LilyPond-running) + (message "Starts playing midi once it is built.") + (sit-for 0 100)))))) + (if (member name (list "LilyPond" "TeX" "2Midi" "2PS" + "Book" "LaTeX")) + (if (setq jobs (LilyPond-running)) + (progn + (setq job-string "Process") ; could also suggest compiling after process has ended + (while jobs + (setq job-string (concat job-string " \"" (pop jobs) "\""))) + (setq job-string (concat job-string " is already running; kill it to proceed ")) + (if (y-or-n-p job-string) + (progn + (setq job-string "no jobs") + (LilyPond-kill-jobs) + (while (LilyPond-running) + (sit-for 0 100))) + (setq job-string nil))))) + + (setq LilyPond-command-next + (let* ((entry (assoc name LilyPond-command-alist)) + (next-command (nth 3 (cdr entry)))) + (or next-command + LilyPond-command-default))) + + (if (string-equal job-string "no jobs") + (LilyPond-compile-file command name)))))))) + +(defun LilyPond-mark-active () + "Check if there is an active mark." + (and transient-mark-mode + (if (string-match "XEmacs\\|Lucid" emacs-version) (mark) mark-active))) + +(defun LilyPond-temp-directory () + "Temporary file directory for Commands on Region." + (interactive) + (if (string-match "XEmacs\\|Lucid" emacs-version) + (concat (temp-directory) "/") + temporary-file-directory)) + +;;; Keymap + +(defvar LilyPond-mode-map () + "Keymap used in `LilyPond-mode' buffers.") + +;; Note: if you make changes to the map, you must do +;; M-x set-variable LilyPond-mode-map nil +;; M-x eval-buffer +;; M-x LilyPond-mode +;; to let the changest take effect + +(if LilyPond-mode-map + () + (setq LilyPond-mode-map (make-sparse-keymap)) + ;; Put keys to LilyPond-command-alist and fetch them from there somehow. + (define-key LilyPond-mode-map "\C-c\C-l" 'LilyPond-command-lilypond) + (define-key LilyPond-mode-map "\C-c\C-r" 'LilyPond-command-region) + (define-key LilyPond-mode-map "\C-c\C-b" 'LilyPond-command-buffer) + (define-key LilyPond-mode-map "\C-c\C-k" 'LilyPond-kill-jobs) + (define-key LilyPond-mode-map "\C-c\C-c" 'LilyPond-command-master) + (define-key LilyPond-mode-map "\C-cm" 'LilyPond-command-formatmidi) + (define-key LilyPond-mode-map "\C-c\C-f" 'LilyPond-command-formatps) + (define-key LilyPond-mode-map "\C-c\C-s" 'LilyPond-command-view) + (define-key LilyPond-mode-map "\C-c\C-p" 'LilyPond-command-viewps) + (define-key LilyPond-mode-map [(control c) return] 'LilyPond-command-current-midi) + (define-key LilyPond-mode-map [(control c) (control return)] 'LilyPond-command-all-midi) + (define-key LilyPond-mode-map "\C-x\C-s" 'LilyPond-save-buffer) + (define-key LilyPond-mode-map "\C-cb" 'LilyPond-what-beat) + (define-key LilyPond-mode-map "\C-cf" 'font-lock-fontify-buffer) + (define-key LilyPond-mode-map "\C-ci" 'LilyPond-insert-tag-current) + ;; the following will should be overridden by LilyPond Quick Insert Mode + (define-key LilyPond-mode-map "\C-cq" 'LilyPond-quick-insert-mode) + (define-key LilyPond-mode-map "\C-c;" 'LilyPond-comment-region) + (define-key LilyPond-mode-map ")" 'LilyPond-electric-close-paren) + (define-key LilyPond-mode-map ">" 'LilyPond-electric-close-paren) + (define-key LilyPond-mode-map "}" 'LilyPond-electric-close-paren) + (define-key LilyPond-mode-map "]" 'LilyPond-electric-close-paren) + (define-key LilyPond-mode-map "|" 'LilyPond-electric-bar) + (if (string-match "XEmacs\\|Lucid" emacs-version) + (define-key LilyPond-mode-map [iso-left-tab] 'LilyPond-autocompletion) + (define-key LilyPond-mode-map [(shift iso-lefttab)] 'LilyPond-autocompletion)) + (define-key LilyPond-mode-map "\C-c\t" 'LilyPond-info-index-search) + ) + +;;; Menu Support + +;;; This mode was originally LilyPond-quick-note-insert by Heikki Junes. +;;; The original version has been junked since CVS-1.97, +;;; in order to merge the efforts done by Nicolas Sceaux. +;;; LilyPond Quick Insert Mode is a major mode, toggled by C-c q. +(defun LilyPond-quick-insert-mode () + "Insert notes with fewer key strokes by using a simple keyboard piano." + (interactive) + (progn + (message "Invoke (C-c q) from keyboard. If you still see this message,") (sit-for 5 0) + (message "then you have not installed LilyPond Quick Insert Mode (lyqi).") (sit-for 5 0) + (message "Download lyqi from http://nicolas.sceaux.free.fr/lilypond/lyqi.html,") (sit-for 5 0) + (message "see installation instructions from lyqi's README -file.") (sit-for 5 0) + (message "You need also eieio (Enhanced Integration of Emacs Interpreted Objects).") (sit-for 5 0) + (message "Download eieio from http://cedet.sourceforge.net/eieio.shtml,") (sit-for 5 0) + (message "see installation instructions from eieio's INSTALL -file.") (sit-for 5 0) + (message "") + )) + +(defun LilyPond-pre-word-search () + "Fetch the alphabetic characters and \\ in front of the cursor." + (let ((pre "") + (prelen 0) + (ch (char-before (- (point) 0)))) + (while (and ch (or (and (>= ch 65) (<= ch 90)) ; not bolp, A-Z + (and (>= ch 97) (<= ch 122)) ; a-z + (= ch 92))) ; \\ + (setq pre (concat (char-to-string ch) pre)) + (setq prelen (+ prelen 1)) + (setq ch (char-before (- (point) prelen)))) + pre)) + +(defun LilyPond-post-word-search () + "Fetch the alphabetic characters behind the cursor." + (let ((post "") + (postlen 0) + (ch (char-after (+ (point) 0)))) + (while (and ch (or (and (>= ch 65) (<= ch 90)) ; not eolp, A-Z + (and (>= ch 97) (<= ch 122)))) ; a-z + (setq post (concat post (char-to-string ch))) + (setq postlen (+ postlen 1)) + (setq ch (char-after (+ (point) postlen)))) + post)) + +(defun LilyPond-autocompletion () + "Show completions in mini-buffer for the given word." + (interactive) + (let ((pre (LilyPond-pre-word-search)) + (post (LilyPond-post-word-search)) + (compsstr "")) + ;; insert try-completion and show all-completions + (if (> (length pre) 0) + (progn + (setq trycomp (try-completion pre (LilyPond-add-dictionary-word ()))) + (if (char-or-string-p trycomp) + (if (string-equal (concat pre post) trycomp) + (goto-char (+ (point) (length post))) + (progn + (delete-region (point) (+ (point) (length post))) + (insert (substring trycomp (length pre) nil)))) + (progn + (delete-region (point) (+ (point) (length post))) + (font-lock-fontify-buffer))) ; only inserting fontifies + + (setq complist (all-completions pre (LilyPond-add-dictionary-word ()))) + (while (> (length complist) 0) + (setq compsstr (concat compsstr "\"" (car complist) "\" ")) + (setq complist (cdr complist))) + (message compsstr) + (sit-for 0 100))))) + +(defun LilyPond-info () + "Launch Info for lilypond." + (interactive) + (info "lilypond")) + +(defun LilyPond-music-glossary-info () + "Launch Info for music-glossary." + (interactive) + (info "music-glossary")) + +(defun LilyPond-internals-info () + "Launch Info for lilypond-internals." + (interactive) + (info "lilypond-internals")) + +(defun LilyPond-info-index-search () + "In `*info*'-buffer, launch `info lilypond --index-search word-under-cursor'" + (interactive) + (let ((str (concat (LilyPond-pre-word-search) (LilyPond-post-word-search)))) + (if (and (> (length str) 0) + (string-equal (substring str 0 1) "\\")) + (setq str (substring str 1 nil))) + (LilyPond-info) + (Info-index str))) + +(defun LilyPond-insert-tag-current (&optional word) + "Set the current tag to be inserted." + (interactive) + (if word + (setq LilyPond-insert-tag-current word)) + (if (memq LilyPond-insert-tag-current LilyPond-menu-keywords) + (LilyPond-insert-tag) + (message "No tag was selected from LilyPond->Insert tag-menu."))) + +(defun LilyPond-insert-tag () + "Insert syntax for given tag. The definitions are in LilyPond-words-filename." + (interactive) + (setq b (find-file-noselect (LilyPond-words-filename) t t)) + (let ((word LilyPond-insert-tag-current) + (found nil) + (p nil) + (query nil) + (m (set-marker (make-marker) 1 (get-buffer b))) + (distance (if (LilyPond-mark-active) + (abs (- (mark-marker) (point-marker))) 0)) + ) + ;; find the place first + (if (LilyPond-mark-active) + (goto-char (min (mark-marker) (point-marker)))) + (while (and (not found) (> (get-buffer-size b) (marker-position m))) + (setq copy (car (copy-alist (list (eval (symbol-name (read m))))))) + (if (string-equal word copy) (setq found t))) + (if found (insert word)) + (if (> (get-buffer-size b) (marker-position m)) + (setq copy (car (copy-alist (list (eval (symbol-name (read m)))))))) + (if (not (string-equal "-" copy)) + (setq found nil)) + (while (and found (> (get-buffer-size b) (marker-position m))) + ;; find next symbol + (setq copy (car (copy-alist (list (eval (symbol-name (read m))))))) + ;; check whether it is the word, or the word has been found + (cond + ((string-equal "-" copy) (setq found nil)) + ((string-equal "%" copy) (insert " " (read-string "Give Arguments: "))) + ((string-equal "_" copy) + (progn + (setq p (point)) + (goto-char (+ p distance)))) + ((string-equal "\?" copy) (setq query t)) + ((string-equal "\!" copy) (setq query nil)) + ((string-equal "\\n" copy) + (if (not query) + (progn (LilyPond-indent-line) (insert "\n") (LilyPond-indent-line)))) + ((string-equal "{" copy) + (if (not query) + (progn (insert " { ")))) + ((string-equal "}" copy) + (if (not query) + (progn (insert " } ") (setq query nil) ))) + ((not query) + (insert copy)) + (query + (if (y-or-n-p (concat "Proceed with `" copy "'? ")) + (progn (insert copy) (setq query nil)))) + )) + (if p (goto-char p)) + (kill-buffer b)) +) + +(defun LilyPond-command-menu-entry (entry) + ;; Return LilyPond-command-alist ENTRY as a menu item. + (let ((name (car entry))) + (cond ((and (string-equal name LilyPond-command-Print) + LilyPond-printer-list) + (let ((command LilyPond-print-command) + (lookup 1)) + (append (list LilyPond-command-Print) + (mapcar 'LilyPond-command-menu-printer-entry + LilyPond-printer-list)))) + (t + (vector name (list 'LilyPond-command-menu name) t))))) + + +(easy-menu-define LilyPond-command-menu + LilyPond-mode-map + "Menu used in LilyPond mode." + (append '("Command") + '(("Command on" + [ "Master File" LilyPond-command-select-master + :keys "C-c C-c" :style radio + :selected (eq LilyPond-command-current 'LilyPond-command-master) ] + [ "Buffer" LilyPond-command-select-buffer + :keys "C-c C-b" :style radio + :selected (eq LilyPond-command-current 'LilyPond-command-buffer) ] + [ "Region" LilyPond-command-select-region + :keys "C-c C-r" :style radio + :selected (eq LilyPond-command-current 'LilyPond-command-region) ])) +;;; (let ((file 'LilyPond-command-on-current)) +;;; (mapcar 'LilyPond-command-menu-entry LilyPond-command-alist)) +;;; Some kind of mapping which includes :keys might be more elegant +;;; Put keys to LilyPond-command-alist and fetch them from there somehow. + '([ "LilyPond" LilyPond-command-lilypond t]) + '([ "2PS" LilyPond-command-formatps t]) + '([ "2Midi" LilyPond-command-formatmidi t]) + '([ "Book" (LilyPond-command (LilyPond-command-menu "Book") 'LilyPond-get-master-file) ]) + '([ "LaTeX" (LilyPond-command (LilyPond-command-menu "LaTeX") 'LilyPond-get-master-file) ]) + '([ "Kill jobs" LilyPond-kill-jobs t]) + '("-----") + '([ "View" LilyPond-command-view t]) + '([ "ViewPS" LilyPond-command-viewps t]) + '("-----") + '([ "Midi (toggle)" LilyPond-command-current-midi t]) + '([ "Midi all" LilyPond-command-all-midi t]) + )) + +(defun LilyPond-menu-keywords-item (arg) + "Make vector for LilyPond-mode-keywords." + (vector arg (list 'LilyPond-insert-tag-current arg) :style 'radio :selected (list 'eq 'LilyPond-insert-tag-current arg))) + +(defun LilyPond-menu-keywords () + "Make Insert Tag menu. + +The Insert Tag -menu is split into parts if it is long enough." + + (let ((li (mapcar 'LilyPond-menu-keywords-item LilyPond-menu-keywords)) + (w (round (sqrt (length LilyPond-menu-keywords)))) + (split '()) + (imin 0) imax lw rw) + (while (< imin (length LilyPond-menu-keywords)) + (setq imax (- (min (+ imin w) (length LilyPond-menu-keywords)) 1)) + (setq lw (nth imin LilyPond-menu-keywords)) + (setq rw (nth imax LilyPond-menu-keywords)) + (add-to-list 'split + (let ((l (list (concat (substring lw 0 (min 7 (length lw))) + " ... " + (substring rw 0 (min 7 (length rw))))))) + (while (<= imin imax) + (add-to-list 'l (nth imin li)) + (setq imin (1+ imin))) + (reverse l)))) + (if (> (length LilyPond-menu-keywords) 12) (reverse split) li))) + +;;; LilyPond-mode-menu should not be interactive, via "M-x LilyPond-" +(easy-menu-define LilyPond-mode-menu + LilyPond-mode-map + "Menu used in LilyPond mode." + (append '("LilyPond") + '(["Add index menu" LilyPond-add-imenu-menu]) + (list (cons "Insert tag" + (cons ["Previously selected" LilyPond-insert-tag-current t] + (cons "-----" + (LilyPond-menu-keywords))))) + '(("Miscellaneous" + ["Autocompletion" LilyPond-autocompletion t] + ["(Un)comment Region" LilyPond-comment-region t] + ["Refontify buffer" font-lock-fontify-buffer t] + "-----" + ["Quick Insert Mode" LilyPond-quick-insert-mode :keys "C-c q"] + )) + '(("Info" + ["LilyPond" LilyPond-info t] + ["LilyPond index-search" LilyPond-info-index-search t] + ["Music Glossary" LilyPond-music-glossary-info t] + ["LilyPond internals" LilyPond-internals-info t] + )) + )) + +(defconst LilyPond-imenu-generic-re "^\\([a-zA-Z]+\\) *=" + "Regexp matching Identifier definitions.") + +(defvar LilyPond-imenu-generic-expression + (list (list nil LilyPond-imenu-generic-re 1)) + "Expression for imenu") + +(defun LilyPond-command-select-master () + (interactive) + (message "Next command will be on the master file") + (setq LilyPond-command-current 'LilyPond-command-master)) + +(defun LilyPond-command-select-buffer () + (interactive) + (message "Next command will be on the buffer") + (setq LilyPond-command-current 'LilyPond-command-buffer)) + +(defun LilyPond-command-select-region () + (interactive) + (message "Next command will be on the region") + (setq LilyPond-command-current 'LilyPond-command-region)) + +(defun LilyPond-command-menu (name) + ;; Execute LilyPond-command-alist NAME from a menu. + (let ((LilyPond-command-force name)) + (if (eq LilyPond-command-current 'LilyPond-command-region) + (if (eq (mark t) nil) + (progn (message "The mark is not set now") (sit-for 0 500)) + (progn (if (not (not (LilyPond-mark-active))) + (progn (message "Region is not active, using region between inactive mark and current point.") (sit-for 0 500))) + (LilyPond-command-region (mark t) (point)))) + (funcall LilyPond-command-current)))) + +(defun LilyPond-add-imenu-menu () + (interactive) + "Add an imenu menu to the menubar." + (if (not LilyPond-imenu) + (progn + (imenu-add-to-menubar "Index") + (redraw-frame (selected-frame)) + (setq LilyPond-imenu t)) + (message "%s" "LilyPond-imenu already exists."))) +(put 'LilyPond-add-imenu-menu 'menu-enable '(not LilyPond-imenu)) + +(defun LilyPond-mode () + "Major mode for editing LilyPond music files. + +This mode knows about LilyPond keywords and line comments, not about +indentation or block comments. It features easy compilation, error +finding and viewing of a LilyPond source buffer or region. + +COMMANDS +\\{LilyPond-mode-map} +VARIABLES + +LilyPond-command-alist\t\talist from name to command" + (interactive) + ;; set up local variables + (kill-all-local-variables) + + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults '(LilyPond-font-lock-keywords)) + + ;; string and comments are fontified explicitly + (make-local-variable 'font-lock-keywords-only) + (setq font-lock-keywords-only t) + + ;; Multi-line font-locking needs Emacs 21.1 or newer. + ;; For older versions there is hotkey "C-c f". + (make-local-variable 'font-lock-multiline) + (setq font-lock-multiline t) + + (make-local-variable 'paragraph-separate) + (setq paragraph-separate "^[ \t]*$") + + (make-local-variable 'paragraph-start) + (setq paragraph-start "^[ \t]*$") + + (make-local-variable 'comment-start) + (setq comment-start "%") + + (make-local-variable 'comment-start-skip) + (setq comment-start-skip "%{? *") + + (make-local-variable 'comment-end) + (setq comment-end "") + + (make-local-variable 'block-comment-start) + (setq block-comment-start "%{") + + (make-local-variable 'block-comment-end) + (setq block-comment-end "%}") + + (make-local-variable 'indent-line-function) + (setq indent-line-function 'LilyPond-indent-line) + + (LilyPond-mode-set-syntax-table '(?\< ?\> ?\{ ?\})) + (setq major-mode 'LilyPond-mode) + (setq mode-name "LilyPond") + (setq local-abbrev-table LilyPond-mode-abbrev-table) + (use-local-map LilyPond-mode-map) + + ;; In XEmacs imenu was synched up with: FSF 20.4 + (make-local-variable 'imenu-generic-expression) + (setq imenu-generic-expression LilyPond-imenu-generic-expression) + ;; (imenu-add-to-menubar "Index") ; see LilyPond-add-imenu-menu + + ;; In XEmacs one needs to use 'easy-menu-add'. + (if (string-match "XEmacs\\|Lucid" emacs-version) + (progn + (easy-menu-add LilyPond-mode-menu) + (easy-menu-add LilyPond-command-menu))) + + ;; Use Command on Region even for inactive mark (region). + (if (string-match "XEmacs\\|Lucid" emacs-version) + (progn + (setq zmacs-regions nil) + (make-local-hook 'post-command-hook)) ; XEmacs requires + (setq mark-even-if-inactive t)) + + ;; Context dependent syntax tables in LilyPond-mode + (add-hook 'post-command-hook 'LilyPond-mode-context-set-syntax-table nil t) + + ;; Turn on paren-mode buffer-locally, i.e., in LilyPond-mode + (if (string-match "XEmacs\\|Lucid" emacs-version) + (progn + (make-local-variable 'paren-mode) + (paren-set-mode 'paren) + (make-local-variable 'blink-matching-paren) + (setq blink-matching-paren t) + ) + (progn + (make-local-variable 'blink-matching-paren-on-screen) + (setq blink-matching-paren-on-screen t) + )) + + ;; run the mode hook. LilyPond-mode-hook use is deprecated + (run-hooks 'LilyPond-mode-hook)) + +(defun LilyPond-version () + "Echo the current version of `LilyPond-mode' in the minibuffer." + (interactive) + (message "Using `LilyPond-mode' version %s" LilyPond-version)) + +(load-library "lilypond-font-lock") +(load-library "lilypond-indent") +(load-library "lilypond-what-beat") + +(defun LilyPond-guile () + (interactive) + (require 'ilisp) + (guile "lilyguile" (LilyPond-command-expand (cadr (assoc "LilyPond" LilyPond-command-alist)) + (funcall 'LilyPond-get-master-file))) + (comint-default-send (ilisp-process) "(define-module (*anonymous-ly-0*))") + (comint-default-send (ilisp-process) "(set! %load-path (cons \"/usr/share/ilisp/\" %load-path))") + (comint-default-send (ilisp-process) "(use-modules (guile-user) (guile-ilisp))") + (comint-default-send (ilisp-process) "(newline)")) + +(provide 'lilypond-mode) +;;; lilypond-mode.el ends here + diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-song.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-song.el new file mode 100644 index 0000000..a86a6a5 --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-song.el @@ -0,0 +1,556 @@ +;;;; lilypond-song.el --- Emacs support for LilyPond singing +;;;; +;;;; This file is part of LilyPond, the GNU music typesetter. +;;;; +;;;; Copyright (C) 2006 Brailcom, o.p.s. +;;;; Author: Milan Zamazal +;;;; +;;;; LilyPond 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. +;;;; +;;;; LilyPond 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 LilyPond. If not, see . + +;;; Commentary: + +;; This file adds Emacs support for singing lyrics of LilyPond files. +;; It extends lilypond-mode with the following commands (see their +;; documentation for more information): +;; +;; - M-x LilyPond-command-sing (C-c C-a) +;; - M-x LilyPond-command-sing-and-play (C-c C-q) +;; - M-x LilyPond-command-sing-last (C-c C-z) +;; +;; Note these commands are not available from the standard LilyPond mode +;; command menus. + +;;; Code: + + +(require 'cl) +(require 'lilypond-mode) + +(ignore-errors (require 'ecasound)) + + +;;; User options + + +(defcustom LilyPond-synthesize-command "lilysong" + "Command used to sing LilyPond files." + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-play-command (or (executable-find "ecaplay") "play") + "Command used to play WAV files." + :group 'LilyPond + :type 'string) + +;; In case you would like to use fluidsynth (not recommended as fluidsynth +;; can perform wave file synthesis only in real time), you can use the +;; following setting: +;; (setq LilyPond-midi->wav-command "fluidsynth -nil -a file soundfont.sf2 '%s' && sox -t raw -s -r 44100 -w -c 2 fluidsynth.raw '%t'") +(defcustom LilyPond-midi->wav-command "timidity -Ow %m -s %r -o '%t' '%s'" + "Command used to make a WAV file from a MIDI file. +%s in the string is replaced with the source MIDI file name, +%t is replaced with the target WAV file name. +%r is replaced with rate. +%m is replaced with lilymidi call." + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-voice-rates + '((".*czech.*" . 44100) + (".*\\\\|nnish\\).*" . 22050) + (".*" . 16000)) + "Alist of regexps matching voices and the corresponding voice rates. +It may be necessary to define proper voice rates here in order to +avoid ecasound resampling problems." + :group 'LilyPond + :type '(alist :key-type regexp :value-type integer)) + +(defcustom LilyPond-use-ecasound (and (featurep 'ecasound) + (executable-find "ecasound") + t) + "If non-nil, use ecasound for mixing and playing songs." + :group 'LilyPond + :type 'boolean) + +(defcustom LilyPond-voice-track-regexp "voice" + "Perl regexp matching names of MIDI tracks to be ignored on sing&play." + :group 'LilyPond + :type 'string) + +(defcustom LilyPond-lilymidi-command "\"`lilymidi --prefix-tracks -Q --filter-tracks '%s' '%f'`\"" + "Command to insert into LilyPond-midi->wav-command calls. +%f is replaced with the corresponding MIDI file name. +%s is replaced with `LilyPond-voice-track-regexp'." + :group 'LilyPond + :type 'string) + + +;;; Lyrics language handling + + +(defvar lilysong-language nil) +(make-variable-buffer-local 'lilysong-language) + +(defvar lilysong-last-language nil) +(make-variable-buffer-local 'lilysong-last-language) + +(defvar lilysong-languages '("cs" "en")) + +(defvar lilysong-voices nil) + +(defun lilysong-voices () + (or lilysong-voices + (with-temp-buffer + (call-process "lilysong" nil t nil "--list-voices") + (call-process "lilysong" nil t nil "--list-languages") + (goto-char (point-min)) + (while (not (eobp)) + (push (buffer-substring-no-properties + (line-beginning-position) (line-end-position)) + lilysong-voices) + (forward-line)) + lilysong-voices))) + +(defun lilysong-change-language () + "Change synthesis language or voice of the current document." + (interactive) + (setq lilysong-language + (completing-read "Lyrics language or voice: " + (mapcar 'list (lilysong-voices))))) + +(defun lilysong-update-language () + (unless lilysong-language + (lilysong-change-language))) + + +;;; Looking for \festival* and \midi commands + + +(defun lilysong-document-files () + (let ((resulting-files ()) + (stack (list (LilyPond-get-master-file)))) + (while (not (null stack)) + (let ((file (expand-file-name (pop stack)))) + (when (and (file-exists-p file) + (not (member file resulting-files))) + (push file resulting-files) + (save-excursion + (save-restriction + (set-buffer (find-file-noselect file nil)) + (widen) + (goto-char (point-min)) + (while (re-search-forward "^[^%\n]*\\\\include +\"\\([^\"]+\\)\"" nil t) + (push (match-string 1) stack))))))) + (nreverse resulting-files))) + +(defvar lilysong-festival-command-regexp + "^[^%\n]*\\\\festival\\(syl\\)? +#\"\\([^\"]+\\)\"") + +(defun lilysong-find-song (direction) + "Find XML file name of the nearest Festival command in the given DIRECTION. +DIRECTION is one of the symbols `forward' or `backward'. +If no Festival command is found in the current buffer, return nil. +The point is left at the position where the command occurrence was found." + (save-match-data + (when (funcall (if (eq direction 'backward) + 're-search-backward + 're-search-forward) + lilysong-festival-command-regexp nil t) + (match-string-no-properties 2)))) + +(defun lilysong-current-song () + "Return the XML file name corresponding to the song around current point. +If there is none, return nil." + (save-excursion + (or (progn (end-of-line) (lilysong-find-song 'backward)) + (progn (beginning-of-line) (lilysong-find-song 'forward))))) + +(defun lilysong-all-songs (&optional limit-to-region) + "Return list of XML file names of the song commands in the current buffer. +If there are none, return an empty list. +If LIMIT-TO-REGION is non-nil, look for the commands in the current region +only." + (let ((result '()) + (current nil)) + (save-excursion + (save-restriction + (when limit-to-region + (narrow-to-region (or (mark) (point)) (point))) + (goto-char (point-min)) + (while (setq current (lilysong-find-song 'forward)) + (push current result)))) + (nreverse result))) + +(defun lilysong-walk-files (collector) + (save-excursion + (mapcar (lambda (f) + (set-buffer (find-file-noselect f)) + (funcall collector)) + (lilysong-document-files)))) + +(defun lilysong-all-songs* () + "Return list of XML file names of the song commands in the current document." + (remove-duplicates (apply #'append (lilysong-walk-files #'lilysong-all-songs)) + :test #'equal)) + +(defvar lilysong-song-history nil) +(make-variable-buffer-local 'lilysong-song-history) + +(defvar lilysong-last-song-list nil) +(make-variable-buffer-local 'lilysong-last-song-list) + +(defvar lilysong-last-command-args nil) +(make-variable-buffer-local 'lilysong-last-command-args) + +(defun lilysong-song-list (multi) + (cond + ((eq multi 'all) + (lilysong-all-songs*)) + (multi + (lilysong-select-songs)) + (t + (lilysong-select-single-song)))) + +(defun lilysong-select-single-song () + (let ((song (lilysong-current-song))) + (if song + (list song) + (error "No song found")))) + +(defun lilysong-select-songs () + (let* ((all-songs (lilysong-all-songs*)) + (available-songs all-songs) + (initial-songs (if (or (not lilysong-last-song-list) + (eq LilyPond-command-current + 'LilyPond-command-region)) + (lilysong-all-songs t) + lilysong-last-song-list)) + (last-input (completing-read + (format "Sing file%s: " + (if initial-songs + (format " (default `%s')" + (mapconcat 'identity initial-songs + ", ")) + "")) + (mapcar 'list all-songs) + nil t nil + 'lilysong-song-history))) + (if (equal last-input "") + initial-songs + (let ((song-list '()) + default-input) + (while (not (equal last-input "")) + (push last-input song-list) + (setq default-input (second (member last-input available-songs))) + (setq available-songs (remove last-input available-songs)) + (setq last-input (completing-read "Sing file: " + (mapcar #'list available-songs) + nil t default-input + 'lilysong-song-history))) + (setq lilysong-last-song-list (nreverse song-list)))))) + +(defun lilysong-count-midi-words () + (count-rexp (point-min) (point-max) "^[^%]*\\\\midi")) + +(defun lilysong-midi-list (multi) + (if multi + (let ((basename (file-name-sans-extension (buffer-file-name))) + (count (apply #'+ (save-match-data + (lilysong-walk-files #'lilysong-count-midi-words)))) + (midi-files '())) + (while (> count 0) + (setq count (1- count)) + (if (= count 0) + (push (concat basename ".midi") midi-files) + (push (format "%s-%d.midi" basename count) midi-files))) + midi-files) + (list (LilyPond-string-current-midi)))) + + +;;; Compilation + + +(defun lilysong-file->wav (filename &optional extension) + (format "%s.%s" (save-match-data + (if (string-match "\\.midi$" filename) + filename + (file-name-sans-extension filename))) + (or extension "wav"))) + +(defun lilysong-file->ewf (filename) + (lilysong-file->wav filename "ewf")) + +(defstruct lilysong-compilation-data + command + makefile + buffer + songs + midi + in-parallel) +(defvar lilysong-compilation-data nil) +(defun lilysong-sing (songs &optional midi-files in-parallel) + (setq lilysong-last-command-args (list songs midi-files in-parallel)) + (lilysong-update-language) + (add-to-list 'compilation-finish-functions 'lilysong-after-compilation) + (setq songs (mapcar #'expand-file-name songs)) + (let* ((makefile (lilysong-makefile (current-buffer) songs midi-files)) + (command (format "make -f %s" makefile))) + (setq lilysong-compilation-data + (make-lilysong-compilation-data + :command command + :makefile makefile + :buffer (current-buffer) + :songs songs + :midi midi-files + :in-parallel in-parallel)) + (save-some-buffers (not compilation-ask-about-save)) + (unless (equal lilysong-language lilysong-last-language) + (mapc #'(lambda (f) (when (file-exists-p f) (delete-file f))) + (append songs (mapcar 'lilysong-file->wav midi-files)))) + (if (lilysong-up-to-date-p makefile) + (lilysong-process-generated-files lilysong-compilation-data) + (compile command)))) + +(defun lilysong-up-to-date-p (makefile) + (equal (call-process "make" nil nil nil "-f" makefile "-q") 0)) + +(defun lilysong-makefile (buffer songs midi-files) + (let ((temp-file (make-temp-file "Makefile.lilysong-el")) + (language lilysong-language)) + (with-temp-file temp-file + (let ((source-files (save-excursion + (set-buffer buffer) + (lilysong-document-files))) + (master-file (save-excursion + (set-buffer buffer) + (LilyPond-get-master-file))) + (lilyfiles (append songs midi-files))) + (insert "all:") + (dolist (f (mapcar 'lilysong-file->wav (append songs midi-files))) + (insert " " f)) + (insert "\n") + (when lilyfiles + (dolist (f songs) + (insert f " ")) + (when midi-files + (dolist (f midi-files) + (insert f " "))) + (insert ": " master-file "\n") + (insert "\t" LilyPond-lilypond-command " " master-file "\n") + (dolist (f songs) + (insert (lilysong-file->wav f) ": " f "\n") + (insert "\t" LilyPond-synthesize-command " $< " (or language "") "\n")) + ;; We can't use midi files in ecasound directly, because setpos + ;; doesn't work on them. + (let ((lilymidi LilyPond-lilymidi-command) + (voice-rate (format "%d" (or (cdr (assoc-if (lambda (key) (string-match key language)) + LilyPond-voice-rates)) + 16000)))) + (when (string-match "%s" lilymidi) + (setq lilymidi (replace-match LilyPond-voice-track-regexp nil nil lilymidi))) + (dolist (f midi-files) + (insert (lilysong-file->wav f) ": " f "\n") + (let ((command LilyPond-midi->wav-command) + (lilymidi* lilymidi)) + (when (string-match "%s" command) + (setq command (replace-match f nil nil command))) + (when (string-match "%t" command) + (setq command (replace-match (lilysong-file->wav f) nil nil command))) + (when (string-match "%r" command) + (setq command (replace-match voice-rate nil nil command))) + (when (string-match "%f" lilymidi*) + (setq lilymidi (replace-match f nil nil lilymidi*))) + (when (string-match "%m" command) + (setq command (replace-match lilymidi nil nil command))) + (insert "\t" command "\n"))) + )))) + temp-file)) + +(defun lilysong-after-compilation (buffer message) + (let ((data lilysong-compilation-data)) + (when (and data + (equal compile-command + (lilysong-compilation-data-command data))) + (unwind-protect + (when (lilysong-up-to-date-p (lilysong-compilation-data-makefile data)) + (lilysong-process-generated-files data)) + (delete-file (lilysong-compilation-data-makefile data)))))) + +(defun lilysong-process-generated-files (data) + (with-current-buffer (lilysong-compilation-data-buffer data) + (setq lilysong-last-language lilysong-language)) + (lilysong-play-files (lilysong-compilation-data-in-parallel data) + (lilysong-compilation-data-songs data) + (lilysong-compilation-data-midi data))) + + +;;; Playing files + + +(defun lilysong-play-files (in-parallel songs midi-files) + (funcall (if LilyPond-use-ecasound + 'lilysong-play-with-ecasound + 'lilysong-play-with-play) + in-parallel songs midi-files)) + +(defun lilysong-call-play (files) + (apply 'start-process "lilysong-el" nil LilyPond-play-command files)) + +(defun lilysong-play-with-play (in-parallel songs midi-files) + (let ((files (mapcar 'lilysong-file->wav (append songs midi-files)))) + (if in-parallel + (dolist (f files) + (lilysong-call-play (list f))) + (lilysong-call-play files)))) + +(defun lilysong-make-ewf-files (files) + (let ((offset 0.0)) + (dolist (f files) + (let* ((wav-file (lilysong-file->wav f)) + (length (with-temp-buffer + (call-process "ecalength" nil t nil "-s" wav-file) + (goto-char (point-max)) + (forward-line -1) + (read (current-buffer))))) + (with-temp-file (lilysong-file->ewf f) + (insert "source = " wav-file "\n") + (insert (format "offset = %s\n" offset)) + (insert "start-position = 0.0\n") + (insert (format "length = %s\n" length)) + (insert "looping = false\n")) + (setq offset (+ offset length)))))) + +(when (and (featurep 'ecasound) + (not (fboundp 'eci-cs-set-param))) + (defeci cs-set-param ((parameter "sChainsetup option: " "%s")))) + +(defun lilysong-play-with-ecasound (in-parallel songs midi-files) + (ecasound) + (eci-cs-add "lilysong-el") + (eci-cs-select "lilysong-el") + (eci-cs-remove) + (eci-cs-add "lilysong-el") + (eci-cs-select "lilysong-el") + (eci-cs-set-param "-z:mixmode,sum") + (unless in-parallel + (lilysong-make-ewf-files songs) + ;; MIDI files should actually start with each of the songs + (mapc 'lilysong-make-ewf-files (mapcar 'list midi-files))) + (let* ((file->wav (if in-parallel 'lilysong-file->wav 'lilysong-file->ewf)) + (files (mapcar file->wav (append songs midi-files)))) + (dolist (f files) + (eci-c-add f) + (eci-c-select f) + (eci-ai-add f)) + (eci-c-select-all) + (eci-ao-add-default) + (let* ((n (length songs)) + (right (if (<= n 1) 50 0)) + (step (if (<= n 1) 0 (/ 100.0 (1- n))))) + (dolist (f songs) + (let ((chain (funcall file->wav f))) + (eci-c-select chain) + (eci-cop-add "-erc:1,2") + (eci-cop-add (format "-epp:%f" (min right 100))) + (incf right step)))) + (eci-start))) + + +;;; User commands + + +(defun lilysong-arg->multi (arg) + (cond + ((not arg) + nil) + ((or + (numberp arg) + (equal arg '(4))) + t) + (t + 'all))) + +(defun lilysong-command (arg play-midi?) + (let* ((multi (lilysong-arg->multi arg)) + (song-list (lilysong-song-list multi)) + (midi-list (if play-midi? (lilysong-midi-list multi)))) + (message "Singing %s" (mapconcat 'identity song-list ", ")) + (lilysong-sing song-list midi-list (if play-midi? t (listp arg))))) + +(defun LilyPond-command-sing (&optional arg) + "Sing lyrics of the current LilyPond buffer. +Without any prefix argument, sing current \\festival* command. +With the universal prefix argument, ask which parts to sing. +With a double universal prefix argument, sing all the parts. +With a numeric prefix argument, ask which parts to sing and sing them +sequentially rather than in parallel." + (interactive "P") + (lilysong-command arg nil)) + +(defun LilyPond-command-sing-and-play (&optional arg) + "Sing lyrics and play midi of the current LilyPond buffer. +Without any prefix argument, sing and play current \\festival* and \\midi +commands. +With the universal prefix argument, ask which parts to sing and play. +With a double universal prefix argument, sing and play all the parts." + (interactive "P") + (lilysong-command arg t)) + +(defun LilyPond-command-sing-last () + "Repeat last LilyPond singing command." + (interactive) + (if lilysong-last-command-args + (apply 'lilysong-sing lilysong-last-command-args) + (error "No previous singing command"))) + +(defun LilyPond-command-clean () + "Remove generated *.xml and *.wav files used for singing." + (interactive) + (flet ((delete-file* (file) + (when (file-exists-p file) + (delete-file file)))) + (dolist (xml-file (lilysong-song-list 'all)) + (delete-file* xml-file) + (delete-file* (lilysong-file->wav xml-file))) + (mapc 'delete-file* (mapcar 'lilysong-file->wav (lilysong-midi-list 'all))))) + +(define-key LilyPond-mode-map "\C-c\C-a" 'LilyPond-command-sing) +(define-key LilyPond-mode-map "\C-c\C-q" 'LilyPond-command-sing-and-play) +(define-key LilyPond-mode-map "\C-c\C-x" 'LilyPond-command-clean) +(define-key LilyPond-mode-map "\C-c\C-z" 'LilyPond-command-sing-last) + +(easy-menu-add-item LilyPond-command-menu nil + ["Sing Current" LilyPond-command-sing t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing Selected" (LilyPond-command-sing '(4)) t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing All" (LilyPond-command-sing '(16)) t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing Selected Sequentially" (LilyPond-command-sing 1) t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing and Play Current" LilyPond-command-sing-and-play t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing and Play Selected" (LilyPond-command-sing-and-play '(4)) t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing and Play All" (LilyPond-command-sing-and-play '(16)) t]) +(easy-menu-add-item LilyPond-command-menu nil + ["Sing Last" LilyPond-command-sing-last t]) + + +;;; Announce + +(provide 'lilypond-song) + + +;;; lilypond-song.el ends here diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-what-beat.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-what-beat.el new file mode 100644 index 0000000..e42f171 --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-what-beat.el @@ -0,0 +1,260 @@ +; Features: +; +; -> Counts number of notes between last | and point. Adds durations of +; each note up, and returns result. +; +; -> Works well on notes and chords. +; +; -> Ignores most keywords, like \override +; +; -> Is aware of certain keywords which often contain parameters that +; look like notes, but should not be counted. +; | a \key b \minor c % b is not counted, but a and c are. +; +; -> Ignores Scheme expressions, which start with # +; +; -> Doesn't ignore the \times keyword. Intelligently handles triplets. +; +; +; Caveats: +; +; -> Doesn't work on regions that aren't preceded by a |. This is because such +; notes are only delimited by a {, and what-beat can't distinguish a { that +; opens a set of notes from an internal { (say from a triplet) +; +; -> Doesn't work with << >> expressions or nested {} expressions (unless +; {} is part of a keyword like \times) +; +; -> Keywords abutted against a note are not visible to what-beat, and +; can therefore surreptitiosly sneak fake notes into what-beat. +; | c\glissando f <- BAD: the f gets counted, but shouldn't +; | c \glissando f <- GOOD: the f gets ignored +; +; -> Does not look outside notes context. Derivation rules don't work: +; str = \notes { a8 b c d } +; \score { \notes { | e4 %{ gets counted }% \str %{gets ignored}% +; +; -> Does not handle repeats. +; +; -> Ignores \bar commands (and does not get confused by a | inside a \bar) +; + +; Recognizes pitch & octave +(setq pitch-regex "\\([a-z]+[,']*\\|<[^>]*>\\)\\(=[,']*\\)?") +; Recognizes duration +(setq duration-regex "[ \t\n]*\\(\\(\\(128\\|6?4\\|3?2\\|16?\\|8\\)\\([.]*\\)\\)\\([ \t]*[*][ \t]*\\([0-9]+\\)\\(/\\([1-9][0-9]*\\)\\)?\\)?\\)") + +; These keywords precede notes that should not be counted during beats +(setq Parm-Keywords '("key" "clef" "appoggiatura" "acciaccatura" "grace" + "override" "revert" "glissando")) + + +(defun extract-match (string match-num) + (if (null (match-beginning match-num)) + nil + (substring string (match-beginning match-num) (match-end match-num)))) + + +(defun add-fractions (f1 f2) + "Adds two fractions, both are (numerator denominator)" + (setq result (list (+ (* (car f1) (cadr f2)) (* (car f2) (cadr f1))) + (* (cadr f1) (cadr f2)))) + (setq result (reduce-fraction result 2)) + (setq result (reduce-fraction result 3)) + (setq result (reduce-fraction result 5)) + (setq result (reduce-fraction result 7)) +) + + +(defun reduce-fraction (f divisor) + "Eliminates divisor from fraction if present" + (while (and (= 0 (% (car result) divisor)) + (= 0 (% (cadr result) divisor)) + (< 1 (cadr result)) + (< 0 (car result))) + (setq result (list (/ (car result) divisor) (/ (cadr result) divisor)))) + result +) + + +(defun parse-duration (duration) + "Returns a duration string parsed as '(numerator denominator)" + (string-match duration-regex duration) + (let ((result (list 1 (string-to-number (extract-match duration 2)))) + (dots (extract-match duration 4)) + (numerator (or (extract-match duration 6) "1")) + (denominator (or (extract-match duration 8) "1"))) + (if (and (not (null dots)) (< 0 (string-width dots))) + (dotimes (dummy (string-width dots)) + (setq result (list (1+ (* 2 (car result))) (* 2 (cadr result)))))) + (list (* (string-to-number numerator) (car result)) + (* (string-to-number denominator) (cadr result))) +)) + +(defun walk-note-duration () + "Returns duration of next note, moving point past note. +If point is not before a note, returns nil +If next note has no duration, returns t" + (let ((have-pitch (looking-at pitch-regex))) + (if have-pitch (goto-char (match-end 0))) + (if (not (looking-at duration-regex)) + have-pitch + (goto-char (match-end 0)) + (parse-duration (match-string 0))))) + +; returns nil if not at a comment +(defun skip-comment () + (if (not (char-equal ?\% (following-char))) + nil + (progn + (forward-char) + (if (char-equal ?\{ (following-char)) + (re-search-forward "}%" nil t) + (progn + (skip-chars-forward "^\n") + (forward-char))) + t +))) + +; returns nil if not at a quotation +(defun skip-quotation () + (if (not (char-equal ?\" (following-char))) + nil + (progn + (forward-char) + (skip-chars-forward "^\"") + (forward-char) + t +))) + +; returns nil if not at a sexp +(defun skip-sexp () + (interactive) + (if (not (char-equal ?\# (following-char))) + nil + (progn + (forward-char) + (if (char-equal ?\' (following-char)) + (forward-char)) + (if (not (char-equal ?\( (following-char))) + (skip-chars-forward "^ \t\n") + (progn + (let ((paren 1)) + (while (< 0 paren) + (forward-char) + (cond ((char-equal ?\( (following-char)) + (setq paren (1+ paren))) + ((char-equal ?\) (following-char)) + (setq paren (1- paren))))) + (forward-char) + t +)))))) + +(defun goto-note-begin () + (interactive) + ; skip anything that is not ws. And skip any comments or quotations + (while (or (< 0 (skip-chars-forward "^ \t\n~%#\"")) + (skip-comment) + (skip-quotation) + (skip-sexp))) + ; Now skip anything that isn't alphanum or \. And skip comments or quotations + (while (or (< 0 (skip-chars-forward "^A-Za-z1-9<%}#=\"")) + (skip-comment) + (skip-quotation) + (skip-sexp))) + ; (skip-chars-forward "^\\") Why doesn't this work?!! + (if (char-equal ?\\ (preceding-char)) + (backward-char)) +) + + +(defun skip-good-keywords () + (if (looking-at "\\\\\\([a-z]*\\)") + (progn + (goto-char (match-end 0)) + (if (member (match-string 1) Parm-Keywords) + (progn + (if (looking-at "[ \t\n]*?\\([a-z0-9_]+\\|{[^}]*}\\|\"[^\"]*\"\\)") + (goto-char (match-end 0)) + (error "Improper regex match:") + (error "Unknown text: %s") +)))))) + +(defun find-measure-start () + (let ((start (re-search-backward "\|" 0 t))) + (if (null start) + -1 + (if (looking-at "[^ \n\t]*\"") + (find-measure-start) + (point) +)))) + +(defun get-beat () + (save-excursion + (save-restriction + (let* ((end (point)) + (measure-start (find-measure-start)) + (last-dur (or (re-search-backward duration-regex 0 t) -1)) + (duration (if (= -1 last-dur) 0 (parse-duration (match-string 0)))) + (result '(0 1))) ; 0 in fraction form + (if (= measure-start -1) + (message "No | before point") + (goto-char (1+ measure-start)) + (goto-note-begin) + (while (< (point) end) + (let ((new-duration (walk-note-duration))) + (if (null new-duration) + (if (not (looking-at + (concat "\\\\t\\(?:\\(imes\\)\\|uplet\\)[ \t]*\\([0-9]+\\)/\\([0-9]+\\)\\(?:[ \t\n]" + duration-regex "\\)?[ \t\n]*{"))) + (skip-good-keywords) + + ; handle \times/\tuplet specially + (let* ((times-p (match-beginning 1)) + (numerator (string-to-number (match-string (if times-p 2 3)))) + (denominator (string-to-number (match-string (if times-p 3 2))))) + (goto-char (match-end 0)) + (goto-note-begin) + (while (and (not (looking-at "}")) + (< (point) end)) + (setq new-duration (walk-note-duration)) + (if (null new-duration) + (if (looking-at "\\\\[a-z]*[ \t]*[a-z]*") + (goto-char (match-end 0)) + (error "Unknown text: %S %s" result(buffer-substring (point) end)))) + (if (not (eq new-duration t)) + (setq duration new-duration)) + (setq result (add-fractions result + (list (* numerator (car duration)) + (* denominator (cadr duration))))) + (goto-note-begin)) + (if (< (point) end) + (forward-char 1)))) ; skip } + + (if (not (eq new-duration t)) + (setq duration new-duration)) + (setq result (add-fractions result duration))) + (goto-note-begin))) + + result))))) + +(defun LilyPond-what-beat () + "Returns how much of a measure lies between last measaure '|' and point. +Recognizes chords, and triples." + (interactive) + (let ((beat (get-beat))) + (message "Beat: %d/%d" (car beat) (cadr beat))) +) + +(defun LilyPond-electric-bar () + "Indicate the number of beats in last measure when a | is inserted" + (interactive) + (self-insert-command 1) + (save-excursion + (save-restriction + (backward-char) + (LilyPond-what-beat) + (forward-char) +))) + + diff --git a/.emacs.d/site-elisp/lilypond-mode/lilypond-words.el b/.emacs.d/site-elisp/lilypond-mode/lilypond-words.el new file mode 100644 index 0000000..a01efac --- /dev/null +++ b/.emacs.d/site-elisp/lilypond-mode/lilypond-words.el @@ -0,0 +1,1308 @@ +\\xNotesOn +\\xNotesOff +\\xNote +\\wordwrap-string-internal +\\wordwrap-string +\\wordwrap-lines +\\wordwrap-internal +\\wordwrap-field +\\wordwrap +\\withMusicProperty +\\with-url +\\with-outline +\\with-link +\\with-dimensions-from +\\with-dimensions +\\with-color +\\with +\\whiteout +\\whiteTriangleMarkup +\\walkerHeadsMinor +\\walkerHeads +\\vspace +\\void +\\voices +\\voiceTwoStyle +\\voiceTwo +\\voiceThreeStyle +\\voiceThree +\\voiceOneStyle +\\voiceOne +\\voiceNeutralStyle +\\voiceFourStyle +\\voiceFour +\\vocalName +\\virgula +\\virga +\\verylongfermata +\\versus +\\version +\\verbatim-file +\\vcenter +\\varcoda +\\upright +\\upprall +\\upmordent +\\upbow +\\up +\\unset +\\unit +\\unfoldRepeats +\\undo +\\undertie +\\underline +\\unaCorda +\\unHideNotes +\\typewriter +\\type +\\tweak +\\turn +\\tupletUp +\\tupletSpan +\\tupletNeutral +\\tupletDown +\\tuplet +\\trill +\\triangle +\\treCorde +\\transposition +\\transposedCueDuring +\\transpose +\\transparent +\\translate-scaled +\\translate +\\topLevelAlignment +\\tocTitleMarkup +\\tocItemWithDotsMarkup +\\tocItemMarkup +\\tocItem +\\tiny +\\timing +\\times +\\timeSignatureSettings +\\timeSignatureFraction +\\time +\\tied-lyric +\\tieWaitForNote +\\tieUp +\\tieSolid +\\tieNeutral +\\tieHalfSolid +\\tieHalfDashed +\\tieDown +\\tieDotted +\\tieDashed +\\tieDashPattern +\\tie +\\thumb +\\textSpannerUp +\\textSpannerNeutral +\\textSpannerDown +\\textLengthOn +\\textLengthOff +\\text +\\tenuto +\\temporary +\\tempoWholesPerMinute +\\tempo +\\teeny +\\tagGroup +\\tag +\\table-of-contents +\\table +\\tablatureFormat +\\tabStaffLineLayoutFunction +\\tabFullNotation +\\systemStartDelimiter +\\sustainOn +\\sustainOff +\\super +\\subdivideBeams +\\sub +\\styledNoteHeads +\\strut +\\stropha +\\strokeFingerOrientations +\\stringTunings +\\stringOneTopmost +\\stringNumberOrientations +\\stopped +\\stopTrillSpan +\\stopTextSpan +\\stopStaff +\\stopSlashedGraceMusic +\\stopMeasureCount +\\stopGroup +\\stopGraceSlur +\\stopGraceMusic +\\stopAppoggiaturaMusic +\\stopAcciaccaturaMusic +\\stop +\\stencil +\\stemUp +\\stemNeutral +\\stemDown +\\startTrillSpan +\\startTextSpan +\\startStaff +\\startSlashedGraceMusic +\\startRepeatType +\\startMeasureCount +\\startGroup +\\startGraceSlur +\\startGraceMusic +\\startAppoggiaturaMusic +\\startAcciaccaturaMusic +\\start +\\staccato +\\staccatissimo +\\squashedPosition +\\spp +\\spacingTweaks +\\sp +\\southernHarmonyHeadsMinor +\\southernHarmonyHeads +\\sostenutoOn +\\sostenutoOff +\\soloText +\\soloIIText +\\snappizzicato +\\smaller +\\smallCaps +\\small +\\slurUp +\\slurSolid +\\slurNeutral +\\slurHalfSolid +\\slurHalfDashed +\\slurDown +\\slurDotted +\\slurDashed +\\slurDashPattern +\\slashedGrace +\\slashed-digit +\\slashChordSeparator +\\skipTypesetting +\\skip +\\single +\\simultaneous +\\simple +\\signumcongruentiae +\\showStaffSwitch +\\showSplitTiedTabNotes +\\shortfermata +\\shortVocalName +\\shortInstrumentName +\\shiftOnnn +\\shiftOnn +\\shiftOn +\\shiftOff +\\shiftDurations +\\sharp +\\shape +\\sfz +\\sfp +\\sff +\\sf +\\settingsFrom +\\setDefaultDurationToQuarter +\\set +\\sesquisharp +\\sesquiflat +\\sequential +\\semisharp +\\semiflat +\\semicirculus +\\semiGermanChords +\\segno +\\searchForVoice +\\scriptDefinitions +\\score-lines +\\score +\\scaleDurations +\\scale +\\sans +\\sacredHarpHeadsMinor +\\sacredHarpHeads +\\rtoe +\\rounded-box +\\rotate +\\romanStringNumbers +\\roman +\\rightHandFinger +\\right-column +\\right-brace +\\right-align +\\right +\\rheel +\\rfz +\\revertTimeSignatureSettings +\\revert +\\reverseturn +\\retrograde +\\restrainOpenStrings +\\rest-by-number +\\rest +\\responsum +\\resetRelativeOctave +\\replace +\\repeatTie +\\repeatCountVisibility +\\repeat +\\removeWithTag +\\remove +\\relative +\\rehearsalMark +\\reduceChords +\\raise +\\quotedEventTypes +\\quotedCueEventTypes +\\quoteDuring +\\quilisma +\\put-adjacent +\\pushToTag +\\pt +\\propertyUnset +\\propertyTweak +\\propertySet +\\propertyRevert +\\propertyOverride +\\property-recursive +\\printPartCombineTexts +\\printKeyCancellation +\\predefinedFretboardsOn +\\predefinedFretboardsOff +\\predefinedDiagramTable +\\prallup +\\prallprall +\\prallmordent +\\pralldown +\\prall +\\ppppp +\\pppp +\\ppp +\\pp +\\powerChords +\\powerChordSymbol +\\powerChordExceptions +\\postscript +\\portato +\\pointAndClickTypes +\\pointAndClickOn +\\pointAndClickOff +\\pitchedTrill +\\phrygian +\\phrasingSlurUp +\\phrasingSlurSolid +\\phrasingSlurNeutral +\\phrasingSlurHalfSolid +\\phrasingSlurHalfDashed +\\phrasingSlurDown +\\phrasingSlurDotted +\\phrasingSlurDashed +\\phrasingSlurDashPattern +\\pes +\\pedalUnaCordaStyle +\\pedalUnaCordaStrings +\\pedalSustainStyle +\\pedalSustainStrings +\\pedalSostenutoStyle +\\pedalSostenutoStrings +\\pattern +\\path +\\partialJazzMusic +\\partialJazzExceptions +\\partial +\\partcombineUp +\\partcombineUnisono +\\partcombineSoloII +\\partcombineSoloI +\\partcombineForce +\\partcombineDown +\\partcombineChords +\\partcombineAutomatic +\\partcombineApart +\\partcombine +\\partCombineTextsOnNote +\\partCombineListener +\\parenthesize +\\parallelMusic +\\paper +\\palmMuteOn +\\palmMuteOff +\\palmMute +\\pageTurn +\\pageBreak +\\page-ref +\\page-link +\\pad-x +\\pad-to-box +\\pad-markup +\\pad-around +\\p +\\overtie +\\overrideTimeSignatureSettings +\\overrideProperty +\\override-lines +\\override +\\overlay +\\oval +\\ottava +\\oriscus +\\open +\\oneVoice +\\once +\\on-the-fly +\\omit +\\offset +\\octaveCheck +\\numericTimeSignature +\\number +\\nullAccidentals +\\null +\\notemode +\\noteToFretFunction +\\note-by-number +\\note +\\normalsize +\\normal-text +\\normal-size-super +\\normal-size-sub +\\noPageTurn +\\noPageBreak +\\noChordSymbol +\\noBreak +\\noBeam +\\newSpacingSection +\\new +\\neumeDemoLayout +\\natural +\\name +\\musicglyph +\\musicMap +\\mp +\\mordent +\\modalTranspose +\\modalInversion +\\mm +\\mixolydian +\\minorChordModifier +\\minor +\\midiInstrument +\\midiChannelMapping +\\midi +\\middleCPosition +\\middleCClefPosition +\\mf +\\metronomeMarkFormatter +\\mergeDifferentlyHeadedOn +\\mergeDifferentlyHeadedOff +\\mergeDifferentlyDottedOn +\\mergeDifferentlyDottedOff +\\melismaEnd +\\melismaBusyProperties +\\melisma +\\medium +\\maxima +\\markuplist +\\markupMap +\\markup +\\markletter +\\markalphabet +\\markLengthOn +\\markLengthOff +\\markFormatter +\\mark +\\marcato +\\map-markup-commands +\\makeClusters +\\majorSevenSymbol +\\major +\\maininput +\\magnifyStaff +\\magnifyMusic +\\magnify +\\lyricsto +\\lyrics +\\lyricmode +\\lyricMelismaAlignment +\\lydian +\\ltoe +\\lower +\\lookup +\\longfermata +\\longa +\\locrian +\\localAlterations +\\lineprall +\\linea +\\line +\\ligature +\\lheel +\\left-column +\\left-brace +\\left-align +\\left +\\layout +\\larger +\\large +\\languageSaveAndChange +\\languageRestore +\\language +\\laissezVibrer +\\label +\\killCues +\\kievanOn +\\kievanOff +\\keyAlterationOrder +\\key +\\keepWithTag +\\keepAliveInterfaces +\\justify-string +\\justify-line +\\justify-field +\\justify +\\justified-lines +\\italic +\\italianChords +\\ionian +\\inversion +\\interscoreline +\\instrumentTransposition +\\instrumentSwitch +\\instrumentName +\\instrumentEqualizer +\\initialTimeSignatureVisibility +\\indent +\\include +\\inclinatum +\\incipit +\\inStaffSegno +\\in +\\improvisationOn +\\improvisationOff +\\ij +\\iij +\\ignoreFiguredBassRest +\\ignoreBarChecks +\\ignatzekExceptions +\\ignatzekExceptionMusic +\\ictus +\\huge +\\hspace +\\highStringOne +\\hideStaffSwitch +\\hideSplitTiedTabNotes +\\hideNotes +\\hide +\\header +\\hcenter-in +\\hbracket +\\harp-pedal +\\harmonicsOn +\\harmonicsOff +\\harmonicNote +\\harmonicByRatio +\\harmonicByFret +\\harmonicAccidentals +\\harmonic +\\handleNegativeFrets +\\halign +\\halfopen +\\grobdescriptions +\\graceSettings +\\grace +\\glissando +\\germanChords +\\general-align +\\fz +\\funkHeadsMinor +\\funkHeads +\\fullJazzExceptions +\\fromproperty +\\fret-diagram-verbose +\\fret-diagram-terse +\\fret-diagram +\\frenchChords +\\fraction +\\fp +\\footnote +\\fontsize +\\fontSize +\\fontCaps +\\flexa +\\flat +\\flageolet +\\fixed +\\firstClef +\\first-visible +\\fingeringOrientations +\\finger +\\finalis +\\filled-box +\\fill-with-pattern +\\fill-line +\\figures +\\figuremode +\\figuredBassFormatter +\\fffff +\\ffff +\\fff +\\ff +\\fermataMarkup +\\fermata +\\featherDurations +\\f +\\eyeglasses +\\extraNatural +\\extendersOverRests +\\explicitKeySignatureVisibility +\\explicitCueClefVisibility +\\explicitClefVisibility +\\expandFullBarRests +\\eventChords +\\etc +\\espressivo +\\epsfile +\\episemInitium +\\episemFinis +\\enddim +\\enddecresc +\\enddecr +\\endcresc +\\endcr +\\endSpanners +\\endRepeatType +\\ellipse +\\easyHeadsOn +\\easyHeadsOff +\\dynamicUp +\\dynamicNeutral +\\dynamicDown +\\dynamicAbsoluteVolumeFunction +\\dynamic +\\drums +\\drummode +\\drumStyleTable +\\drumPitchTable +\\draw-squiggle-line +\\draw-line +\\draw-hline +\\draw-dotted-line +\\draw-dashed-line +\\draw-circle +\\downprall +\\downmordent +\\downbow +\\down +\\doublesharp +\\doubleflat +\\doubleRepeatType +\\dotsUp +\\dotsNeutral +\\dotsDown +\\dorian +\\divisioMinima +\\divisioMaxima +\\divisioMaior +\\displayScheme +\\displayMusic +\\displayLilyMusic +\\dir-column +\\dimTextDim +\\dimTextDecresc +\\dimTextDecr +\\dimHairpin +\\dim +\\description +\\descendens +\\deprecatedenddim +\\deprecatedendcresc +\\deprecateddim +\\deprecatedcresc +\\denies +\\deminutum +\\defineBarLine +\\defaultchild +\\defaultTimeSignature +\\defaultNoteHeads +\\defaultBarType +\\default +\\decrescendoSpanner +\\decresc +\\decr +\\deadNotesOn +\\deadNotesOff +\\deadNote +\\dashUnderscore +\\dashPlus +\\dashLarger +\\dashHat +\\dashDot +\\dashDash +\\dashBang +\\cueDuringWithClef +\\cueDuring +\\cueClefUnset +\\cueClefTranspositionFormatter +\\cueClef +\\crossStaff +\\crescendoSpanner +\\crescTextCresc +\\crescHairpin +\\cresc +\\createSpacing +\\cr +\\context +\\consists +\\concat +\\compressMMRests +\\compressFullBarRests +\\compoundMeter +\\completionFactor +\\command-name +\\combine +\\column-lines +\\column +\\coda +\\cm +\\clefTranspositionFormatter +\\clefTransposition +\\clefPosition +\\clefGlyph +\\clef +\\circulus +\\circle +\\chords +\\chordmodifiers +\\chordmode +\\chordRootNamer +\\chordPrefixSpacer +\\chordNoteNamer +\\chordNameSeparator +\\chordNameLowercaseMinor +\\chordNameFunction +\\chordNameExceptionsPartial +\\chordNameExceptionsFull +\\chordNameExceptions +\\char +\\change +\\center-column +\\center-align +\\center +\\cavum +\\caps +\\caesura +\\cadenzaOn +\\cadenzaOff +\\breve +\\breathe +\\breakDynamicSpan +\\break +\\bracket +\\box +\\bookpart +\\bookOutputSuffix +\\bookOutputName +\\book +\\bold +\\blackTriangleMarkup +\\bigger +\\bendAfter +\\beamHalfMeasure +\\beamExceptions +\\beam +\\bassFigureStaffAlignmentUp +\\bassFigureStaffAlignmentNeutral +\\bassFigureStaffAlignmentDown +\\bassFigureExtendersOn +\\bassFigureExtendersOff +\\barNumberVisibility +\\barNumberFormatter +\\barNumberCheck +\\barCheckSynchronize +\\barAlways +\\bar +\\balloonText +\\balloonLengthOn +\\balloonLengthOff +\\balloonGrobText +\\backslashed-digit +\\automaticBars +\\autochange +\\autoPageBreaksOn +\\autoPageBreaksOff +\\autoLineBreaksOn +\\autoLineBreaksOff +\\autoCautionaries +\\autoBreaksOn +\\autoBreaksOff +\\autoBeaming +\\autoBeamOn +\\autoBeamOff +\\autoBeamCheck +\\autoAccidentals +\\auto-footnote +\\augmentum +\\auctum +\\associatedVoiceType +\\assertBeamSlope +\\assertBeamQuant +\\ascendens +\\arrow-head +\\arpeggioParenthesisDashed +\\arpeggioParenthesis +\\arpeggioNormal +\\arpeggioBracket +\\arpeggioArrowUp +\\arpeggioArrowDown +\\arpeggio +\\arabicStringNumbers +\\appoggiatura +\\applyOutput +\\applyMusic +\\applyContext +\\appendToTag +\\alternativeRestores +\\alternative +\\alterBroken +\\allowVoltaHook +\\allowPageTurn +\\alias +\\aikenHeadsMinor +\\aikenHeads +\\afterGraceFraction +\\afterGrace +\\aeolian +\\addlyrics +\\additionalPitchPrefix +\\addQuote +\\addInstrumentDefinition +\\accidentalStyle +\\acciaccatura +\\accepts +\\accentus +\\accent +\\absolute +\\abs-fontsize +\\aDueText +\\RemoveEmptyTabStaffContext +\\RemoveEmptyStaffContext +\\RemoveEmptyRhythmicStaffContext +\\RemoveEmptyDrumStaffContext +\\IJ +\\IIJ +\\C +\\B +\\AncientRemoveEmptyStaffContext +\\A +staff +spacing +signature +routine +notes +handler +corrected +beams +arpeggios +Volta_engraver +Voice +Vertical_align_engraver +Vaticana_ligature_engraver +VaticanaVoice +VaticanaStaff +Tweak_engraver +Tuplet_engraver +Trill_spanner_engraver +Timing_translator +Time_signature_performer +Time_signature_engraver +Tie_performer +Tie_engraver +Text_spanner_engraver +Text_engraver +Tempo_performer +Tab_tie_follow_engraver +Tab_staff_symbol_engraver +Tab_note_heads_engraver +TabVoice +TabStaff +System_start_delimiter_engraver +Stem_engraver +Stanza_number_engraver +Stanza_number_align_engraver +Staff_symbol_engraver +Staff_performer +Staff_collecting_engraver +StaffGroup +Staff +Spanner_break_forbid_engraver +Span_bar_stub_engraver +Span_bar_engraver +Span_arpeggio_engraver +Spacing_engraver +Slur_performer +Slur_engraver +Slash_repeat_engraver +Separating_line_group_engraver +Script_row_engraver +Script_engraver +Script_column_engraver +Score +Rhythmic_column_engraver +RhythmicStaff +Rest_engraver +Rest_collision_engraver +Repeat_tie_engraver +Repeat_acknowledge_engraver +Pure_from_neighbor_engraver +Pitched_trill_engraver +Pitch_squash_engraver +Piano_pedal_performer +Piano_pedal_engraver +Piano_pedal_align_engraver +PianoStaff +Phrasing_slur_engraver +PetrucciVoice +PetrucciStaff +Percent_repeat_engraver +Part_combine_engraver +Parenthesis_engraver +Paper_column_engraver +Output_property_engraver +Ottava_spanner_engraver +OneStaff +NullVoice +Note_spacing_engraver +Note_performer +Note_name_engraver +Note_heads_engraver +Note_head_line_engraver +NoteNames +NoteHead +New_fingering_engraver +Multi_measure_rest_engraver +Midi_control_change_performer +Metronome_mark_engraver +Mensural_ligature_engraver +MensuralVoice +MensuralStaff +Mark_engraver +Lyrics +Lyric_performer +Lyric_engraver +Ligature_bracket_engraver +Ledger_line_engraver +Laissez_vibrer_engraver +Kievan_ligature_engraver +KievanVoice +KievanStaff +Key_performer +Key_engraver +Keep_alive_together_engraver +Instrument_switch_engraver +Instrument_name_engraver +Hyphen_engraver +Grob_pq_engraver +GregorianTranscriptionVoice +GregorianTranscriptionStaff +GrandStaff +Grace_spacing_engraver +Grace_engraver +Grace_beam_engraver +Grace_auto_beam_engraver +Global +Glissando_engraver +Fretboard_engraver +FretBoards +Forbid_line_break_engraver +Footnote_engraver +Font_size_engraver +Fingering_engraver +Fingering_column_engraver +Figured_bass_position_engraver +Figured_bass_engraver +FiguredBass +Extender_engraver +Episema_engraver +Dynamics +Dynamic_performer +Dynamic_engraver +Dynamic_align_engraver +Drum_notes_engraver +Drum_note_performer +DrumVoice +DrumStaff +Double_percent_repeat_engraver +Dots_engraver +Dot_column_engraver +Devnull +Default_bar_line_engraver +Custos_engraver +Cue_clef_engraver +CueVoice +Control_track_performer +Concurrent_hairpin_engraver +Collision_engraver +Cluster_spanner_engraver +Clef_engraver +Chord_tremolo_engraver +Chord_name_engraver +ChordNames +ChoirStaff +Breathing_sign_engraver +Break_align_engraver +Bend_engraver +Beam_performer +Beam_engraver +Beam_collision_engraver +Bar_number_engraver +Bar_engraver +Axis_group_engraver +Auto_beam_engraver +Arpeggio_engraver +Accidental_engraver +solx +soltcs +soltcb +solstqt +solss +solsqt +solsd +solsb +sols +solkk +solk +soldsd +soldd +sold +solcs +solcb +solbtqt +solbsb +solbqt +solbb +solb +sol +six +sitcs +sitcb +sistqt +siss +sisqt +sisd +sisb +sis +sikk +sik +sidsd +sidd +sid +sics +sicb +sibtqt +sibsb +sibqt +sibb +sib +si +rex +retcs +retcb +restqt +ress +resqt +resd +resb +res +rekk +rek +redsd +redd +red +recs +recb +rebtqt +rebsb +rebqt +rebb +reb +re +mix +mitcs +mitcb +mistqt +miss +misqt +misd +misb +mis +mikk +mik +midsd +midd +mid +mics +micb +mibtqt +mibsb +mibqt +mibb +mib +mi +lax +latcs +latcb +lastqt +lass +lasqt +lasd +lasb +las +lakk +lak +ladsd +ladd +lad +lacs +lacb +labtqt +labsb +labqt +labb +lab +la +hississ +hiss +hisis +hisih +his +hih +hessess +heses +heseh +h +gx +gtqs +gtqf +gss +gs +gqs +gqf +gississ +giss +gisis +gisih +gis +gih +gff +gf +gessess +gess +geses +geseh +ges +geh +g +fx +ftqs +ftqf +fss +fs +fqs +fqf +fississ +fiss +fisis +fisih +fis +fih +fff +ff +fessess +fess +feses +feseh +fes +feh +fax +fatcs +fatcb +fastqt +fass +fasqt +fasd +fasb +fas +fakk +fak +fadsd +fadd +fad +facs +facb +fabtqt +fabsb +fabqt +fabb +fab +fa +f +ex +etqs +etqf +essess +ess +eses +eseh +es +eqs +eqf +eississ +eiss +eisis +eisih +eis +eih +eff +ef +eessess +eess +eeses +eeseh +ees +eeh +e +dx +dtqs +dtqf +dss +ds +dqs +dqf +dox +dotcs +dotcb +dostqt +doss +dosqt +dosd +dosb +dos +dokk +dok +dodsd +dodd +dod +docs +docb +dobtqt +dobsb +dobqt +dobb +dob +do +dississ +diss +disis +disih +dis +dih +dff +df +dessess +dess +deses +deseh +des +deh +d +cx +ctqs +ctqf +css +cs +cqs +cqf +cississ +ciss +cisis +cisih +cis +cih +cff +cf +cessess +cess +ceses +ceseh +ces +ceh +c +bx +btqs +btqf +bss +bs +bqs +bqf +bisis +bisih +bis +bih +bff +bf +bess +beses +beseh +bes +beh +bb +b +ax +atqs +atqf +assess +ass +ases +aseh +asas +asah +as +aqs +aqf +aississ +aiss +aisis +aisih +ais +aih +aff +af +aessess +aess +aeses +aeseh +aes +aeh +a +\( - _ \) - +\[ - _ \] - +< - _ > - +<< - _ >> - +\\\( - _ \\\) - +\\\[ - _ \\\] - +\\\< - _ \\\! - +\\\> - _ \\\! - +\\center - \ << _ >> - +\\column - \ << _ >> - +\\context\ Staff\ = - % { _ } - +\\context\ Voice\ = - % { _ } - +\\markup - { _ } - +\\notes - { _ } - +\\relative - % { _ } - +\\score - { \\n \? \\simultaneous { \\n _ \\n } \! \\n \\layout { } \\n \? \\midi { } \\n \! } \\n - +\\simultaneous - { _ } - +\\sustainOn - _ \\sustainOff - +\\times - % { _ } - +\\transpose - % { _ } - diff --git a/.emacs.d/site-elisp/multi-term b/.emacs.d/site-elisp/multi-term new file mode 160000 index 0000000..8deb0f2 --- /dev/null +++ b/.emacs.d/site-elisp/multi-term @@ -0,0 +1 @@ +Subproject commit 8deb0f2252399cca2426eb3cc3e9646c5de726b3 diff --git a/.emacs.d/site-elisp/snails b/.emacs.d/site-elisp/snails new file mode 160000 index 0000000..44f77cc --- /dev/null +++ b/.emacs.d/site-elisp/snails @@ -0,0 +1 @@ +Subproject commit 44f77cc35f75e623a6e2a419629a16ec9b9c3fbf diff --git a/.gitmodules b/.gitmodules index ab0ebd4..520e98a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,39 @@ [submodule "zsh-custom/plugins/zsh-syntax-highlighting"] path = zsh-custom/plugins/zsh-syntax-highlighting url = git://github.com/zsh-users/zsh-syntax-highlighting +[submodule ".emacs.d/site-elisp/color-rg"] + path = .emacs.d/site-elisp/color-rg + url = https://github.com/manateelazycat/color-rg.git +[submodule ".emacs.d/site-elisp/awesome-pair"] + path = .emacs.d/site-elisp/awesome-pair + url = https://github.com/manateelazycat/awesome-pair.git +[submodule ".emacs.d/site-elisp/header2"] + path = .emacs.d/site-elisp/header2 + url = https://github.com/emacsmirror/header2.git +[submodule ".emacs.d/site-elisp/grep-dired"] + path = .emacs.d/site-elisp/grep-dired + url = https://github.com/manateelazycat/grep-dired.git +[submodule ".emacs.d/site-elisp/leetcode.el"] + path = .emacs.d/site-elisp/leetcode.el + url = https://github.com/kaiwk/leetcode.el.git +[submodule ".emacs.d/site-elisp/delete-block"] + path = .emacs.d/site-elisp/delete-block + url = https://github.com/manateelazycat/delete-block.git +[submodule ".emacs.d/site-elisp/instant-rename-tag"] + path = .emacs.d/site-elisp/instant-rename-tag + url = https://github.com/manateelazycat/instant-rename-tag.git +[submodule ".emacs.d/site-elisp/emacs-application-framework"] + path = .emacs.d/site-elisp/emacs-application-framework + url = https://github.com/manateelazycat/emacs-application-framework.git +[submodule ".emacs.d/site-elisp/snails"] + path = .emacs.d/site-elisp/snails + url = https://github.com/manateelazycat/snails.git +[submodule ".emacs.d/site-elisp/multi-term"] + path = .emacs.d/site-elisp/multi-term + url = https://github.com/manateelazycat/multi-term.git +[submodule ".emacs.d/site-elisp/epaint"] + path = .emacs.d/site-elisp/epaint + url = https://github.com/chuntaro/epaint.git +[submodule ".emacs.d/site-elisp/aweshell"] + path = .emacs.d/site-elisp/aweshell + url = https://github.com/MatthewZMD/aweshell.git