many changes

This commit is contained in:
Iñaki Dominguez
2022-12-30 22:49:12 +01:00
parent 6a3f50144b
commit 2240c18f18
3 changed files with 653 additions and 27 deletions

2
.gitignore vendored
View File

@@ -1,10 +1,12 @@
transient/ transient/
elpa/ elpa/
eln-cache/
eshell/ eshell/
auto-save-list/ auto-save-list/
recentf recentf
network-security.data network-security.data
*.elc *.elc
*.eld
themes/*.elc themes/*.elc
*.*~ *.*~
custom.el custom.el

231
init.el
View File

@@ -32,6 +32,9 @@ There are two things you can do about this warning:
;; Configure packages with use-package ;; Configure packages with use-package
(use-package all-the-icons
:ensure t)
(use-package asm-mode (use-package asm-mode
:config :config
(setq asm-comment-char ?\#) (setq asm-comment-char ?\#)
@@ -74,6 +77,31 @@ There are two things you can do about this warning:
("C-x C-f" . counsel-find-file)) ("C-x C-f" . counsel-find-file))
:hook (find-file . (lambda () (linum-mode 1)))) :hook (find-file . (lambda () (linum-mode 1))))
(use-package dashboard
:ensure t
:init
:config
(dashboard-setup-startup-hook)
(setq dashboard-startup-banner 1
dashboard-banner-logo-title "Beep boop."
dashboard-center-content t
dashboard-set-heading-icons t
dashboard-set-file-icons t
dashboard-show-shortcuts t
dashboard-set-navigator t
dashboard-set-init-info t)
(setq dashboard-items '((recents . 10)
(bookmarks . 10)
(registers . 5)))
(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")))
(add-hook 'server-after-make-frame-hook
(lambda ()
(switch-to-buffer dashboard-buffer-name)
(dashboard-mode)
(dashboard-insert-startupify-lists)
(dashboard-refresh-buffer))))
(use-package dracula-theme (use-package dracula-theme
:config (load-theme 'dracula t)) :config (load-theme 'dracula t))
@@ -92,11 +120,24 @@ There are two things you can do about this warning:
:init :init
(setq evil-want-fine-undo t (setq evil-want-fine-undo t
evil-want-keybinding nil) evil-want-keybinding nil)
(defun evil-custom-exit ()
(interactive)
(if (= (length (window-list)) 1)
(tab-bar-close-tab)
(delete-window)))
:config :config
(evil-mode 1) (evil-mode 1)
(evil-set-undo-system 'undo-tree) (evil-set-undo-system 'undo-tree)
(define-key evil-normal-state-map "\C-t" nil)
(define-key evil-motion-state-map "\C-t" nil)
(define-key evil-normal-state-map "\C-w" nil)
(define-key evil-motion-state-map "\C-w" nil)
(define-key evil-motion-state-map "\C-f" nil)
(evil-set-initial-state 'term-mode 'emacs) (evil-set-initial-state 'term-mode 'emacs)
(evil-set-initial-state 'dired-mode 'emacs)) (evil-set-initial-state 'neotree-mode 'emacs)
(evil-set-initial-state 'dired-mode 'emacs)
(evil-set-initial-state 'dashboard-mode 'emacs)
(evil-ex-define-cmd "q" #'evil-custom-exit))
(use-package evil-collection (use-package evil-collection
:after (:all evil magit) :after (:all evil magit)
@@ -118,6 +159,30 @@ There are two things you can do about this warning:
:mode ("\\.hs\\'" . haskell-mode) :mode ("\\.hs\\'" . haskell-mode)
:interpreter ("haskell" . haskell-mode)) :interpreter ("haskell" . haskell-mode))
(use-package hideshow
:hook ((prog-mode . hs-minor-mode))
:init
(defun hs-toggle-hiding-fixed (&optional e)
"Toggle hiding/showing of a block.
See `hs-hide-block' and `hs-show-block'.
Argument E should be the event that triggered this action."
(interactive)
(hs-life-goes-on
(when e (posn-set-point (event-end e)))
;; (posn-set-point (event-end e))
(if (hs-already-hidden-p)
(hs-show-block)
(hs-hide-block))))
(defun toggle-fold ()
(interactive)
(save-excursion
(end-of-line)
(hs-toggle-hiding-fixed)))
:config
(advice-add 'hs-toggle-hiding :override #'hs-toggle-hiding-fixed))
(use-package ivy (use-package ivy
:init :init
(setq ivy-use-virtual-buffers t (setq ivy-use-virtual-buffers t
@@ -126,6 +191,10 @@ There are two things you can do about this warning:
:config :config
(ivy-mode 1)) (ivy-mode 1))
(use-package json-mode
:mode (("\\.json\\'" . json-mode)
("\\.json.tmpl\\'" . json-mode)))
(use-package less-css-mode (use-package less-css-mode
:mode ("\\.less\\'" . less-css-mode)) :mode ("\\.less\\'" . less-css-mode))
@@ -182,18 +251,41 @@ There are two things you can do about this warning:
(cons "C-r" 'term-send-reverse-search-history) (cons "C-r" 'term-send-reverse-search-history)
(cons "C-y" 'term-send-raw))) (cons "C-y" 'term-send-raw)))
:bind (([f5] . multi-term) :bind (([f5] . multi-term)
("C-<tab>" . multi-term-next) ("C-M-<tab>" . multi-term-next)
("C-<iso-lefttab>" . multi-term-prev))) ("C-M-<iso-lefttab>" . multi-term-prev)))
(use-package nasm-mode (use-package nasm-mode
:mode ("\\.nasm\\'" . nasm-mode)) :mode ("\\.nasm\\'" . nasm-mode))
(use-package neotree
:config
(setq neo-theme (if (display-graphic-p) 'icons 'arrow))
(add-hook 'server-after-make-frame-hook
(lambda ()
(setq neo-theme (if (display-graphic-p) 'icons 'arrow))))
(add-hook 'neotree-mode-hook
(lambda ()
(local-set-key (kbd "C-f") #'neotree-toggle)
(local-set-key (kbd "RET") #'neotree-change-root)))
:bind
("C-f" . neotree-find)
([f8] . neotree-toggle))
(use-package page-break-lines
:config
(page-break-lines-mode t))
(use-package pkg-info) (use-package pkg-info)
(use-package plsql (use-package plsql
:load-path "~/.emacs.d/lisp/plsql.el" :load-path "~/.emacs.d/lisp/plsql.el"
:mode ("\\.plsql\\'" . plsql-mode)) :mode ("\\.plsql\\'" . plsql-mode))
(use-package pragmatapro-lig
:load-path "~/.emacs.d/lisp/pragmatapro-lig.el"
:config
(pragmatapro-lig-global-mode))
(use-package python (use-package python
:mode ("\\.py\\'" . python-mode) :mode ("\\.py\\'" . python-mode)
:interpreter ("python" . python-mode)) :interpreter ("python" . python-mode))
@@ -211,6 +303,71 @@ There are two things you can do about this warning:
(use-package swiper (use-package swiper
:bind (("C-s" . swiper))) :bind (("C-s" . swiper)))
(use-package tab-bar
:after dracula-theme
:bind
("C-t" . tab-bar-new-tab)
("C-w" . tab-bar-close-tab)
("C-<tab>" . tab-bar-switch-to-next-tab)
("C-<iso-lefttab>" . tab-bar-switch-to-prev-tab)
:custom
(tab-bar-show 1)
(tab-bar-close-button-show nil)
(tab-bar-new-tab-choice "*dashboard*")
(tab-bar-tab-hints t)
(tab-bar-separator "")
(tab-bar-format '(tab-bar-format-tabs tab-bar-separator))
(tab-bar-tab-name-format-function #'custom-tab-bar-tab-name-format-default)
(tab-bar-close-last-tab-choice 'delete-frame)
:init
(defgroup custom-tab-bar nil
"Custom tweaks to tar-bar-mode."
:group 'tab-bar)
(defface custom-tab-bar-tab
`((t :inherit 'tab-bar-tab
:foreground "SeaGreen2"))
"Face for active tab in tab-bar."
:group 'custom-tab-bar)
(defface custom-tab-bar-tab-hint
`((t :inherit 'custom-tab-bar-tab
:foreground "deep pink"))
"Face for active tab hint in tab-bar."
:group 'custom-tab-bar)
(defface custom-tab-bar-tab-inactive
`((t :inherit 'tab-bar-tab-inactive
:foreground "dark gray"))
"Face for inactive tab in tab-bar."
:group 'custom-tab-bar)
(defface custom-tab-bar-tab-hint-inactive
`((t :inherit 'custom-tab-bar-tab-inactive
:foreground "thistle"))
"Face for inactive tab hint in tab-bar."
:group 'custom-tab-bar)
(defun custom-tab-bar-tab-name-format-default (tab i)
(let* ((current-p (eq (car tab) 'current-tab))
(tab-face (if (and current-p (display-graphic-p))
'custom-tab-bar-tab
'custom-tab-bar-tab-inactive))
(hint-face (if (and current-p (display-graphic-p))
'custom-tab-bar-tab-hint
'custom-tab-bar-tab-hint-inactive)))
(concat (propertize (if tab-bar-tab-hints
(format " %d:" (- i 1))
" ")
'face hint-face)
(propertize
(concat
(alist-get 'name tab)
(or (and tab-bar-close-button-show
(not (eq tab-bar-close-button-show
(if current-p 'non-selected 'selected)))
tab-bar-close-button)
"")
" ")
'face tab-face))))
:config
(tab-bar-mode t)
(use-package term (use-package term
:config :config
;; https://web.archive.org/web/20181111010613/ -> ;; https://web.archive.org/web/20181111010613/ ->
@@ -294,6 +451,8 @@ There are two things you can do about this warning:
(use-package yaml-mode (use-package yaml-mode
:mode (("\\.yml\\'" . yaml-mode) :mode (("\\.yml\\'" . yaml-mode)
("\\.yml.tmpl\\'" . yaml-mode)
("\\.yaml.tmpl\\'" . yaml-mode)
("\\.yaml\\'" . yaml-mode))) ("\\.yaml\\'" . yaml-mode)))
;; Configure emacs general settings with use-package ;; Configure emacs general settings with use-package
@@ -306,7 +465,9 @@ There are two things you can do about this warning:
(delete-file (concat buffer-file-name "c")))) (delete-file (concat buffer-file-name "c"))))
(defun gcm-scroll-down () (interactive) (scroll-up 1)) (defun gcm-scroll-down () (interactive) (scroll-up 1))
(defun gcm-scroll-up () (interactive) (scroll-down 1)) (defun gcm-scroll-up () (interactive) (scroll-down 1))
(global-prettify-symbols-mode +1)
:config :config
(add-to-list 'default-frame-alist '(tab-bar . custom-tab-bar))
(when (fboundp 'menu-bar-mode) (menu-bar-mode -1)) (when (fboundp 'menu-bar-mode) (menu-bar-mode -1))
(when (fboundp 'tool-bar-mode) (tool-bar-mode -1)) (when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) (when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1))
@@ -314,34 +475,47 @@ There are two things you can do about this warning:
(setq frame-title-format (setq frame-title-format
'(buffer-file-name "%f" (dired-directory dired-directory "%b")) '(buffer-file-name "%f" (dired-directory dired-directory "%b"))
custom-file "~/.emacs.d/custom.el" custom-file "~/.emacs.d/custom.el"
auth-source-save-behavior nil auth-source-save-behavior nil
enable-local-variables nil enable-local-variables nil
inhibit-startup-screen t inhibit-startup-screen t
vc-follow-symlinks t vc-follow-symlinks t
inhibit-compacting-font-caches 1 inhibit-compacting-font-caches 1
mouse-wheel-scroll-amount '(3 ((shift) . 3)) mouse-wheel-scroll-amount '(3 ((shift) . 3))
mouse-wheel-progressive-speed nil mouse-wheel-progressive-speed nil
mouse-wheel-follow-mouse 't mouse-wheel-follow-mouse 't
scroll-conservatively 10000 scroll-conservatively 10000
scroll-step 1 scroll-step 1
auto-save-interval 1000 auto-save-interval 1000
auto-window-vscroll nil auto-window-vscroll nil
backup-by-copying t backup-by-copying t
backup-directory-alist '(("." . "~/.saves")) backup-directory-alist '(("." . "~/.saves"))
delete-old-versions t delete-old-versions t
kept-new-versions 6 kept-new-versions 6
kept-old-versions 2 kept-old-versions 2
version-control t kmacro-ring-max 30
backup-directory-alist `((".*" . ,temporary-file-directory)) version-control t
auto-save-file-name-transforms `((".*" ,temporary-file-directory t)) backup-directory-alist `((".*" . ,temporary-file-directory))
vc-mode 1 auto-save-file-name-transforms `((".*" ,temporary-file-directory t))
ring-bell-function 'ignore vc-mode 1
column-number-mode 1 ring-bell-function 'ignore
savehist-mode 1) column-number-mode 1
savehist-mode 1
x-stretch-cursor t
inhibit-startup-message t
initial-scratch-message ""
inhibit-startup-echo-area-message t)
;;
(setq-default scroll-up-aggressively 0.01 (setq-default scroll-up-aggressively 0.01
scroll-down-aggressively 0.01 scroll-down-aggressively 0.01
indent-tabs-mode t indent-tabs-mode t
tab-width 8) tab-width 8)
(set-frame-font "PragmataPro Mono Liga 13" nil t)
(add-to-list 'default-frame-alist '(font . "PragmataPro Mono Liga 13"))
(add-to-list 'default-frame-alist '(fullscreen . maximized))
(set-face-attribute 'tab-bar nil :font "PragmataPro Mono Liga 13")
(add-hook 'server-after-make-frame-hook
(lambda ()
(set-face-attribute 'tab-bar nil :font "PragmataPro Mono Liga 13"))))
(global-auto-revert-mode 1) (global-auto-revert-mode 1)
(fringe-mode '(0 . 0)) (fringe-mode '(0 . 0))
(global-hl-line-mode 1) (global-hl-line-mode 1)
@@ -355,6 +529,9 @@ There are two things you can do about this warning:
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit) (define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit) (define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit) (define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(bind-keys :prefix-map toggle-map
:prefix "C-x t"
("f" . toggle-fold))
:bind (("C-<down>" . gcm-scroll-down) :bind (("C-<down>" . gcm-scroll-down)
("C-<next>" . gcm-scroll-down) ("C-<next>" . gcm-scroll-down)
("C-<up>" . gcm-scroll-up) ("C-<up>" . gcm-scroll-up)

447
lisp/pragmatapro-lig.el Normal file
View File

@@ -0,0 +1,447 @@
;; Emacs PramgataPro 0.828 Ligatures Support
;; Author: lumiknit (aasr4r4@gmail.com)
;; Version: 20200211
;; Usage: Use "M-x 'pragmatapro-lig-mode' RET" to turn on ligature minor mode.
;; Or, use 'pragmatapro-lig-global-mode to turn it on globally.
;; I recommend you to compile this file before load it.
(eval-when-compile (defconst pragmatapro-lig-alist
'( ;;("[ERROR]" #Xe2c0)
;; ("[DEBUG]" #Xe2c1)
;; ("[INFO]" #Xe2c2)
;; ("[WARN]" #Xe2c3)
;; ("[WARNING]" #Xe2c4)
;; ("[ERR]" #Xe2c5)
;; ("[FATAL]" #Xe2c6)
;; ("[TRACE]" #Xe2c7)
;; ("[FIXME]" #Xe2c8)
;; ("[TODO]" #Xe2c9)
;; ("[BUG]" #Xe2ca)
;; ("[NOTE]" #Xe2cb)
;; ("[HACK]" #Xe2cc)
;; ("[MARK]" #Xe2cd)
;; ("[FAIL]" #Xe2ce)
;; ("// ERROR" #Xe2e0)
;; ("// DEBUG" #Xe2e1)
;; ("// INFO" #Xe2e2)
;; ("// WARN" #Xe2e3)
;; ("// WARNING" #Xe2e4)
;; ("// ERR" #Xe2e5)
;; ("// FATAL" #Xe2e6)
;; ("// TRACE" #Xe2e7)
;; ("// FIXME" #Xe2e8)
;; ("// TODO" #Xe2e9)
;; ("// BUG" #Xe2ea)
;; ("// NOTE" #Xe2eb)
;; ("// HACK" #Xe2ec)
;; ("// MARK" #Xe2ed)
;; ("// FAIL" #Xe2ee)
;; ("# ERROR" #Xe2f0)
;; ("# DEBUG" #Xe2f1)
;; ("# INFO" #Xe2f2)
;; ("# WARN" #Xe2f3)
;; ("# WARNING" #Xe2f4)
;; ("# ERR" #Xe2f5)
;; ("# FATAL" #Xe2f6)
;; ("# TRACE" #Xe2f7)
;; ("# FIXME" #Xe2f8)
;; ("# TODO" #Xe2f9)
;; ("# BUG" #Xe2fa)
;; ("# NOTE" #Xe2fb)
;; ("# HACK" #Xe2fc)
;; ("# MARK" #Xe2fd)
;; ("# FAIL" #Xe2fe)
("!!" #Xe900)
("!=" #Xe901)
("!==" #Xe902)
("!!!" #Xe903)
;; ("!≡" #Xe904)
;; ("!≡≡" #Xe905)
("!>" #Xe906)
("!=<" #Xe907)
("#(" #Xe920)
("#_" #Xe921)
("#{" #Xe922)
("#?" #Xe923)
("#>" #Xe924)
("##" #Xe925)
("#_(" #Xe926)
("%=" #Xe930)
("%>" #Xe931)
("%>%" #Xe932)
("%<%" #Xe933)
;; ("<~" #Xe93f)
("&%" #Xe940)
("&&" #Xe941)
("&*" #Xe942)
("&+" #Xe943)
("&-" #Xe944)
("&/" #Xe945)
("&=" #Xe946)
("&&&" #Xe947)
("&>" #Xe948)
("$>" #Xe955)
;; ("~>" #Xe95f)
("***" #Xe960)
("*=" #Xe961)
("*/" #Xe962)
("*>" #Xe963)
("++" #Xe970)
("+++" #Xe971)
("+=" #Xe972)
("+>" #Xe973)
("++=" #Xe974)
("--" #Xe980)
("-<" #Xe981)
("-<<" #Xe982)
("-=" #Xe983)
("->" #Xe984)
("->>" #Xe985)
("---" #Xe986)
("-->" #Xe987)
("-+-" #Xe988)
("-\\/" #Xe989)
("-|>" #Xe98a)
("-<|" #Xe98b)
("->-" #Xe98c)
("-<-" #Xe98d)
(".." #Xe990)
("..." #Xe991)
("..<" #Xe992)
(".>" #Xe993)
(".~" #Xe994)
(".=" #Xe995)
("/*" #Xe9a0)
("//" #Xe9a1)
("/>" #Xe9a2)
("/=" #Xe9a3)
("/==" #Xe9a4)
("///" #Xe9a5)
("/**" #Xe9a6)
(":::" #Xe9af)
("::" #Xe9b0)
(":=" #Xe9b1)
(":>" #Xe9b3)
(":=>" #Xe9b4)
(":(" #Xe9b5)
(":-(" #Xe9b6)
(":)" #Xe9b7)
(":-)" #Xe9b8)
(":/" #Xe9b9)
(":\\" #Xe9ba)
(":3" #Xe9bb)
(":D" #Xe9bc)
(":P" #Xe9bd)
(":>:" #Xe9be)
(":<:" #Xe9bf)
("<$>" #Xe9c0)
("<*" #Xe9c1)
("<*>" #Xe9c2)
("<+>" #Xe9c3)
("<-" #Xe9c4)
("<<" #Xe9c5)
("<<<" #Xe9c6)
("<<=" #Xe9c7)
("<=" #Xe9c8)
("<=>" #Xe9c9)
("<>" #Xe9ca)
("<|>" #Xe9cb)
("<<-" #Xe9cc)
("<|" #Xe9cd)
("<=<" #Xe9ce)
("<~" #Xe9cf)
("<~~" #Xe9d0)
("<<~" #Xe9d1)
("<$" #Xe9d2)
("<+" #Xe9d3)
("<!>" #Xe9d4)
("<@>" #Xe9d5)
("<#>" #Xe9d6)
("<%>" #Xe9d7)
("<^>" #Xe9d8)
("<&>" #Xe9d9)
("<?>" #Xe9da)
("<.>" #Xe9db)
("</>" #Xe9dc)
("<\\>" #Xe9dd)
("<\">" #Xe9de)
("<:>" #Xe9df)
("<~>" #Xe9e0)
("<**>" #Xe9e1)
("<<^" #Xe9e2)
("<!" #Xe9e3)
("<@" #Xe9e4)
("<#" #Xe9e5)
("<%" #Xe9e6)
("<^" #Xe9e7)
("<&" #Xe9e8)
("<?" #Xe9e9)
("<." #Xe9ea)
("</" #Xe9eb)
("<\\" #Xe9ec)
("<\"" #Xe9ed)
("<:" #Xe9ee)
("<->" #Xe9ef)
("<!--" #Xe9f0)
("<--" #Xe9f1)
("<~<" #Xe9f2)
("<==>" #Xe9f3)
("<|-" #Xe9f4)
("<||" #Xe9f5)
("<<|" #Xe9f6)
("<-<" #Xe9f7)
("<-->" #Xe9f8)
("<<==" #Xe9f9)
("<==" #Xe9fa)
("=<<" #Xea00)
("==" #Xea01)
("===" #Xea02)
("==>" #Xea03)
("=>" #Xea04)
("=~" #Xea05)
("=>>" #Xea06)
("=/=" #Xea07)
("=~=" #Xea08)
("==>>" #Xea09)
("=>=" #Xea0a)
("=<=" #Xea0b)
("=<" #Xea0c)
;;("≡≡" #Xea10)
;;("≡≡≡" #Xea11)
;;("≡:≡" #Xea12)
(">-" #Xea20)
(">=" #Xea21)
(">>" #Xea22)
(">>-" #Xea23)
(">>=" #Xea24)
(">>>" #Xea25)
(">=>" #Xea26)
(">>^" #Xea27)
(">>|" #Xea28)
(">!=" #Xea29)
(">->" #Xea2a)
("??" #Xea40)
("?~" #Xea41)
("?=" #Xea42)
("?>" #Xea43)
("???" #Xea44)
("?." #Xea45)
("^=" #Xea48)
("^." #Xea49)
("^?" #Xea4a)
("^.." #Xea4b)
("^<<" #Xea4c)
("^>>" #Xea4d)
("^>" #Xea4e)
("\\\\" #Xea50)
("\\>" #Xea51)
("\\/-" #Xea52)
("@>" #Xea57)
("|=" #Xea60)
("||" #Xea61)
("|>" #Xea62)
("|||" #Xea63)
("|+|" #Xea64)
("|->" #Xea65)
("|-->" #Xea66)
("|=>" #Xea67)
("|==>" #Xea68)
("|>-" #Xea69)
("|<<" #Xea6a)
("||>" #Xea6b)
("|>>" #Xea6c)
("|-" #Xea6d)
("||-" #Xea6e)
("~=" #Xea70)
("~>" #Xea71)
("~~>" #Xea72)
("~>>" #Xea73)
("[[" #Xea80)
("]]" #Xea81)
("\">" #Xea90)
("_|_" #Xea97)
)))
(defconst pragmatapro-lig-table
(eval-when-compile
(let ((v (make-vector 128 nil)))
(dolist (i pragmatapro-lig-alist)
(let ((s (car i))
(f (min 127 (aref (car i) 0)))
(c (cadr i)))
(let ((a (aref v f))
(r (substring s 1))
(lr (1- (length s))))
(aset
v f
(cons
(max (if a (car a) 0) lr)
(cons (list r lr
(vconcat (mapcar
'string
(concat (make-string lr ?\s)
(string c)))))
(and a (cdr a))))))))
(vconcat (mapcar (lambda (l)
(if l
(cons (car l)
(sort (cdr l) (lambda (x y)
(> (cadr x) (cadr y)))))
nil))
v)))))
(defconst pragmatapro-lig-use-table
(eval-when-compile
(let ((v (make-vector 128 nil)))
(dolist (i pragmatapro-lig-alist)
(let ((s (car i)))
(dotimes (j (length s))
(aset v (aref s j) t))))
v)))
(defun pragmatapro-guess-range (start end)
(save-excursion
(let ((s start) (e end)
(ss (progn (goto-char start) (line-beginning-position)))
(ee (progn (goto-char end) (line-end-position))))
(while (and (> s ss)
(aref pragmatapro-lig-use-table
(min 127 (or (char-before s) 127))))
(setq s (1- s)))
(while (and (< e ee)
(aref pragmatapro-lig-use-table
(min 127 (or (char-after e) 127))))
(setq e (1+ e)))
(cons s e))))
(defun pragmatapro-remove-ligatures (start end)
"Remove ligatures in start-end in the current buffer"
(let ((p (text-property-any start end 'ligature t))
(e nil))
(while p
(setq e (or (next-single-property-change p 'ligature) end))
(remove-list-of-text-properties p e '(ligature display))
(setq p (text-property-any e end 'ligature t)))))
(defun pragmatapro-update-ligatures (start end &optional l)
"Update ligatures in start-end in the current buffer"
(let ((modified (buffer-modified-p))
(inhibit-read-only t)
(case-fold-search nil))
(save-excursion
(let ((z (pragmatapro-guess-range (or start (point))
(or end (point)))))
(goto-char (car z))
(setq end (cdr z)))
(when (<= (point) end)
(pragmatapro-remove-ligatures (point) end))
(while (< (point) end)
(let* ((c (char-after))
(l (and c (aref pragmatapro-lig-table (min 127 c)))))
(forward-char 1)
(when l
(catch 'break
(let ((pt (point)))
(dolist (p (cdr l))
(when (string-prefix-p
(car p)
(buffer-substring-no-properties
pt (min (+ pt (car l)) (1+ (buffer-size)))))
(forward-char (cadr p))
(let ((s (1- pt)) (th (caddr p)))
(put-text-property s (point) 'ligature t)
(dotimes (i (1+ (cadr p)))
(put-text-property (+ s i) (+ s i 1) 'display
(aref th i)))
(throw 'break nil))))))))))
(set-buffer-modified-p modified)))
(define-minor-mode pragmatapro-lig-mode
"Compose pragmatapro's ligatures."
:lighter " PragLig"
(let ((inhibit-modification-hooks t)
(inhibit-read-only t))
(if pragmatapro-lig-mode
(progn ; Turn on
(add-hook 'after-change-functions 'pragmatapro-update-ligatures t t)
(when (> (buffer-size) 0)
(pragmatapro-update-ligatures 1 (buffer-size))))
;; Turn off
(remove-hook 'after-change-functions 'pragmatapro-update-ligatures t)
(when (> (buffer-size) 0)
(pragmatapro-remove-ligatures 1 (buffer-size)))))
pragmatapro-lig-mode)
(defun pragmatapro-lig-mode-on ()
(pragmatapro-lig-mode 1))
(define-globalized-minor-mode pragmatapro-lig-global-mode
pragmatapro-lig-mode
pragmatapro-lig-mode-on)
;; ---
(defvar pragmatapro-icons
(eval-when-compile
(let ((tt (make-hash-table :size 127 :test 'equal)))
(puthash "lisp" "()" tt)
(puthash "lisp interaction" "()\xf41f" tt)
(puthash "scheme" "(λ)" tt)
(puthash "inferior scheme" "(λ)\xf41f" tt)
(puthash "dired" "\xe5fe" tt)
(puthash "html" "\xe736" tt)
(puthash "web" "\xe796" tt)
(puthash "scala" "\xe737" tt)
(puthash "c" "\xe61e" tt)
(puthash "c/*l" "\xe61e" tt)
(puthash "c++" "\xe61d" tt)
(puthash "c++//l" "\xe61d" tt)
(puthash "java//l" "\xe738" tt)
(puthash "java" "\xe738" tt)
(puthash "ruby" "\xe791" tt)
(puthash "inf-ruby" "\xe791\xf41f" tt)
(puthash "rails" "\xe73b" tt)
(puthash "python" "\xe606" tt)
(puthash "inferior python" "\xe606\xf41f" tt)
(puthash "php" "\xe73d" tt)
(puthash "markdown" "\xe73e" tt)
(puthash "css" "\xe749" tt)
(puthash "sass" "\xe74b" tt)
(puthash "javascript" "\xe60c" tt)
(puthash "js" "\xe74e" tt)
(puthash "typescript" "\xe628" tt)
(puthash "jquery" "\xe750" tt)
(puthash "coffee" "\xe751" tt)
(puthash "angularjs" "\xe753" tt)
(puthash "swift" "\xe755" tt)
(puthash "less" "\xe758" tt)
(puthash "clojure" "\xe76a" tt)
(puthash "cidar" "\xe76a" tt)
(puthash "haskell" "\xe777" tt)
(puthash "haskell-cabal" "\xe777 Cabal" tt)
(puthash "interactive-haskell" "\xe777\xf41f" tt)
(puthash "hscompilation" "\xe777\x2611" tt)
(puthash "emacs-lisp" "(\xe779)" tt)
(puthash "prolog" "\xe7a1" tt)
(puthash "fsharp" "\xe7a7" tt)
(puthash "rust" "\xe7a8" tt)
(puthash "d" "\xe7af" tt)
(puthash "erlang" "\xe7b1" tt)
(puthash "lua" "\xe620" tt)
(puthash "dart" "\xe798" tt)
(puthash "dart//l" "\xe798" tt)
(puthash "go" "\xe627" tt)
(puthash "git" "\xe630" tt)
(puthash "comint" "\xf41f" tt)
(puthash "fundamental" "\xf4a5" tt)
(puthash "shell" "\xe7a2" tt)
(puthash "elixir" "\xf499" tt)
(puthash "debugger" "\xf4a0" tt)
tt)))
(defun pragmatapro-get-mode-icon ()
(let ((z (gethash (downcase mode-name) pragmatapro-icons)))
(if z z mode-name)))
(provide 'pragmatapro-lig)